x86_32 虚拟 8086 和实模式是否支持扩展通用和专用寄存器?
Are Extended general-purpose and special-purpose registers supported in x86_32 virtual 8086 and real mode?
是否可以在 x86_32 虚拟 8086 或实模式下使用 EAX
、EBX
、...?
我知道,这些寄存器有 32 位的大小(当然,它们的非扩展部分是 16 位宽),但是 class 中没有解释它们可以在哪些模式下使用,只有 FS
和 GS
只允许在保护模式下使用。
是的。操作数大小和地址大小机器代码前缀在所有模式下工作,包括纯实模式,在 386 兼容 CPUs 上。在 16 位模式下,default 操作数大小和地址大小为 16 位。这些前缀翻转到其他尺寸。
当然,286 或更早的版本不知道如何处理 66
或 67
前缀,因此在 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 在哪种模式下支持哪些操作数大小(和地址大小)。
是否可以在 x86_32 虚拟 8086 或实模式下使用 EAX
、EBX
、...?
我知道,这些寄存器有 32 位的大小(当然,它们的非扩展部分是 16 位宽),但是 class 中没有解释它们可以在哪些模式下使用,只有 FS
和 GS
只允许在保护模式下使用。
是的。操作数大小和地址大小机器代码前缀在所有模式下工作,包括纯实模式,在 386 兼容 CPUs 上。在 16 位模式下,default 操作数大小和地址大小为 16 位。这些前缀翻转到其他尺寸。
当然,286 或更早的版本不知道如何处理 66
或 67
前缀,因此在 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 在哪种模式下支持哪些操作数大小(和地址大小)。