Assembly nasm:错误:二进制输出格式不支持外部引用

Assembly nasm:错误:二进制输出格式不支持外部引用,assembly,x86,nasm,object-files,Assembly,X86,Nasm,Object Files,我正在尝试将程序集文件编译为对象文件。此程序集文件调用c函数。但我遇到了这个错误:二进制输出格式不支持外部引用 我调用汇编文件第17行中的c函数 我尝试使用以下命令编译它: cpu/interrupt.o: cpu/interrupt.asm nasm $< -f bin -o $@ 平面二进制文件没有用于符号表的元数据;对于nasm来说,没有任何地方可以为链接器输入符号名,以填充extern符号的地址 您想创建一个对象文件(.o),可以将其提供给链接器: nasm-fe

我正在尝试将程序集文件编译为对象文件。此程序集文件调用c函数。但我遇到了这个错误:二进制输出格式不支持外部引用

我调用汇编文件第17行中的c函数

我尝试使用以下命令编译它:

cpu/interrupt.o: cpu/interrupt.asm
        nasm $< -f bin -o $@

平面二进制文件没有用于符号表的元数据;对于
nasm
来说,没有任何地方可以为链接器输入符号名,以填充
extern
符号的地址

您想创建一个对象文件(
.o
),可以将其提供给链接器:
nasm-felf32 foo.asm

一个简单的二进制文件实际上就是从asm源代码中汇编出来的字节,比如MBR引导扇区或DOS
.com
可执行文件


如果要将C函数链接到最终的平面二进制文件中,可以将asm部分组装成一个
.o
,然后链接,然后
objcopy
将生成的可执行文件的文本部分链接到平面二进制文件中。

平面二进制文件没有用于符号表的元数据;对于
nasm
来说,没有任何地方可以为链接器输入符号名,以填充
extern
符号的地址

您想创建一个对象文件(
.o
),可以将其提供给链接器:
nasm-felf32 foo.asm

一个简单的二进制文件实际上就是从asm源代码中汇编出来的字节,比如MBR引导扇区或DOS
.com
可执行文件


如果要将C函数链接成最终的平面二进制文件,可以将asm部分组装成一个
.o
,然后链接,然后
objcopy
将生成的可执行文件的文本部分链接成平面二进制文件。

既然要创建
.o
对象文件,为什么要使用
-f bin
?使用
-f elf
或任何适合您格式的方法。您刚刚删除了其他问题。我想你可能已经意识到,
print('X',1)是错误的偏移量。它应该是2而不是1。用于显示的第二个字符,因为文本模式屏幕上的每个单元格为2字节。修复方法是使用
volatile unsigned short*vga=(unsigned short*)0xb8000
vga[offset]=(0x0fPrint('x',1)不是错误的偏移量,因为当我写入时。vga[1]='x'和vga[2]=0x0f它可以工作并打印字母。我删除了我的问题,因为我放弃了。我认为当变量通过函数时,它们的值会改变。既然你试图创建一个
.o
对象文件,为什么要使用
-f bin
?使用
-f elf
或任何适合你格式的东西。你刚刚删除了你的另一个任务我想你可能已经意识到,
print('X',1);
是错误的偏移量。它应该是2而不是1。对于显示的第二个字符,因为文本模式屏幕上的每个单元格都是2字节。修复方法是使用
易失性无符号短*vga=(无符号短*)0xb8000;
vga[offset]=(0x0fPrint('x',1)不是错误的偏移量,因为当我写入时。vga[1]='x'和vga[2]=0x0f它工作并打印字母。我删除了我的问题,因为我放弃了。我认为当变量通过函数时,它们的值会改变。
[extern isr_handler]

; Common ISR code
isr_common_stub:
    ; 1. Save CPU state
    pusha ; Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax
    mov ax, ds ; Lower 16-bits of eax = ds.
    push eax ; save the data segment descriptor
    mov ax, 0x10  ; kernel data segment descriptor
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    ; 2. Call C handler
    call isr_handler

    ; 3. Restore state
    pop eax 
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    popa
    add esp, 8 ; Cleans up the pushed error code and pushed ISR number
    sti
    iret ; pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP

; We don't get information about which interrupt was caller
; when the handler is run, so we will need to have a different handler
; for every interrupt.
; Furthermore, some interrupts push an error code onto the stack but others
; don't, so we will push a dummy error code for those which don't, so that
; we have a consistent stack for all of them.

; First make the ISRs global
global isr0
global isr1
global isr2
global isr3
global isr4
global isr5
global isr6
global isr7
global isr8
global isr9
global isr10
global isr11
global isr12
global isr13
global isr14
global isr15
global isr16
global isr17
global isr18
global isr19
global isr20
global isr21
global isr22
global isr23
global isr24
global isr25
global isr26
global isr27
global isr28
global isr29
global isr30
global isr31