assembly jmp指令在C和C++中使用后藤时汇编代码中的差异

1qczuiv0  于 2023-01-17  发布在  其他
关注(0)|答案(2)|浏览(176)

我在C和C++中使用相同的代码片段。

#include <stdio.h>

int main() {
    goto myLabel;
    printf("skipped\n");
myLabel:
    printf("after myLabel\n");
    return 0;
}

使用Visual Studio 2022 IDE和编译器。
C++汇编代码

0000000140001000  sub         rsp,28h  
0000000140001004  jmp         0000000140001014  
0000000140001006  jmp         0000000140001014  
0000000140001008  lea         rcx,[0000000140004230h]  
000000014000100F  call        0000000140001090  
0000000140001014  lea         rcx,[0000000140004240h]  
000000014000101B  call        0000000140001090  
0000000140001020  xor         eax,eax  
0000000140001022  add         rsp,28h  
0000000140001026  ret

C的汇编代码

0000000140001000  sub         rsp,28h  
0000000140001004  jmp         0000000140001012  
0000000140001006  lea         rcx,[0000000140006000h]  
000000014000100D  call        0000000140001090  
0000000140001012  lea         rcx,[0000000140006010h]  
0000000140001019  call        0000000140001090  
000000014000101E  xor         eax,eax  
0000000140001020  add         rsp,28h  
0000000140001024  ret

问题是为什么C++汇编代码使用2jmp指令,而C使用1。

kkbh8khc

kkbh8khc1#

在调试版本(msvc错误数据库)中,其设计与此类似,请参见:S2019 (debug, x86) generates two identical JMP instructions for one goto statement

lnxxn5zx

lnxxn5zx2#

C和C++是两种完全不同的编程语言。
不同的编译器被用来编译它们,实际的编译器可能是一个单一的,单片的程序,但是在功能上有两个逻辑上不同的编译器和算法,它们彼此没有任何关系。
不同的编译器会从语法相同的源代码生成不同的编译代码,这并不完全出乎意料。编译代码的差异是由不同的编译器在翻译源代码时所采用的不同算法造成的。这些差异并不具有特殊的、固有的意义。

相关问题