2013-11-28 88 views
0

我有兩個不同的二進制文件以及他們main功能反彙編,像這樣開頭:x86彙編棧佈局混亂

80483d4: 55      push %ebp 
80483d5: 89 e5     mov %esp,%ebp 
80483d7: 83 e4 f0    and $0xfffffff0,%esp 
80483da: 83 ec 20    sub $0x20,%esp 
80483dd: 8d 45 08    lea 0x8(%ebp),%eax 
80483e0: 89 44 24 1c    mov %eax,0x1c(%esp) 

而另外一個是這樣的:

80483d4: 8d 4c 24 04    lea 0x4(%esp),%ecx    
80483d8: 83 e4 f0    and $0xfffffff0,%esp   
80483db: ff 71 fc    pushl -0x4(%ecx)     
80483de: 55      push %ebp      
80483df: 89 e5     mov %esp,%ebp  
... 
80483e6: 89 4d f0    mov %ecx,-0x10(%ebp) 

第一個是下編譯GNU/Linux 2.6.24,第二個是在GNU/Linux 2.6.9下編譯的。大部分時間,我理解爲0x4(%esp)作爲返回地址,0x8(%esp)作爲第一個參數。顯然,第一個二進制使用0x8(%ebp) - 它與0x8(%esp)在對齊發生之前相同 - 作爲第一個參數,而第二個二進制使用0x4(%esp)作爲第一個參數,它讓我感到困惑,爲什麼它做到了。這是因爲它們是在不同版本的GNU/Linux下編譯的?

回答

0

看來,這兩個引用第一個參數。第一個例子中的8(%ebp)與第二個例子中的4(%esp)之間的位移差異的原因在於一個發生在保存ebp之前,另一個發生在之後。

爲了使它完全清楚:

movl 4(%esp), %eax # here, the first argument is at esp + 4 
push %ebp   # push has the effect of esp -= 4 
movl %esp, %ebp 
movl 8(%ebp), %eax # here, the first argument is at esp + 8 (or equivalently, ebp + 8) 

感興趣的另外一點是,對準堆棧指針做是一個二進制保存到ebp之前,並將其保存在另一個之後。對我來說這似乎很奇怪 - 我只能假設在後一種情況下,esp的舊值在ecx之前的主返回前的某個時間點被重新計算。

+0

等待...我仍然失去了x(所以如何來esp + 4指出第一個參數,然後.....啊ebp被推了!!!!!!我明白了,我不知道爲什麼我錯過了這一點!我有多愚蠢 – REALFREE