【问题标题】:Calculating ABSOLUTE ADDRESS / Registry values in Assembler (Intel 8086)在 Assembler (Intel 8086) 中计算 ABSOLUTE ADDRESS / Registry 值
【发布时间】:2011-03-04 00:59:50
【问题描述】:

我知道下一条指令的 ABSOLUTE ADDRESS 位于 50000(十六进制),并且我知道应该在 IP 寄存器中的十六进制值是 4000(十六进制)。我的问题是……为什么会这样?

如果需要,我还有其他可用的注册表值。

有什么想法吗?

【问题讨论】:

  • 如果您处于分段内存模式,那么有一个代码段寄存器包含一个偏移量,您必须添加到 IP 以获得下一条指令的绝对地址。

标签: assembly intel x86-16


【解决方案1】:

8086 寻址(由所有后来的 Intel 芯片继承)的奇怪之处在于 segmentation。寄存器都是 16 位的,但可寻址内存是 1 Meg = 2 power 20,即一个地址需要 20 位。

Intel 的天才们决定使用两个寄存器来形成完整地址 - 一个段寄存器(CS、DS、SS、ES)左移 4 位,然后加上 偏移量注册 以形成完整的 20 位地址。

所以IP中的值是与CS(代码段)中值的偏移量。从你所说的CS中的值应该是(0x50000 - 0x4000) >> 4 = 0x4c00

【讨论】:

  • 非常感谢。我知道有些东西被抵消了,但我不太确定在哪里。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多