【问题标题】:Question about the bootloader关于引导加载程序的问题
【发布时间】:2011-05-07 08:02:51
【问题描述】:

我正在关注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 处的 bios。为什么不在 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中

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?那么他为什么将地址复制到所有寄存器中? 对不起,如果这是一个愚蠢的问题。我对汇编编程非常陌生,刚刚开始阅读有关引导加载程序的信息。

【问题讨论】:

    标签: assembly x86 bootloader floppy


    【解决方案1】:

    我认为您可能将两种不同的事物混为一谈。引导加载程序位于软盘的开头(我猜你从那里得到 0000),但 BIOS 在运行之前将其复制到地址 7c00 的内存中。

    'org' 告诉汇编器代码将从那里运行,它被复制之后。

    【讨论】:

    • 澄清一下:它是从软盘的第0扇区复制到内存地址0x7C00。
    【解决方案2】:

    Here 它说:

    BIOS 开发团队决定 0x7C00 因为:

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

    【讨论】:

    • 顺便说一句,从您的措辞中并不清楚您是否理解:BIOS 将引导加载程序复制到内存中的地址 0x7C00。
    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 2013-08-14
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2017-01-07
    相关资源
    最近更新 更多