3

我正在编写一个引导加载程序,我正在关注的教程提供了以下代码:

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 寄存器的功能是什么?另外,cs段是由BIOS自动设置的吗?因为它说代码位于 0000:7c00。此外,本教程从不讨论为什么禁用中断。我在某处读到通常禁用中断以避免死锁。这是什么意思,为什么会发生?

4

1 回答 1

8

至少在理论上,是的,堆栈和代码可以重叠。他们不这样做的原因很简单:引导加载程序非常小,通常不会使用太多堆栈空间,因此堆栈永远不会向下增长到足以覆盖引导加载程序代码的末尾。

就 fs 和 gs 而言,它们实际上并没有任何专门的用途。如果不查看相关引导加载程序的代码,则可以质疑它们是否被使用。如果它们被使用,那么它们的用途还有更多疑问

磁盘 BIOS 将磁盘中的一个扇区加载到 07c00:0000h 中,并进行远跳转。远跳台cs

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

于 2012-05-07T18:22:02.873 回答