assembly - x86_32 虚拟 8086 和实模式是否支持扩展通用和专用寄存器?

标签 assembly x86 x86-16 cpu-registers real-mode

是否可以在 x86_32 虚拟 8086 或实模式下使用 EAXEBX 、...? 我知道,这些寄存器的大小为 32 位(当然,它们的非扩展部分是 16 位宽),但是在类里面没有解释它们可以在哪些模式下使用,只有 FSGS 仅在保护模式下允许。

最佳答案

是的。操作数大小和地址大小机器代码前缀在所有模式下工作,包括纯实模式,在 386 兼容的 CPU 上。在 16 位模式下,默认操作数大小和地址大小均为 16 位。这些前缀翻转为其他大小。

当然,286 或更早版本不知道如何处理 6667 前缀,因此在旨在可移植的 16 位代码中通常会避免使用它们到较旧的 CPU。 (包括任何 186 但不兼容 386 的非 Intel CPU)。

但是,如果您只关心在 386 兼容 CPU 上运行,那么您可以使用 32 位操作数大小和地址大小以及 EAX 等寄存器。包括[EAX + ECX*2]等寻址模式。当它保存指令和/或代码大小时使用它。 (请注意,实模式下段大小限制仍然设置为 64k,因此 32 位寻址模式不能超过该限制,除非您切换到保护模式并更改它,然后返回实模式。即调用 "unreal mode" )

此外,FS 和 GS 可以在任何模式下自由使用(同样仅在兼容 386 的 CPU 上)。在机器代码中,它们有自己的前缀,例如 ss:es: 覆盖,并且对于到/从段寄存器的 mov ,它们也有寄存器号。

<小时/>

这一切都记录在英特尔的手册中;段前缀的编码以及 8、16 和 32 操作数大小的寄存器操作数的编码。

<强> https://en.wikipedia.org/wiki/X86-64#Operating_modes有一个很好的表格,其中显示了哪种模式支持哪些操作数大小(和地址大小)。

关于assembly - x86_32 虚拟 8086 和实模式是否支持扩展通用和专用寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60534806/

相关文章:

linux - asm little-endian 寄存器/立即数/内存顺序

multithreading - 使用原子交换实现原子增量?

optimization - 如何优化我的 C/x86 代码?

x86-16 - 我们可以使用 PUSH 指令作为 ' PUSH AL '

assembly - 是什么导致此引导加载程序在硬件上失败但在 DOSBOX 中没有?它显示所有寄存器

gcc - 基于 x86-64 汇编的索引寻址和段错误

assembly - 是否有 x86 I/O 端口分配的规范?

c - 何时在扩展的 GCC 内联汇编中使用特定的操作数约束?

c - 通过快速浮点倒数高效计算 2**64/除数

assembly - 如何禁用循环时发生的 PC 扬声器哔声中断?