我知道下一条指令的绝对地址位于 50000(十六进制),并且我知道应该在 IP 寄存器中的十六进制值是 4000(十六进制)。我的问题是......为什么它会这样工作?
如果需要,我还有其他可用的注册表值。
任何的想法?
8086 寻址(由所有后来的英特尔芯片继承)的怪异之处在于分段。寄存器都是 16 位的,但可寻址内存是 1 Meg = 2 power 20,即一个地址需要 20 位。
英特尔的天才们决定使用两个寄存器来形成完整地址——一个向左移动 4 位的段寄存器(CS、DS、SS、ES),然后添加偏移寄存器以形成完整的 20 位地址。
所以 IP 中的值是与 CS(代码段)中的值的偏移量。从您所说的 CS 中的值应该是(0x50000 - 0x4000) >> 4 = 0x4c00
.