簡體   English   中英

在函數序言中,“PUSH 0xFFFFFFFF”是什么意思?

[英]What does `PUSH 0xFFFFFFFF` mean in a function prologue?

我正試圖通過一本名為“初學者的逆向工程” [LINK]的書來理解匯編代碼。 有一段代碼win-32匯編代碼我不太明白。

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

第一個PUSH指令做了什么? 為什么它會向堆棧推送0xFFFFFFFF,但永遠不會再將其彈回? 0xFFFFFFFF有什么意義?

提前致謝。

您正在查看等效代碼

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

匯編代碼實際上不包含任何延長或結尾,因為這個函數不使用堆棧或clobber任何保留的寄存器,它只需執行函數調用並返回0(最后放入eax )。 可能正在接收它不使用的參數,只要它使用cdecl調用約定(調用者負責參數清理)。

MessageBeep ,幾乎所有Win32 API,都使用stdcall調用約定 (你會在隱藏在WINAPI宏后面的C聲明中找到它),這意味着它是被調用函數誰負責從參數中清理堆棧。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM