gpt4 book ai didi

assembly - 程序调用如何在汇编程序中工作?

转载 作者:行者123 更新时间:2023-12-04 06:00:32 26 4
gpt4 key购买 nike

我刚刚开始修改 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com