assembly - 向 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
。寄存器ES和BX之间有什么关系吗?代码只设置了寄存器BX但注释显示寄存器ES也设置了?
解决方案
TL;DR:设置 BX 寄存器不会影响ES段寄存器。
您正在查看的操作系统教程有潜在的错误。作者错误地假设ES在将控制权转移到引导加载程序之前被 BIOS 设置为零。这不能保证。您需要自己将ES显式设置为零。我的引导加载程序技巧涵盖了这个主题:
- 当 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
引导加载程序教程包含不准确或误导性信息的情况并不少见。
推荐阅读
- python - 交互式 matplotlib 在控制台中有效,但在脚本中无效
- json - Extracting a list of dicts for a Pandas column
- java - 如果测试用例在 testNG 中失败,如何运行类
- unity3d - Stats 和 Frame Debugger 计数中的不同批次数(统计中为 222,调试器中为 55)
- java - 以正则表达式拆分文本文件并创建数组
- tensorflow - TFlite 解释器在为量化模型分配张量时引发 RuntimeError。涉及 scale_diff 和 output_scale 的断言失败
- android - Android 上的 Android 蓝牙交叉传输密钥派生支持
- ios - IOS 以低帧率运行我的 Unity 项目
- powershell - Connect-AzureAD 不适用于 Powershell 核心
- r - 如何将一个数据框列中的 N 个值交换为 N 的任何值和任何 n(行)?