UPi*_*nar 2 c c++ assembly visual-studio-2022
我在 C 和 C++ 中使用相同的代码片段。
#include <stdio.h>
int main() {
goto myLabel;
printf("skipped\n");
myLabel:
printf("after myLabel\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
问题是为什么 C++ 汇编代码使用 2 个jmp指令,而 C 使用 1 个指令。
在调试版本(msvc bug 数据库)中的设计是这样的,请参阅: S2019(调试,x86)为一个 goto 语句生成两个相同的 JMP 指令