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

时间:2016-08-19 08:34:13

标签: c assembly x86 reverse-engineering

我试图通过一本名为"反向工程初学者的书来理解汇编代码" [LINK]。有一段代码win-32汇编代码,我不太明白。

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

第一个PUSH指令做了什么?为什么它会向堆栈推送0xFFFFFFFF,但永远不会再将其弹回? 0xFFFFFFFF有什么意义?

提前致谢。

1 个答案:

答案 0 :(得分:12)

您正在查看

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

汇编代码实际上不包含任何延长或结尾,因为此函数不使用堆栈或clobber任何保留的寄存器,它只需要执行函数调用并返回0(放入{最后{1}}。只要它使用cdecl调用约定(调用者负责参数清理),可能接收它不使用的参数。

MessageBeep,几乎所有Win32 API都使用stdcall calling convention(你会在隐藏在eax宏后面的C声明中找到它),这意味着它是被调用的函数谁负责从参数中清理堆栈。

您的代码将WINAPI作为0xFFFFFFFF的唯一参数,并将其调用。 MessageBeep执行他的操作,最后确保在返回之前从堆栈中弹出所有参数(实际上,有MessageBeep指令的特殊形式)。当你的代码重新获得控制权时,堆栈就像你推动参数一样。