是否可以在 x86_32 虚拟 8086 或实模式下使用 EAX
、 EBX
、...?
我知道,这些寄存器的大小为 32 位(当然,它们的非扩展部分是 16 位宽),但是在类里面没有解释它们可以在哪些模式下使用,只有 FS
和GS
仅在保护模式下允许。
最佳答案
是的。操作数大小和地址大小机器代码前缀在所有模式下工作,包括纯实模式,在 386 兼容的 CPU 上。在 16 位模式下,默认操作数大小和地址大小均为 16 位。这些前缀翻转为其他大小。
当然,286 或更早版本不知道如何处理 66
或 67
前缀,因此在旨在可移植的 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/