2017-07-14 63 views
1

我在Barry B. Brey的书“THE INTEL MICROPROCESSORS”中找到了它。这是真的吗?但为什么?我知道在实际的8086微处理器的实模式下,没有32位寄存器。那么现在应该对32位寄存器施加相同的限制吗?在实模式下使用32位寄存器寻址存储器时,寄存器的内容不得超过0000FFFFH。为什么?

+1

什么是实模式?你知道吗? – Marichyasana

+3

在32位处理器(386+)上,您可以在实模式下使用32位寄存器和32位寻址。如果您处于[虚幻模式](https://en.wikipedia.org/wiki/Unreal_mode),地址可以高于0xFFFF。在传统的实模式中,您被限制为0xFFFF的限制。 –

+0

这已经是这本书中第二个误导性的东西,它实际上有什么好处? – harold

回答

5

我会说注册表的内容是不相关的;有效地址不得超过0xFFFF的:

  • 如果EBP具有价值0xFFFFFFF0并使用指令mov EBX, [EBP+0x20]你在地址0x10的访问内存。尽管寄存器值高于0xFFFF,这应该可以完美工作。

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

迈克尔·佩赫已经给了暗示在他的评论的原因:

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

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

在386英特尔显然没有改变这个初始化值从0xFFFF到0xFFFFFFFF。

在386上,您可以使用Michael Petch'es评论中提到的“虚幻模式”来更改此限制。但据我所知,没有任何英特尔的官方文件表示这种方法是“正式”允许的 - 这意味着没有文件说这种方法可以与所有未来的英特尔CPU配合使用。

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

相关问题