Bal*_*sök 3 x86 assembly real-mode cpu-registers x86-16
是否可以在 x86_32 虚拟 8086 或实模式下使用EAX, EBX,... ?我知道,这些寄存器具有32位(和,即当然它们的非扩展部分是16个比特宽)的尺寸,但并不在类解释的,在该模式中可以使用它们,只有FS和GS是仅在保护模式下允许。
是的。操作数大小和地址大小机器码前缀适用于所有模式,包括纯实模式,在 386 兼容的 CPU 上。在 16 位模式下,默认操作数大小和地址大小为 16 位。这些前缀翻转为其他大小。
当然,286 或更早版本不知道如何处理66或67前缀,因此在旨在移植到旧 CPU 的 16 位代码中通常会避免使用它们。(包括任何 186 但不兼容 386 的非英特尔 CPU)。
但是如果你只关心在 386 兼容的 CPU 上运行,是的,你可以使用 32 位操作数大小和地址大小,以及像 EAX 这样的寄存器。包括寻址模式,如[EAX + ECX*2]. 当它保存指令和/或代码大小时使用它。(请注意,实模式下段大小限制仍设置为 64k,因此 32 位寻址模式不能超过该限制,除非您切换到保护模式并更改它,然后再返回实模式。这就是所谓的“非实模式”)
此外,FS 和 GS 可以在任何模式下自由使用(同样仅在 386 兼容 CPU 上)。在机器代码中,它们有自己的前缀,如ss:或es:覆盖,对于 mov 到/从段寄存器,它们也有寄存器号。
这一切都记录在英特尔的手册中;段前缀的编码,以及 8、16 和 32 操作数大小的寄存器操作数的编码。
https://en.wikipedia.org/wiki/X86-64#Operating_modes有一个很好的表格,其中显示了哪种模式支持哪些操作数大小(和地址大小)。