C++ VS2010 编译器不使用“push”进行简单的函数调用

问题描述 投票:0回答:1

我刚刚开始从编译器输出中学习一点汇编程序。

test(1);

这个简单的函数调用创建以下 asm 输出(使用 x64 编译)

000000013FFF2E76  mov         ecx,1  
000000013FFF2E7B  call        test (13FFF33C0h) 

但为什么不是:

000000013FFF2E76  push        1  
000000013FFF2E7B  call        test (13FFF33C0h) 

我认为函数参数将是

pushed
到堆栈,然后
poped
到函数中。谁能解释一下为什么VS更喜欢上面那个?

c++ visual-studio-2010 assembly
1个回答
5
投票

这是因为这是 x64 Windows 上的 ABI。

在 Windows x64 上,第一个整数参数在

RCX
中传递,第二个在
RDX
中传递,第三个在
R8
中传递,第四个在
R9
中传递。 第五个及后续通过堆栈传递。

因为您的函数只有一个参数,所以仅使用

RCX

编译器发出了对

ECX
的写入,因为对 32 位寄存器的所有写入都会导致 64 位寄存器的较高部分清零,并且 32 位立即数明显短于 64 位立即数(指令缓存有人吗?) .

© www.soinside.com 2019 - 2024. All rights reserved.