2016-08-19 200 views
3

我试图通过一本名为“Reverse Engineering for Beginners”[LINK]的书来了解汇编代码。有一段代码win-32汇编代码我不太明白。在功能序言中,“PUSH 0xFFFFFFFF”是什么意思?

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

第一个PUSH指令做什么?为什么它会将0xFFFFFFFF推向堆栈,但不会再弹回它? 0xFFFFFFFF有什么意义?

在此先感谢。

+2

在这种情况下使用的调用约定有可能使被调用者清理堆栈。 – EOF

+7

[MessageBeep的文档](https://msdn.microsoft.com/en-us/library/windows/desktop/ms680356(v = vs.85).aspx)会告诉你推送的值是什么。可能值得努力阅读它。 – WhozCraig

+0

http://stackoverflow.com/documentation/x86/3261/calling-conventions#t=201608201329248988454 –

回答

12

您正在寻找等价代码

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

汇编代码实际上不包含任何prolongue或结尾,因为该功能不使用堆栈或影响任何保留寄存器,它只需要执行一个函数调用并返回0(最后放入eax)。它可能只接受它不使用的参数,只要它使用cdecl调用约定(调用者负责清理参数)。

MessageBeep,因为几乎所有的Win32 API,使用stdcall calling convention(你会发现它的背后隐藏着的WINAPI宏C声明),这意味着它被调用的函数谁负责清理堆栈从参数。

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

+0

谢谢!我现在明白了:) – Solidak