来自c的汇编函数调用

时间:2014-08-18 03:37:39

标签: c assembly

我无法合并我的kernel_entry.asm和main.c.我的main.c调用asm函数Sum。 nasm和gcc都编译各自的文件。但是,链接器会出错。

Kernel_entry.asm:

[bits 32]
[extern _start]
[global _Sum]

....

_Sum:
    push    ebp             
    mov     ebp, esp
    mov     eax, [ebp+8]    
    mov     ecx, [ebp+12]   
    add     eax, ecx        
    pop     ebp             
    ret 

main.c中:

....
extern int Sum();

void start() {
    ....
    int x = Sum(4, 5);
    ....
}

要编译源文件,我使用以下命令:

nasm kernel_entry.asm -f win32 -o kernel_entry.o
gcc -ffreestanding -c main.c -o main.o
....
ld -T NUL -o kernel.tmp -Ttext 0x1000 kernel_entry.o main.o mem.o port_in_out.o screen.o idt.o

链接器提供以下错误:main.o:main.c:(.text+0xa82): undifened reference to 'Sum'。我尝试了一切,但找不到任何解决方案。当我从main.c中删除asm函数调用时,它可以工作。

1 个答案:

答案 0 :(得分:2)

TL;答案的DR版本是混合nasm的-f win32生成一个与Windows上的GNU工具链不兼容的目标文件 - 如果要使用链接,则需要使用-f elf ld。 NASM的文档here在7.5和7.9节中对此进行了描述。

对我的暗示是通过运行生成nm kernel_entry.o

00000000 a .absolut
00000000 t .text
00000001 a @feat.00
         U _start
         U _Sum

其中基本上将Sum显示为未定义的符号。编译为ELF后,我得到了:

         U _start
00000000 T _Sum

将Sum指示为文本部分中的已识别符号。