【问题标题】:NASM compiler error while making bootloader制作引导加载程序时出现 NASM 编译器错误
【发布时间】:2018-03-09 20:16:37
【问题描述】:

我正在汇编中制作引导加载程序,在 NASM 中编译我的文件时出现编译器错误。 输出是:

bootloader.asm:1: error: label or instruction expected at start of line
bootloader.asm:16: warning: label alone on a line without a colon might be in error [-w+orphan-labels]
bootloader.asm:23: warning: label alone on a line without a colon might be in error [-w+orphan-labels]

有人可以帮忙吗?这是我的代码:

[BITS 16]
[ORG 0x7C00]

MOV SI, BOOTLOADERSTR
CALL PrintString
JMP $

PrintCharacter:
MOV AH, 0x0E
MOV BH, 0x00
MOV BL, 0x07

INT 0x10
RET

PrintString
next_character:
MOV AL, [SI]
INC SI
OR AL, AL
JZ exit_function
CALL PrintCharacter
exit_function
RET

;DATA
BOOTLOADERSTR db 'it-is-OK Bootloader for OpenKasrix' , 0

TIMES 510 - ($ - $$) db 0
DW 0xAA55

【问题讨论】:

  • 可能您的编辑器(我猜您是在 Windows 上?)正在保存为带有字节顺序标记的 UTF-8。你用的是什么编辑器?您的编辑器可以选择保存纯文本 (ANSI) 而不是 UTF-8

标签: assembly operating-system nasm bootloader


【解决方案1】:

bootloader.asm:1:错误:行首需要标签或指令

我无法用NASM version 2.11.08 重现第一个错误,因此肯定有另一个问题,例如BOM (Byte-Order-Mark)。所以检查第一个字节是否匹配本文中提到的序列 - 如果是,删除它们(使用 Hex-Editor 或 Saving-Options 或...)。那么这个原本无法识别的错误应该会神奇地消失。

接下来的两个错误在标签末尾缺少:

PrintString      ; line 16
exit_function    ; line 23

最后加一个冒号,错误就会消失。所以他们应该看起来像

PrintString:     ; line 16
exit_function:   ; line 23

【讨论】:

  • 好的,谢谢冒号。但我使用的是 2.13.03 版本,第一行的东西一定不能正常工作。我使用的是安装在从 zip 文件中提取的文件夹中的 NASM,但我也有软件版本。也许这会起作用?
  • 如果这两个版本之间的语法有如此大的差异,我会感到惊讶。但我有另一个猜测:你的文件开头是否有Unicode byte-order-markFE FF?您可以使用十六进制编辑器或xxd [file] 命令进行检查。
  • 顺便说一句,我使用的是 Windows,不幸的是,这是一个 UNIX 命令。 +zx485
  • 好的。那没问题。然后使用十六进制编辑器或类似的工具检查文件开头是否有 BOM(字节顺序标记)。这些以产生难以检测的错误而臭名昭著。
  • BINGO: 您的前三个字符与UTF-8[a] 表示匹配。所以你的(假定的)文本文件有一个 BOM,它肯定是由你的编辑器创建的,并且会混淆 NASM 编译器。
猜你喜欢
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
相关资源
最近更新 更多