我正在尝试通过一本名为“初学者逆向工程”的书来理解汇编代码 [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/