我有以下代码(caller.c):如何获得参数在被调用的整数?
#include <stdio.h>
extern int callee(int);
int main(int argc, char *argv[]){
callee(4);
return 1;
}
和(callee.s):
.globl callee
callee:
pop %eax
add $4, %eax
ret
我与编译: GCC -m32 caller.c callee.s
并运行:
./a.out
区隔(核心转储)
我想知道我的错误是什么,因为我相信主现在应该推送一个32位的堆栈号。我没有改变堆栈,所以被调用者现在应该能够从同一个堆栈中弹出该号码。也许我应该在pop之前添加(添加$ 4,%esp)(如果被调用者的地址处于“方式”/实际被弹出的状态)。我也尝试过,但没有成功。被叫方现在应该从堆栈中获取数字并添加4。 eax寄存器应该是从被调用者到调用者的返回值(调用约定)的地方,但是在这里我忽略了返回值。
有人能帮助我吗?
相关的问题: calling assembly function from c
调用约定: https://en.wikipedia.org/wiki/X86_calling_conventions
这会失败,因为您的'pop%eax'接受_CALL_指令推送的返回地址并放入_EAX_中。删除'pop%eax'并简单地通过'mov 4(%esp),%eax'访问第一个参数。执行转移到函数(32位代码)后,返回地址为0(ESP),第一个参数为4(ESP),第二个参数为8(ESP)等。 –
要从函数返回int,将其加载到'eax'中(然而,请检查您的平台/编译器的具体情况)。 –