从C调用汇编函数时出现问题

从C调用汇编函数时出现问题,c,assembly,C,Assembly,(在64位Windows 7上运行MingW,在Kubuntu上运行GCC) 这可能只是一个MingW问题,但至少有一个Kubuntu安装失败,所以我很怀疑 我有一个简短的C程序,它应该调用汇编函数。我使用nasm编译汇编程序,使用MingW的gcc实现编译c程序。这两者通过makefile-bog-simple链接在一起。然而,链接在外部函数是“未定义引用”的声明上失败了 makefile的相关部分: assign0: ass0.o main.o gcc -v -m32 -g -Wall -

(在64位Windows 7上运行MingW,在Kubuntu上运行GCC)

这可能只是一个MingW问题,但至少有一个Kubuntu安装失败,所以我很怀疑

我有一个简短的C程序,它应该调用汇编函数。我使用nasm编译汇编程序,使用MingW的gcc实现编译c程序。这两者通过makefile-bog-simple链接在一起。然而,链接在外部函数是“未定义引用”的声明上失败了

makefile的相关部分:

assign0: ass0.o main.o 
gcc -v -m32 -g -Wall -o assign0 ass0.o main.o 


    main.o: main.c 
         gcc -g -c -Wall -m32 -o main.o main.c 

    ass0.o: ass0.s
     nasm -g -f elf -w+all -o ass0.o ass0.s
程序集文件的开头:

section .data                       ; data section, read-write
    an:    DD 0                 ; this is a temporary var

section .text                       ; our code is always in the .text section
    global do_str               ; makes the function appear in global scope
    extern printf               

do_str:                             ; functions are defined as labels
[Just Code]
以及c文件的声明:

extern int do_str(char* a);

这在至少一个Kubuntu安装上有效,在另一个安装上失败,在MingW上失败。有人有什么想法吗?

C编译器可能会以不同的方式调用实际的“函数”,例如“dou”str而不是“dou”str。名称损坏不总是发生可能取决于系统(当然也取决于编译器)。尝试调用asm函数_do_str。使用适当的(在gcc中)也可以解决此问题。还有

。。。声称外部函数是“未定义的引用”

哈哈!链接器不会“声称”谎言。你不会通过坚持你是对的或它是错的来说服它改变主意。毫不拖延地接受工具告诉你的真相。这是快速识别问题的关键

几乎每个C编译器,包括您正在使用的编译器,都会生成带有下划线前缀的全局符号,以最小化与汇编语言符号的名称冲突。例如,将代码更改为

extern _printf
...
call  _printf
关于
printf
未定义的错误消息将消失。如果您确实获得了对
\u printf
的未定义引用,那是因为链接器没有访问C运行时库。要获得正确的链接命令可能会很困难。通常这样做不是很有教育意义,所以从一个工作项目中抄袭,或者找一个例子。这就是IDE非常有用的方式

对于调用汇编函数的C代码,使用C的约定编写汇编函数通常是最简单的:

    global  _do_str

_do_str:
或者,您可以声明函数以使用Pascal调用约定:

extern int pascal do_str ( whatever parameters are needed);
...

retval = do_str ("hello world");

Pascal调用约定与C有本质上的不同:它不在符号前加一个前导下划线,调用方负责在返回后删除参数,并且参数的顺序不同,可能有些参数数据类型是在寄存器中传递的,而不是在堆栈中传递的。有关所有详细信息,请参阅编译器参考。

有时,
\u
会在符号名称前加上前缀。您得到的确切错误消息是什么?可能是重复的您是否尝试过在链接器命令行上交换{ass0.o main.o}?@wildplasser,为什么这会有所不同?如果确实存在问题,您希望在汇编端添加
\ucode>,而不是在C端。不可能存在与源代码行相关的“未定义引用”错误-这是链接错误。请将全文复制粘贴到这里。