对设置段寄存器感到困惑

时间:2012-05-07 17:42:52

标签: assembly x86 boot bootloader bios

我正在编写一个启动加载程序,我正在遵循的教程提供了这段代码:

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

 ;----------------------------------------------------
 ; create stack
 ;----------------------------------------------------

      mov     ax, 0x0000                ; set the stack
      mov     ss, ax
      mov     sp, 0xFFFF
      sti                       ; restore interrupts

我可能误解了一些东西但是如果SS寄存器包含0x0000则不意味着ds,es,fs和gs会重叠堆栈吗?还有fs和gs寄存器的功能是什么?此外,BIOS是否自动设置了cs段?因为它表示代码位于0000:7c00。此外,本教程永远不会解释为什么禁用中断。我在某处读到通常禁用中断以避免死锁。这是什么意思,为什么会发生?

1 个答案:

答案 0 :(得分:8)

至少在理论上,是的,堆栈和代码可能会重叠。它们之所以不那么简单:引导加载程序非常小,并且通常不会占用很多堆栈空间,因此堆栈永远不会向下扩展到足以覆盖引导加载程序代码的末尾。

就fs和gs而言,它们并没有任何专用。在没有查看有问题的引导加载程序的代码的情况下,可以开始质疑它们是否被使用。如果使用它们,那么还有更多的问题是用于

磁盘BIOS将磁盘中的扇区加载到07c00:0000h,然后远程跳转到它。远跳设置cs

在设置堆栈时禁用中断,因为执行中断(尝试)将数据推送到堆栈。如果你还没有设置堆栈(SS和SP),你通常甚至不知道内存中数据(标志和返回地址)可能结束的位置,或者它可能覆盖的其他数据。这通常是不合需要的,因此至少在SS和SP都设置之前禁用中断。