2016-02-26 97 views
1

我有以下代碼:瞭解裝配返回主

0x401050 <main>:   push %ebp 
0x401051 <main+1>:  mov %esp,%ebp 
0x401053 <main+3>:  sub $0x8,%esp 
0x401056 <main+6>:  and $0xfffffff0,%esp 
0x401059 <main+9>:  mov $0x0,%eax 
0x40105e <main+14>:  mov %eax,0xfffffffc(%ebp) 
0x401061 <main+17>:  mov 0xfffffffc(%ebp),%eax 
0x401064 <main+20>:  call 0x4013a0 <_alloca> 
0x401069 <main+25>:  call 0x401430 <__main> 
0x40106e <main+30>:  mov $0x0,%edx 
0x401073 <main+35>:  add 0x8(%ebp),%edx 
0x401076 <main+38>:  mov %edx,%eax 
0x401078 <main+40>:  leave 
0x401079 <main+41>:  ret 

我想了解什麼值返回從主(註冊eax)。 我真的不明白什麼是存儲在0xfffffffc(%ebp)0然後回到eax的目的:

0x40105e <main+14>:  mov %eax,0xfffffffc(%ebp) 
0x401061 <main+17>:  mov 0xfffffffc(%ebp),%eax 

,什麼是要在0x8(%ebp),那麼什麼將是它添加到eax

0x401073 <main+35>:  add 0x8(%ebp),%edx 

謝謝!

+4

那麼,我們應該問你* *爲什麼你在你的* *代碼所有這些多餘的操作。如果這不是你的代碼,他們必須解釋你是如何獲得它的。這段代碼是從C代碼編譯的嗎?如果是這樣,那麼原始的C代碼是什麼,編譯器優化設置是什麼? – AnT

+0

這段代碼是在測驗中給我的,除了代碼編譯自C –

+0

之外,我什麼也不知道。所問的問題與C沒有關係。這不是反編譯或「解釋代碼」服務。 – Olaf

回答

3

這段代碼已經清楚地被編譯優化關閉,這就是爲什麼你看到奇怪的事情。返回值將是main的第一個參數,即argc。 原來的C代碼可能看起來像:

int main(int argc, char** argv) 
{ 
    size_t size = 0;  // local variable at -4(%ebp) = 0xfffffffc(%ebp) 
    _alloca(size); 
    __main(); 
    return 0 + argc;  // argc at 8(%ebp) 
} 
+0

非常感謝! –

+1

對不起,搞砸了返回值。 – Jester

+0

我剛剛開始處理流感,但是'-4(%ebp)'如何轉化爲_alloca的第一個參數,因爲sub $ 0x8,%esp設置了下面的堆棧指針8,其中_EBP_是。鑑於這顯然是針對Windows的代碼,我想知道調用約定在這裏(在Windows上有多種可用)。所以儘管事實上我認爲你的答案是好的,但我仍然有點難以理解實際的代碼如何工作。 –