从c调用汇编函数会导致分段错误

时间:2017-08-29 08:56:09

标签: c assembly x86 x86-64

这是我的汇编程序add.s

.globl add

add:
   movl 4(%esp), %eax
   movl 8(%esp), %ebx
   addl %ebx, %eax
   ret

这是我的C程序。我试图从C程序中调用汇编程序。

#include <stdio.h>

int add(int a, int b);

int main() {
   int res = add(5,6);
   printf("%d",res);
   return 0;
}

但是上面的代码给了我一个分段错误。导致此错误的原因是什么?如何解决?

1 个答案:

答案 0 :(得分:4)

假设 cdecl 调用约定,您使用的ffmpeg寄存器应该是 clobbered :它的值必须保存然后恢复被调用者是否会被修改。

调用者假定调用函数不会改变ebx。因此,如果被调用者修改ebx,则必须先将其保存,然后在从函数返回之前将其恢复为原始值。

可以使用寄存器ebxeaxecx,而无需先保存它们然后恢复。因此,我建议您在代码中使用edx替换ebx

edx