我刚刚开始修改 ASM,我不确定我对过程调用的理解是否正确。
说在代码中的某个点有一个过程调用
call dword ptr[123]
并且该过程仅由一个命令 ret 组成:
ret 0004
这个过程调用的效果是什么,返回值将存储在哪里?我在某处读到 2 个字节的返回值将存储在 AX 中,但是当我将过程调用替换为
mov AX, 0004
(连同必要的 NOP)程序崩溃。
最佳答案
在 x86 汇编程序中 ret
的参数指令的意思:RET immediate
Return to calling procedure and pop immediate bytes from the stack.
(引自 Intel® 64 and IA-32 Architectures Software Developer's Manuals Vol 2B )
所以当你输入:
ret 0004
您告诉 CPU 在
call
之后立即返回指令。 , 并从堆栈中弹出 4 个字节。如果您在调用之前将 4 个字节压入堆栈,这很好。push eax
call dword ptr[123]
请注意,这与返回值无关。实际上,Assembly 中的过程无法指定值是返回值。这一切都是按照惯例完成的。我所知道的大多数编译器都会使用
EAX
保存返回值,但这只是因为调用函数会在那里期望结果。所以你的调用代码是:
call dword ptr [123]
mov dword ptr [result], eax
并且您返回值 4 的函数将是:
mov eax, 4
ret
关于assembly - 程序调用如何在汇编程序中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1251060/