本文介绍了NASM:%Include文件中操作码和操作数的组合无效,报告的行号是否已超过末尾?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

我不明白出了什么问题,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.05print.asm:11。我没有在引入这个错误时踢来踢去将其一分为二的版本。

这篇关于NASM:%Include文件中操作码和操作数的组合无效,报告的行号是否已超过末尾?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-24 22:40