assembly - NASM:%include 文件中操作码和操作数的组合无效,报告的行号超出末尾?

标签 assembly nasm x86-16 bootloader

我正在构建一个简单的操作系统,并尝试从引导加载程序在屏幕上获取一些文本。

每当我编译它(nasm -fbin bootloader.asm)时,它都会出现以下错误:

print.asm:23: error: invalid combination of opcode and operands

我不明白出了什么问题,而且 print.asm 甚至没有那么多行,所以不清楚 NASM 不喜欢哪一行。

这是 bootloader.asm:

[org 0x7c00]

mov bp, 0x7c00
mov sp, bp

mov bx, TestString
call PrintString

jmp $

%include "print.asm"

times 510-($-$$) db 0

dw 0xaa55

这是 print.asm:

PrintString:
    push ax
    push bx

    mov ah, 0x0e
    .Loop:
    cmp [bx], byte 0
    je .Exit
        mov al, [bx]
        int 0x10
        int bx
        jmp .Loop
    .Exit:

    pop ax
    pop bx
    ret

TestString:
    db 'Test String',0

最佳答案

nasm -fbin print.asm 显示实际行号,11。

int bx 不是指令。 inc 拼写错误。

我认为 NASM 在 %include 之后的行号可能是自主文件开始以来的整行,这是 NASM 2.15.05 中的一个错误(至少)。在这种情况下,您的文件可以单独组装以查看问题所在,但其他情况则不太容易。该错误已在 NASM 2.16rc0 中修复,并可能向后移植到 2.15.xx。 https://bugzilla.nasm.us/show_bug.cgi?id=3392731

显然这也会影响调试信息行编号。例如用于按源代码行号在 GDB 中设置断点。当然,它总是适用于带有从 disas 输出复制粘贴的地址的 b *0x1234,它不关心调试信息。


yasm -fbin bootloader.asm 获取正确的行编号:print.asm:11: ...具有相同的无效组合消息为 NASM。这是来自 yasm 1.3.0 的。不幸的是,YASM 不再被开发(?),并且没有跟上 AVX-512 等新指令的步伐,但它可用于引导加载程序等内容。

该错误在 NASM 的某些旧版本中也不存在,例如 2014 年的 2.11.05 报告 print.asm:11。当引入此错误时,我没有将其一分为二的版本。

关于assembly - NASM:%include 文件中操作码和操作数的组合无效,报告的行号超出末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67343458/

相关文章:

linux - 在我的代码末尾进行系统调用后出现程序集段错误

assembly - XCHG 在 8086 处理器中是如何实现的?

assembly - 在执行过程中中断指令

linux - 在 ubuntu 上运行汇编代码

assembly - 当您写入标签时,Assembly 是否会创建内存位置?

assembly - 替换 INT 9 ISR 时崩溃,但链接到它时不会崩溃

assembly - IBM 5150 - int 21h 损坏段寄存器

c - 无法理解汇编代码中的基指针计算

assembly - 我可以将返回地址保存在寄存器中并将其推回堆栈中 NASM x86_64 中的 `ret` 之前吗

windows - 如何在 NASM 中减去两个数并得到负数?