关于引导程序的问题

时间:2010-11-09 15:39:03

标签: assembly x86 bootloader floppy

我正在关注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?然后他为什么要将地址复制到所有寄存器? 对不起,如果这是一个愚蠢的问题。我对汇编编程很陌生,刚开始阅读有关引导程序的内容。

2 个答案:

答案 0 :(得分:1)

我认为你可能会混淆两件不同的事情。引导程序位于软盘的开头(我猜你从哪里得到0000),但BIOS在运行它之前将其复制到地址7c00的内存中。

'org'告诉汇编程序代码将从哪里运行,之后被复制。

答案 1 :(得分:0)

Here它说:

  BIOS开发团队决定使用0x7C00   这是因为:

     
      
  1. 他们希望为操作系统留出尽可能多的空间来加载   本身在32KiB内。
  2.   
  3. 8086/8088使用0x0 - 0x3FF作为中断向量和BIOS数据区域   是在它之后。
  4.   
  5. 引导扇区为512字节,引导程序的堆栈/数据区域   需要更多512个字节。
  6.   
  7. 所以,0x7C00,选择了32KiB的最后1024B。
  8.