我在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