2013-10-21 84 views
0

原始編碼:額外的步驟以彙編語言

void main() 
{ 
    int x = 1; 
    printf("%d\n", x); 
} 

對應彙編代碼是:

|0x80483f5 <main+17>  mov $0x80484e0,%eax 
    │0x80483fa <main+22>  mov 0x1c(%esp),%edx 
    │0x80483fe <main+26>  mov %edx,0x4(%esp) 
    │0x8048402 <main+30>  mov %eax,(%esp) 
    │0x8048405 <main+33>  call 0x8048300 <[email protected]> 

It first moves the string "%d\n" in %eax   ---->Extra Step 
Then it moves the value of 0x1c(%esp) in %edx  ---->Extra Step 

然後這兩個值被放置在堆棧的頂部爲一個標準的過程調用即打電話給printf()

我的問題是,爲什麼兩個額外的步驟?爲什麼不能直接從內存中獲取這些值,並直接將其保存在堆棧中而不是使用兩個寄存器?

+0

如果在開啓所有優化(假設您還沒有)的情況下進行編譯,程序集是否會大不相同? – NPE

回答

1

x86體系結構沒有mov指令(movs除外,但這與此無關)可以從內存複製到內存,這就是代碼在複製到堆棧時使用寄存器臨時存儲參數的原因。

請注意push可以與一個內存操作數一起使用,但大概已經調整了堆棧指針來爲參數分配空間。