我刚刚开始从编译器输出中学习一点汇编程序。
test(1);
这个简单的函数调用创建以下 asm 输出(使用 x64 编译)
000000013FFF2E76 mov ecx,1
000000013FFF2E7B call test (13FFF33C0h)
但为什么不是:
000000013FFF2E76 push 1
000000013FFF2E7B call test (13FFF33C0h)
我认为函数参数将是
pushed
到堆栈,然后 poped
到函数中。谁能解释一下为什么VS更喜欢上面那个?
这是因为这是 x64 Windows 上的 ABI。
在 Windows x64 上,第一个整数参数在
RCX
中传递,第二个在 RDX
中传递,第三个在 R8
中传递,第四个在 R9
中传递。 第五个及后续通过堆栈传递。
因为您的函数只有一个参数,所以仅使用
RCX
。
编译器发出了对
ECX
的写入,因为对 32 位寄存器的所有写入都会导致 64 位寄存器的较高部分清零,并且 32 位立即数明显短于 64 位立即数(指令缓存有人吗?) .