我试图从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函数编译代码时,它都会给出“未定义对integrate的引用”错误。我还尝试从c中添加到integrate.s文件的链接,如
#include<(file path)/integrate.s>
但是它并没有很好地工作。顺便说一句,汇编代码在做什么并不重要,因为现在我只是试图从c成功地调用函数。有人能帮助我解决这个问题吗?
5条答案
按热度按时间xv8emn3q1#
我发现代码存在以下问题:
edi
的值cmp %edi,1024
正在使用1024
作为地址,可能会出错。您需要cmp $1024,%edi
与立即数进行比较eax
和ecx
,因此执行的计算没有任何效果eax
(它将返回传入的from
的值)即使“汇编代码在做什么并不重要”,前两点也适用。
jslywgbw2#
不确定你是否已经解决了这个问题,但这里是我如何做到这一点。
编译时,请确保添加这两个文件:
$gcc main.c print_msg.s -o main
要单独运行汇编程序文件,请执行以下操作:
$as print_msg.s -o print_msg.o
后跟$ld print_msg.o -e print -o print_msg
。请注意,如果您只想从C文件运行它,则不需要这样做。汇编程序文件:
print_msg.s
然后将C文件:
main.c
c0vxltue3#
x86-64 Linux示例
这里已经有了一个答案,它显示了如何调用
void func(void)
,但这里有一个x86-64 Linux示例,它接受参数并有一个返回值,这就是问题中所问的。(这个问题和其他一些答案使用的是32位代码,它有不同的调用约定)。首先,让我们简化装配函数:
这是使用System V呼叫惯例,其中函式传回值在
rax
中传回,而函式接收的参数则在rdi
、rsi
、rdx
、rcx
、r8
、r9
中传递,然后以相反的顺序传递堆栈。(What are the calling conventions for UNIX & Linux system calls (and user-space functions) on i386 and x86-64)。例如:使用此原型声明的函数将在
%edi
中接收first
,在%rsi
中接收second
,在%dx
中接收third
,在%ecx
中接收fourth
。它将在%rax
中返回它的result
。现在我们已经编写了程序集(尽管该函数主要是一个存根,用于显示如何接受参数并返回值),您可以在C文件中使用该函数,就像您当前所拥有的那样:
它可以被编译并与gcc链接,然后运行,如下所示:
vsdwdz234#
警告:'main'的传回型别不是'int'
表示'main'的传回型别不是'int'...将它变更为
int
,然后:此外,要解决链接器错误,请调用GCC作为
这应该可以。
8tntrjer5#
第一次变更:
main
不能为void,必须返回一个整数(通过错误)。为了使C
能够看到您的integrate
函数,您必须在头文件或C文件中指定它的函数签名,然后您可以执行以下操作:然后,执行:
最后,执行:
然后尝试:
或
注意:头文件应类似于:
并将
#include "integrate.h"
放在C文件的顶部。