将值写入 BX 寄存器对 ES 寄存器有影响吗?


[org 0x7c00]
mov bp, 0x8000 ; set the stack safely away from us
mov sp, bp
mov bx, 0x9000 ; es:bx = 0x0000:0x9000 = 0x09000

正如您在评论中看到的那样,它说:es:bx = 0x0000:0x9000 = 0x09000.寄存器ESBX之间有什么关系吗?代码仅设置寄存器BX,但注释显示也设置了寄存器ES

TL;DR:设置 BX 寄存器不会影响ES段寄存器。


您正在查看的操作系统教程存在潜在的错误。作者错误地假定 BIOS 在将控制权移交给引导加载程序之前将ES设置为零。这不能保证。您需要自己显式将ES设置为零。我的引导加载程序提示涵盖了这个主题:

  1. 当 BIOS 跳转到您的代码时,您不能依赖具有有效值或预期值的 CS、DS、ES、SS、SP 寄存器。它们应该在引导加载程序启动时正确设置。只能保证引导加载程序将从物理地址0x00007c00加载和运行,并且引导驱动器号加载到 DL 寄存器中。

您正在查看的特定操作系统教程代码应该是:

xor ax, ax     ; AX=0 (XOR register to itself clears all bits)
mov es, ax     ; ES=0
mov bx, 0x9000 ; ES:BX = 0x0000:0x9000 = 0x09000 . Memory location disk read will read to

如果您考虑上面引用的引导加载程序提示,那么引导加载程序的启动应该如下所示:

mov bp, 0x8000 
xor ax, ax     ; AX=0 (XOR register to itself clears all bits)
mov es, ax     ; ES=0
mov ds, ax     ; DS=0
mov ss, ax     ; SS=0
mov sp, bp     ; SP=0x8000 (SS:SP = stack pointer)
mov bx, 0x9000 ; ES:BX = 0x0000:0x9000 = 0x09000 . Memory location disk read will read to

引导加载程序教程包含不准确或误导性信息的情况并不少见。

最新更新