【发布时间】:2014-06-22 13:06:55
【问题描述】:
据我了解,当在 C 中的函数调用中传递参数时,被调用者可以在[ebp+8] 找到第一个参数。
通过eax 返回一个值对我有用,从堆栈中读取正确的参数值不起作用。
现在我只是在尝试编写一个汇编函数,它可以从 C 中调用并返回与传递相同的值。
当我运行以下程序时,它会将number: 1 打印到控制台,无论传递给myFunc 的值是什么。我做错了什么?
assembly.s
section .text
global _myFunc
_myFunc:
mov eax, [ebp+8]
ret
main.c
#include <stdio.h>
extern unsigned int myFunc(unsigned int somedata);
int main() {
unsigned int i = myFunc(6);
printf("number: %i\n",i);
return 0;
}
我正在使用 Mac,nasm 来组装代码和 gcc 用于 C 编译。
生成文件
macho32:
nasm -f macho32 assembly.s
gcc -m32 -o macho32 assembly.o main.c
【问题讨论】:
-
有点不合我意,但我认为您必须在汇编函数中使用
push ebp和mov ebp, esp设置ebp,然后才能引用函数参数。然后您需要在返回之前pop ebp。见unixwiz.net/techtips/win32-callconv-asm.html