对设置段寄存器感到困惑

Hud*_*den 3 boot x86 assembly bios 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

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

      mov     ax, 0x0000                ; set the stack
      mov     ss, ax
      mov     sp, 0xFFFF
      sti                       ; restore interrupts
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*fin 8

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

就fs和gs而言,它们并没有真正的专用.在没有查看有问题的引导加载程序的代码的情况下,可以开始质疑它们是否被使用.如果它们被使用,它是开放的,以更的问题是什么,他们会被使用.

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

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