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

Are Extended general-purpose and special-purpose registers supported in x86_32 virtual 8086 and real mode?

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

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

当然,286 或更早的版本不知道如何处理 6667 前缀,因此在 16 位代码中通常会避免使用 table ] 到更老的 CPUs。 (包括任何兼容 186 但不兼容 386 的非英特尔 CPU)。

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

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


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

https://en.wikipedia.org/wiki/X86-64#Operating_modes 有一个很好的 table 在哪种模式下支持哪些操作数大小(和地址大小)。