【问题标题】:Assembly: Using the Data Segment Register (DS)汇编:使用数据段寄存器 (DS)
【发布时间】:2011-06-21 16:38:48
【问题描述】:

目前我正在学习 x86 汇编以获得乐趣,我喜欢微控制器编程,所以我熟悉汇编。

目前我一直在寻找这个问题的答案,但似乎找不到...... DS寄存器,我知道它应该指向我程序中的全局数据,但我不知道它是如何工作的。我正在使用 NASM,在大多数简单的程序中我看到以下内容:

[组织 0x7C00] [位 16] 主要的: mov 斧头, 0x0000 mov ds, ax 移动,[味精] 移动啊,0x0E mov bx, 0x0007 整数 0x10 跳转 $ 味精数据库'X' 乘以 510-($-$$) 分贝 0 dw 0xAA55

而且效果很好(即使我省略了粗体代码),但是如何? CPU 会自动加载从 0x0000 开始的全局变量吗?还是我缺少一些内在的东西?

【问题讨论】:

标签: assembly x86 cpu-registers segment


【解决方案1】:

电脑在实模式下(BIOS执行bootloader时CPU所处的模式),CPU计算地址的方法很简单:将段寄存器值乘以16(移位4位到左),然后添加偏移量。

例如,在像“mov ax, [0x1234]”这样的指令中,CPU 将使用“DS * 0x10 + 0x1234”作为有效地址(在您的情况下,第一项解析为零。)当你有一个像“ mov ax, [BP+0x32]" 那么 CPU 将使用 "SS * 0x10 + BP + 0x32"。请注意,现在 CPU 使用了不同的段寄存器(堆栈段),这是因为当使用 BP 寄存器时,CPU 假定您默认不访问堆栈(但您可以使用 [DS :BP + 0x32])。

更多或更少我解释的内容,更多内容可以在 http://wiki.osdev.org/Real_Modehttp://www.internals.com/articles/protmode/realmode.htm 以及更多地方找到。

顺便说一句,“msg”应该或多或少位于 0x7C11 地址。

【讨论】:

  • 谢谢!这完美地回答了我的问题^_^。
猜你喜欢
  • 2020-01-30
  • 2016-11-11
  • 2017-02-09
  • 2021-03-25
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
相关资源
最近更新 更多