首页 > 解决方案 > NASM:%include 文件中操作码和操作数的组合无效,报告的行号超出了末尾?

问题描述

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

每当我编译它(nasm -fbin bootloader.asm)时,它都会给出这个错误:

print.asm:23:错误:操作码和操作数的组合无效

我不明白出了什么问题,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

标签: assemblynasmx86-16bootloader

解决方案


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

int bx不是指令。错字inc

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

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


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

该错误也不存在于一些旧版本的 NASM 中,例如 2014 年报告中的 2.11.05 print.asm:11。引入此错误时,我没有在 bisect 之间的版本。


推荐阅读