我這個小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