我这个小C代码函数参数加载到寄存器在x64
void decode(int *xp,int *yp,int *zp)
{
int a,b,c;
a=*yp;
b=*zp;
c=*xp;
*yp=c;
*zp=a;
*xp=b;
}
然后我编译它使用gcc -c -O1 decode.c到目标文件,然后倾倒对象与objdump的-M英特尔-d decode.o与此等价的汇编代码
mov ecx,DWORD PTR [rsi]
mov eax,DWORD PTR [rdx]
mov r8d,DWORD PTR [rdi]
mov DWORD PTR [rsi],r8d
mov DWORD PTR [rdx],ecx
mov DWORD PTR [rdi],eax
ret
而且我注意到,它不使用堆栈在all.But首先值仍然需要加载到寄存器。所以我的问题是如何将参数加载到寄存器中?编译器会自动将参数加载到幕后的寄存器中吗?或其他事情发生?,因为没有将参数加载到寄存器的指令。
而且有点偏离主题。当您为编译原始源代码和机器代码之间的关系而增加优化时,会降低机器代码与源代码的关联度。默认情况下,如果你不指定GCC的优化标志,它不会优化代码。所以我试图在没有任何优化的情况下进行编译以获得源代码的预期结果,但是我得到的是机器代码的4-5倍,与源代码无关并且可以理解。但是当我应用1级优化时,代码看起来是可以理解的并且与源相关。但为什么?
http://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI – EOF 2015-02-05 18:00:56
不要一次提出两个问题。 – 2015-02-05 18:06:23
@EOF是的我知道,前6个int或ptr参数被传递给寄存器。但我不明白如何?我的意思是寄存器不能填满空气中的数据,传递必须转化为一些机器代码,否则我失去了一些可怕的东西? – BsD 2015-02-05 18:06:28