0

我正在阅读brokenthorn.com 的O/S 开发教程的教程之一,下面的代码就在那里。

http://www.brokenthorn.com/Resources/OSDev3.html

我不明白为什么这段代码会清除 510 个字节。org、bits、cli、hlt 也在代码中。不应该改成小于510字节吗?会不会是错字什么的?

谢谢。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;*********************************************
;   Boot1.asm
;       - A Simple Bootloader
;
;   Operating Systems Development Tutorial
;*********************************************
org 0x7c00  ; We are loaded by BIOS at 0x7C00

bits    16      ; We are still in 16 bit Real Mode

Start:

    cli ; Clear all Interrupts

    hlt ; halt the system

times 510 - ($-$$) db 0 ; We have to be 512 bytes. Clear the rest of the bytes with 0

dw 0xAA55   ; Boot Signiture
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4

2 回答 2

1

它不是清除 510 字节,而是清除510 - ($-$$)字节。由于$是当前位置,并且$$是该部分的开始,因此它正在清除510 - (length of the section up to that point)字节。

这将从 512 字节限制中正确填充块最多两个字节,并将签名放在最后两个字节上。

于 2011-04-16T13:03:31.577 回答
0

引导扇区长 512 字节,通过最后两个字节开始设置为 0xAA55 来标识。这为加载器的实际代码留下了 510 个字节,这正是提供的示例在组装时填充的内容。如果生成的二进制文件的长度不是 512 字节,那么您可能需要指定纯二进制输出格式,尽管在 nasm 的情况下这是默认设置。

实际上,分区表等需要存在其他魔术字节,并且通常第一阶段加载器仅用于读入和执行更多代码。

于 2011-04-16T13:04:39.850 回答