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

标签 assembly x86 call function-calls

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

相关文章:

javascript - 如何在 rails 的文件( xyz.js.erb )中调用 java 脚本函数?

c - 从 C 访问内联汇编器中定义的数组

multithreading - LOCK XCHG和MOV+MFENCE在逻辑和性能上有什么区别?

程序集中的字符串

java - 为什么 JVM 不在 Windows x86 上发出预取指令

assembly - x86 汇编学习平台

linux - 在运行时将代码注入(inject)可执行文件

java - 签名的 Android APK 文件是否可以在 x86 和 ARM-Android 设备上运行?

java - 请帮我调用打印方法

javascript - 从 AngularJS 调用外部函数