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

Pre*_*rko 1 x86 assembly intel real-mode

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

Mar*_*nau 5

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

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

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

Michael Pech在评论中已经暗示了这个原因:

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

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

在386中,Intel显然没有将此初始化值从0xFFFF更改为0xFFFFFFFF.

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

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