NASM: %include 文件中操作码和操作数的组合无效,报告的行号已超过末尾?
NASM: invalid combination of opcode and operands in a %include file, reported line number is past the end?
我正在构建一个简单的 OS 并试图从引导加载程序在屏幕上获取一些文本。
每当我编译它(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 中的错误(在至少)。在这种情况下,您的文件可以 assemble 单独查看有什么问题,但其他情况就没那么容易了。该错误已在 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
。当引入此错误时,我没有将其一分为二的版本。
我正在构建一个简单的 OS 并试图从引导加载程序在屏幕上获取一些文本。
每当我编译它(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 中的错误(在至少)。在这种情况下,您的文件可以 assemble 单独查看有什么问题,但其他情况就没那么容易了。该错误已在 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
。当引入此错误时,我没有将其一分为二的版本。