我会尽力进行x86汇编和C的链接。
我的C程序:
我的C程序:
extern int plus_10(int);
# include <stdio.h>
int main() {
int x = plus_10(40);
printf("%d\n", x);
return 0;
}
我的汇编程序:
[bits 32]
section .text
global plus_10
plus_10:
pop edx
mov eax, 10
add eax, edx
ret
我按以下方式编译和链接两个文件:
gcc -c prog.c -o prog_c.o -m32
nasm -f elf32 prog.asm -o prog_asm.o
gcc prog_c.o prog_asm.o -m32
然而,当我运行生成的文件时,出现了分段错误。
但是,当我将
pop edx
替换为
mov edx, [esp+4]
程序正常工作。有人可以解释一下这是为什么吗?
pop edx
移动堆栈指针,而mov edx, [esp+4]
则不会。通常在 C 语言中,清理堆栈的工作由调用者完成。 - Jabberwockypop edx
实际上是从堆栈中弹出返回地址。当执行ret
时,处理器将跳转到堆栈上的任何地址。 - Jabberwocky