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

时间:2019-03-12 15:52:04

标签: x86 nasm bootloader yasm

我正在制作一个引导程序,但是它会生成一个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字节的输出?

1 个答案:

答案 0 :(得分:1)

您在0x指令的7C00十六进制常量中省略了ORG。 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显示错误版本的文件的第一个字节有一个额外的0字节,然后其余的都是相同的。