`PUSH 0xFFFFFFFF` 在函数序言中是什么意思?

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

我正在尝试通过一本名为 "Reverse Engineering for Beginners" [LINK] 的书来理解汇编代码。有一段代码win-32汇编代码没看懂

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

第一个 PUSH 指令是做什么的??为什么它将 0xFFFFFFFF 推入堆栈,但再也不会将其弹出? 0xFFFFFFFF有什么意义?

提前致谢。

您正在查看

的等效代码
int main() {
    MessageBeep(0xffffffff);
    return 0;
} 

汇编代码实际上不包含任何序言或结语,因为此函数不使用堆栈或破坏任何保留的寄存器,它只需要执行一个函数调用和 return 0 (最后放在 eax 中)。它 可能 正在接收它不使用的参数,只要它使用 cdecl 调用约定(调用者负责参数清理)。

MessageBeep, as almost all Win32 APIs, uses the stdcall calling convention(您会在隐藏在 WINAPI 宏后面的 C 声明中找到它),这意味着被调用函数负责从参数。

您的代码将 0xFFFFFFFF 作为唯一参数推送给 MessageBeep,并调用它。 MessageBeep 做他的事情,最后确保在 returning 之前它的所有参数都从堆栈中弹出(实际上,ret 指令有一种特殊形式)。当您的代码重新获得控制权时,堆栈与您推送参数之前一样。