将值写入BX寄存器是否会影响ES寄存器?

Hen*_*aye 3 x86 assembly real-mode nasm bootloader

[org 0x7c00]
    mov bp, 0x8000 ; set the stack safely away from us
    mov sp, bp

    mov bx, 0x9000 ; es:bx = 0x0000:0x9000 = 0x09000
Run Code Online (Sandbox Code Playgroud)

正如你可以在注释中看到它说:es:bx = 0x0000:0x9000 = 0x09000。寄存器ESBX之间有什么关系?该代码仅设置寄存器BX,但注释显示寄存器ES也被设置?

Mic*_*tch 6

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


您正在查看的OS教程可能存在错误。作者错误地认为在将控制权转移到引导加载程序之前,BIOS 已将ES设置为零。这不能保证。您需要自己将ES显式设置为零。我的引导程序提示涵盖了以下主题:

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

您正在查看的特定 OS教程代码应该是:

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
Run Code Online (Sandbox Code Playgroud)

如果考虑到上面引用的引导程序提示,则引导程序的启动应类似于:

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
Run Code Online (Sandbox Code Playgroud)

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