在实模式下使用32位寄存器寻址存储器时,寄存器的内容不得超过0000FFFFH。为什么?

时间:2017-07-14 04:35:47

标签: assembly x86 intel real-mode

我在书中发现了这一点"英特尔微处理器" Barry B. Brey这是真的吗?但为什么?我知道在实际的8086微处理器的实模式中,没有32位寄存器。那么现在应该对32位寄存器施加同样的限制吗?

1 个答案:

答案 0 :(得分:5)

我会说寄存器的内容无关紧要;有效地址不得超过0xFFFF:

  • 如果EBP的值为0xFFFFFFF,并且您使用指令mov EBX, [EBP+0x20],则访问地址0x10处的内存。尽管寄存器的值高于0xFFFF,但这应该可以正常工作。

  • 如果EBP的值为0xFFF0,并且您使用相同的指令,则访问0x10010处的内存。尽管寄存器的值低于0xFFFF,但这应该不起作用。

迈克尔·佩奇已经在评论中暗示了原因:

内存段在实模式下确实有段限制!

在实模式下,不需要进行分段限制检查。 286的开发人员可以通过在实模式下关闭段限制检查的方式开发电路。这将使电路更复杂和昂贵。因此,他们决定简单地将段限制初始化为0xFFFF,这会事实上禁用段限制检查,尽管段限制检查已打开。

在386中,英特尔显然没有将此初始化值从0xFFFF更改为0xFFFFFFFF。

在386上,您可以使用"虚幻模式"更改此限制。在Michael Petch评论中提到。但据我所知,没有英特尔的官方文件说这种方法是正式的#34;允许 - 这意味着没有文档说这种方法适用于所有未来的英特尔CPU。

在"虚拟模式"例如386+(此模式用于在保护模式OS处于活动状态时运行实模式程序),限制固定为0xFFFF。