【发布时间】:2011-03-04 00:59:50
【问题描述】:
我知道下一条指令的 ABSOLUTE ADDRESS 位于 50000(十六进制),并且我知道应该在 IP 寄存器中的十六进制值是 4000(十六进制)。我的问题是……为什么会这样?
如果需要,我还有其他可用的注册表值。
有什么想法吗?
【问题讨论】:
-
如果您处于分段内存模式,那么有一个代码段寄存器包含一个偏移量,您必须添加到 IP 以获得下一条指令的绝对地址。
我知道下一条指令的 ABSOLUTE ADDRESS 位于 50000(十六进制),并且我知道应该在 IP 寄存器中的十六进制值是 4000(十六进制)。我的问题是……为什么会这样?
如果需要,我还有其他可用的注册表值。
有什么想法吗?
【问题讨论】:
8086 寻址(由所有后来的 Intel 芯片继承)的奇怪之处在于 segmentation。寄存器都是 16 位的,但可寻址内存是 1 Meg = 2 power 20,即一个地址需要 20 位。
Intel 的天才们决定使用两个寄存器来形成完整地址 - 一个段寄存器(CS、DS、SS、ES)左移 4 位,然后加上 偏移量注册 以形成完整的 20 位地址。
所以IP中的值是与CS(代码段)中值的偏移量。从你所说的CS中的值应该是(0x50000 - 0x4000) >> 4 = 0x4c00。
【讨论】: