assembly - 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
解决方案
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 之间的版本。
推荐阅读
- python - AttributeError:'function'对象没有属性'strip'
- haskell - 如何在 Xmonad 启动时设置位置和大小
- arrays - 数组在数组 [7] 末尾给出随机数
- python - AttributeError:“NoneType”对象没有属性“字符串”无法解决此问题
- c++ - 错误 LNK2038:检测到“_ITERATOR_DEBUG_LEVEL”不匹配:值“2”与 XX.obj 中的值“0”不匹配
- c++ - 使用“-I”定义g++包含路径:为什么它只在我设置“.../include”而不是“.../include/boost”时才有效?
- c# - 使用 WPF 控件中的依赖属性和另一个属性进行 2 向绑定时遇到问题
- python - 我有正确打印字符串的问题
- python - 安装opencv-python-headless时没有实现cv2.destroyAllWindows()
- c - 非常简单的多数组c程序 - 问题noob