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



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

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

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

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

迈克尔·佩奇(Michael Pech(在他的评论中已经给出了原因的提示:

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

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

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

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

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

最新更新