繁体   English   中英

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

[英]When using a 32-bit register to address memory in the real mode, contents of the register must never exceed 0000FFFFH. Why?

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

我要说的是,登记册的内容是无关紧要的。 有效地址不得超过0xFFFF:

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

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

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

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

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

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

在386上,您可以使用Michael Petch的注释中提到的“虚幻模式”来更改此限制。 但是据我所知,英特尔没有官方文件说该方法是“官方”允许的-这意味着没有文件说此方法将适用于所有将来的Intel CPU。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM