c - 函数序言中的 `PUSH 0xFFFFFFFF` 是什么意思?

标签 c assembly x86 reverse-engineering

我正在尝试通过一本名为“初学者逆向工程”的书来理解汇编代码 [LINK] .有一段代码win-32汇编代码没看懂。

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

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

提前致谢。

最佳答案

您正在查看的等效代码

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

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

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

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

关于c - 函数序言中的 `PUSH 0xFFFFFFFF` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39034557/

相关文章:

c - 从函数重绘GTK

c++ - 试图导出一个函数并调用它

c - 这段 C 代码中有什么错误,为什么?

assembly - 从 64 位 asm 调用 Printf 时如何传递参数?

assembly - 在汇编中将字符串写入文件 100 次

x86 - AVX2编译的程序是否仍然可以使用支持AVX-512的CPU的32个寄存器?

c# - 检测cpu架构的正确方法?

c - autotools:执行 “make check” 时不包含库

c - 为什么当我使用 64 位局部变量时堆栈指针没有减少?

x86 - AVX2 移位(16 位)整数