我正试图通过一本叫做“面向初学者的逆向工程”的书来理解汇编代码。有一段代码win-32汇编代码我不太明白。

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

第一条指令是做什么的??为什么它将0xffffff推到堆栈上,但再也不会弹出它?0xFFFFFF的意义是什么?
提前谢谢。

最佳答案

您正在查看的等效代码

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

程序集代码实际上不包含任何延长或结束语,因为此函数不使用堆栈或清除任何保留的寄存器,它只需执行函数调用并返回0(最后放入eax)。只要使用cdecl调用约定(调用方负责参数清理),它就可能接收不使用的参数。
MessageBeep和几乎所有的win32api一样,使用stdcall calling convention(您可以在隐藏在WINAPI宏后面的c声明中找到它),这意味着负责从参数中清理堆栈的是被调用函数。
您的代码将0xFFFFFFFF作为MessageBeep的唯一参数推送并调用它。MessageBeep执行他的操作,最后确保在返回之前从堆栈中弹出它的所有参数(实际上,有一种特殊形式的ret指令)。当您的代码重新获得控制时,堆栈与您推送参数之前一样。

10-06 13:49