我试图通过一本名为"反向工程初学者的书来理解汇编代码" [LINK]。有一段代码win-32汇编代码,我不太明白。
main:
push 0xFFFFFFFF
call MessageBeep
xor eax,eax
retn
第一个PUSH
指令做了什么?为什么它会向堆栈推送0xFFFFFFFF,但永远不会再将其弹回? 0xFFFFFFFF有什么意义?
提前致谢。
答案 0 :(得分:12)
您正在查看
的等效代码int main() {
MessageBeep(0xffffffff);
return 0;
}
汇编代码实际上不包含任何延长或结尾,因为此函数不使用堆栈或clobber任何保留的寄存器,它只需要执行函数调用并返回0(放入{最后{1}}。只要它使用cdecl调用约定(调用者负责参数清理),可能接收它不使用的参数。
MessageBeep
,几乎所有Win32 API都使用stdcall calling convention(你会在隐藏在eax
宏后面的C声明中找到它),这意味着它是被调用的函数谁负责从参数中清理堆栈。
您的代码将WINAPI
作为0xFFFFFFFF
的唯一参数,并将其调用。 MessageBeep
执行他的操作,最后确保在返回之前从堆栈中弹出所有参数(实际上,有MessageBeep
指令的特殊形式)。当你的代码重新获得控制权时,堆栈就像你推动参数一样。