2016-08-19 57 views
3

我試圖通過一本名爲「Reverse Engineering for Beginners」[LINK]的書來了解彙編代碼。有一段代碼win-32彙編代碼我不太明白。在功能序言中,「PUSH 0xFFFFFFFF」是什麼意思?

main: 
    push 0xFFFFFFFF 
    call MessageBeep 
    xor eax,eax 
    retn 

第一個PUSH指令做什麼?爲什麼它會將0xFFFFFFFF推向堆棧,但不會再彈回它? 0xFFFFFFFF有什麼意義?

在此先感謝。

+2

在這種情況下使用的調用約定有可能使被調用者清理堆棧。 – EOF

+7

[MessageBeep的文檔](https://msdn.microsoft.com/en-us/library/windows/desktop/ms680356(v = vs.85).aspx)會告訴你推送的值是什麼。可能值得努力閱讀它。 – WhozCraig

+0

http://stackoverflow.com/documentation/x86/3261/calling-conventions#t=201608201329248988454 –

回答

12

您正在尋找等價代碼

int main() { 
    MessageBeep(0xffffffff); 
    return 0; 
} 

彙編代碼實際上不包含任何prolongue或結尾,因爲該功能不使用堆棧或影響任何保留寄存器,它只需要執行一個函數調用並返回0(最後放入eax)。它可能只接受它不使用的參數,只要它使用cdecl調用約定(調用者負責清理參數)。

MessageBeep,因爲幾乎所有的Win32 API,使用stdcall calling convention(你會發現它的背後隱藏着的WINAPI宏C聲明),這意味着它被調用的函數誰負責清理堆棧從參數。

您的代碼將0xFFFFFFFF作爲MessageBeep的唯一參數,並調用它。 MessageBeep做了他的事情,並最終確保所有參數在返回之前從堆棧中彈出(實際上,這有一個特殊形式的ret指令)。當您的代碼重新獲得控制權時,堆棧就像您之前推送參數一樣。

+0

謝謝!我現在明白了:) – Solidak