【问题标题】:When using a 32-bit register to address memory in the real mode, contents of the register must never exceed 0000FFFFH. Why?在实模式下使用 32 位寄存器寻址存储器时,寄存器的内容不能超过 0000FFFFH。为什么?
【发布时间】:2017-07-14 14:10:05
【问题描述】:

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

【问题讨论】:

  • 什么是实模式?你知道吗?
  • 在 32 位处理器 (386+) 上,您可以在实模式下使用 32 位寄存器和 32 位寻址。如果您在unreal mode,地址可以高于 0xFFFF。在传统实模式下,您被限制为 0xFFFF。
  • 这已经是那本书中的第二个误导性的东西了,它真的有什么好处吗?

标签: assembly x86 intel real-mode


【解决方案1】:

我会说寄存器的内容是无关紧要的;有效地址不能超过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。

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2014-11-18
    • 2015-04-21
    • 2019-03-12
    • 2017-01-03
    • 2012-05-11
    相关资源
    最近更新 更多