2

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

test(1);

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

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

但为什么不是:

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

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

4

1 回答 1

6

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

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

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

编译器发出了一个写入,ECX因为所有对 32 位寄存器的写入都会导致 64 位寄存器的较高部分归零,并且 32 位立即数明显短于 64 位立即数(指令缓存有人吗?)。

于 2012-05-28T13:54:50.757 回答