我正在关注brokenthorn operating development series以研究引导加载程序。在this page中,这些是三行代码:
bits 16 ; We are still in 16 bit Real Mode
org 0x7c00 ; We are loaded by BIOS at 0x7C00
start: jmp loader ; jump over OEM block
在第二行中,他将软盘加载到7c00。为什么不在0000?我查看了Where to store the bootloader on a floppy image?。 这也是同样的事情。但原因还没有解释。请问有人向我解释一下吗?提前谢谢。
编辑:我感到困惑,因为在后面教程的同一站点中,代码是:bits 16 ; we are in 16 bit real mode
org 0 ; we will set regisers later
start: jmp main ; jump to start of bootloader
然后在主
main:
;----------------------------------------------------
; code located at 0000:7C00, adjust segment registers
;----------------------------------------------------
cli ; disable interrupts
mov ax, 0x07C0 ; setup registers to point to our segment
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
现在为什么他使用org 0?然后他为什么要将地址复制到所有寄存器? 对不起,如果这是一个愚蠢的问题。我对汇编编程很陌生,刚开始阅读有关引导程序的内容。
答案 0 :(得分:1)
我认为你可能会混淆两件不同的事情。引导程序位于软盘的开头(我猜你从哪里得到0000),但BIOS在运行它之前将其复制到地址7c00的内存中。
'org'告诉汇编程序代码将从哪里运行,在之后被复制。
答案 1 :(得分:0)
Here它说:
BIOS开发团队决定使用0x7C00 这是因为:
- 他们希望为操作系统留出尽可能多的空间来加载 本身在32KiB内。
- 8086/8088使用0x0 - 0x3FF作为中断向量和BIOS数据区域 是在它之后。
- 引导扇区为512字节,引导程序的堆栈/数据区域 需要更多512个字节。
- 所以,0x7C00,选择了32KiB的最后1024B。
醇>