从 c 调用汇编函数

新手上路,请多包涵

我试图从 c 调用一个汇编函数,但我不断收到错误。

     .text
    .globl integrate
    .type integrate, @function
integrate:
    push %ebp
    mov %esp, %ebp
    mov $0,%edi
start_loop:
    cmp %edi,1024
    je loop_exit
    mov 8(%ebp),%eax
    mov 12(%ebp),%ecx
    sub %eax,%ecx
    add %edi,%ecx
    incl %edi
    jmp start_loop
loop_exit:
    movl %ebp, %esp
    popl %ebp
    ret

这是我的汇编函数,文件名为integrate.s。

 #include <stdio.h>

extern int integrate(int from,int to);

void main()
{
    printf("%d",integrate(1,10));
}

这是我的c代码。

 function.c:5:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
/tmp/cciR63og.o: In function `main':
function.c:(.text+0x19): undefined reference to `integrate'
collect2: ld returned 1 exit status

每当我尝试使用 gcc -Wall function.c -o 函数编译我的代码时,它都会给出“未定义的集成引用”错误。我还尝试从 c 添加到 integration.s 文件的链接,例如

#include<(file path)/integrate.s>

但它也没有用。顺便说一句,汇编代码在做什么并不重要,现在我只是想成功地从 c 调用函数。有人能帮我解决这个问题吗?

原文由 Ali U. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 470
1 个回答

我看到代码存在以下问题:

  • 调用约定要求您必须保留 edi 的值
  • cmp %edi,1024 正在使用 1024 作为地址,可能会出错。您想要 cmp $1024,%edi 与立即数进行比较
  • 您正在从每次迭代的参数中重新加载 eaxecx 因此您执行的计算无效
  • 您似乎没有将任何合理的返回值放入 eax (它将返回传递的 from 的值)

即使“汇编代码在做什么并不重要”,前两点也适用。

原文由 Jester 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题