【问题标题】:Does writing a value to the BX register have an effect on the ES register?向 BX 寄存器写入值对 ES 寄存器有影响吗?
【发布时间】:2019-08-18 23:45:57
【问题描述】:
[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 也设置了?

【问题讨论】:

    标签: assembly x86 nasm bootloader real-mode


    【解决方案1】:

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


    您正在查看的OS tutorial 有潜在的错误。作者错误地假设 ES 在将控制权转移到引导加载程序之前被 BIOS 设置为零。这不能保证。您需要自己将 ES 显式设置为零。我的Bootloader Tips 涵盖了这个主题:

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

    您正在查看的specific 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
    

    如果您考虑到上面引用的引导加载程序提示,那么引导加载程序的开始应该类似于:

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2013-01-09
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多