我在Barry B. Brey的书“THE INTEL MICROPROCESSORS”中找到了它。这是真的吗?但为什么?我知道在实际的8086微处理器的实模式下,没有32位寄存器。那么现在应该对32位寄存器施加相同的限制吗?在实模式下使用32位寄存器寻址存储器时,寄存器的内容不得超过0000FFFFH。为什么?
1
A
回答
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。
相关问题
- 1. x86寄存器名称,寻址模式,位移和存储器
- 2. 32位寄存器作为8位寄存器
- 3. 将两个x86 32位寄存器存储到128位xmm寄存器中
- 4. 寄存器间接寻址
- 5. 负载32位寄存器
- 6. 在C++中实现寄存器/取消寄存器模式
- 7. 从DX:AX寄存器移动到单个32位寄存器
- 8. 32位寄存器将64位分成两个32位寄存器
- 9. 寄存器寻址模式与直接寻址模式
- 10. 在实模式和解引用中的32位寄存器
- 11. 为什么存储在寄存器中的数据有内存地址?
- 12. 寄存器和临时寄存器有什么区别?
- 13. 为什么使用临时寄存器将值传递给段寄存器?
- 14. EBX寄存器用于内存访问的模式是什么?
- 15. 为什么24位寄存器?
- 16. 是否可以在实模式下使用32位寄存器/指令?
- 17. 为什么编译器将变量存储在寄存器中?
- 18. 这个数学运算为什么起作用? (从32位寄存器获取8位寄存器)
- 19. 32位架构的DS段寄存器
- 20. XMM寄存器存储
- 21. IA32-86使用专用寄存器作为通用寄存器
- 22. 为什么值被存储在寄存器0x605040c,而不是12?
- 23. 汇编程序设计 - 将32位寄存器的内容移动到16位寄存器?
- 24. 移位寄存器为std_logic_vector
- 25. 使用FPU和MMX寄存器作为“通用寄存器”
- 26. XOR寄存器,寄存器(汇编)
- 27. 解释GDB寄存器(SSE寄存器)
- 28. 为什么Compare-and-Swap使用内存和寄存器
- 29. 在mmix交互模式下检查寄存器内容
- 30. LC3,将寄存器的值存储到内存位置
什么是实模式?你知道吗? – Marichyasana
在32位处理器(386+)上,您可以在实模式下使用32位寄存器和32位寻址。如果您处于[虚幻模式](https://en.wikipedia.org/wiki/Unreal_mode),地址可以高于0xFFFF。在传统的实模式中,您被限制为0xFFFF的限制。 –
这已经是这本书中第二个误导性的东西,它实际上有什么好处? – harold