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

Aur*_*rus 2 c++ compiler-construction assembly visual-studio-2010

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

test(1);
Run Code Online (Sandbox Code Playgroud)

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

000000013FFF2E76  mov         ecx,1  
000000013FFF2E7B  call        test (13FFF33C0h) 
Run Code Online (Sandbox Code Playgroud)

但为什么不呢:

000000013FFF2E76  push        1  
000000013FFF2E7B  call        test (13FFF33C0h) 
Run Code Online (Sandbox Code Playgroud)

我认为函数参数将是pushed堆栈然后poped在函数中.有人可以解释为什么VS更喜欢顶级的吗?

小智 6

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

在Windows x64上,传入第一个整​​数参数RCX,第二个输入RDX,第三个输入R8和第四个输入R9.在第五和以下是通过堆栈传递.

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

编译器发出写入,ECX因为对32位寄存器的所有写入都会导致64位寄存器的较高部分归零,而32位立即明显短于64位寄存器(任何指令缓存?).

  • @Cicada:它使用`rcx`,`mov ecx,IMM`实际上意味着`RCX [0:31] = IMM; RCX [32:63] = 0`. (2认同)
  • @Aurus:这是因为编译器不关心这里的实际类型,它会检查*value*是否可以表示为32位立即数. (2认同)