我正试图通过一本叫做“面向初学者的逆向工程”的书来理解汇编代码。有一段代码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
指令)。当您的代码重新获得控制时,堆栈与您推送参数之前一样。