编译的引导加载程序的大小错误

Wrong size of compiled bootloader

我正在制作一个引导加载程序,但它生成了一个 513 字节的输出文件,而它应该是 512 位。这里是boot.asm

[ORG 7C00]
[BITS 16]
mov eax,cr0
or eax,1
mov cr0,eax
[BITS 32]
mov ax,10h
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
INT 0x10
jmp 0x8000
TIMES 510 - ($ - $$) DB 0
DW 0xAA55

如何获得 512 字节的输出?

您在 ORG 指令中遗漏了 7C00 十六进制常量中的 0x 。 NASM 将此视为错误。

您可能使用 YASM 组装了它,它不会拒绝您的源代码,而是生成一个 513 字节的文件。修复源代码会使 YASM 和 NASM 生成一个 512 字节的文件。 这可能是 YASM 中的错误。不幸的是,YASM 最近没有得到很好的维护,所以即使它有来自 align 指令的更好的长 NOP(不会用多行单字节 NOP 进行反汇编),你应该切换到 NASM .

$ yasm boot-buggy.asm && ll boot-buggy
-rw-r--r-- 1 peter peter 513 Mar 13 06:03 boot-buggy
$ nasm boot-buggy.asm && ll boot-buggy
boot-buggy.asm:1: error: expression syntax error
boot-buggy.asm:1: error: No or invalid offset specified in ORG directive.
$ nasm boot-fixed.asm && ll boot-fixed
-rw-r--r-- 1 peter peter 512 Mar 13 06:04 boot-fixed
$ yasm boot-fixed.asm && ll boot-fixed
-rw-r--r-- 1 peter peter 512 Mar 13 06:04 boot-fixed

cmp -l boot-fixed boot-buggy说明有bug的版本多了一个0字节作为文件的第一个字节,那么其他都是一样的。