operand-size和address-size属性
当处理器工作在 保护模式(the protected mode)时,每个代码段(code segment )都会有一个默认的 operand-size 属性和 address-size 属性。这两个属性值由 代码段描述符 的 D标志位 指定。
- 若 D标志位 被设置为 1,则表示 operand-size 和 address-size 都是 32-bit。
- 若 D标志位 被设置为 0,则表示 operand-size 和 address-size 都是 16-bit。
当处理器工作在 实地址模式 (real-address mode)、虚拟-8086模式 (virtual-8086) 或 SMM时。operand-size 和 address-size 总是默认为16-bit。
operand-size 指定操作数的大小。当 16-bit operand-size 属性生效时,这个操作数大小通常是 8 bits 或16 bits。当 32-bit operand-size 属性生效时,这个操作数大小通常是 8 bits 或 32 bits。
address-size 属性在寻址内存时指定地址的大小:16 bits 或 32 bits。当 16-bit address-size 属性生效时,segment offsets and displacements 是 16 bits,这限制一个段最大为64KB。当 32-bit address-size 属性生效时,segment offsets and displacements 是 32 bits,则允许最大寻址4GB内存空间。
可以通过在指令中添加 operand-size prefix 和/或 address-size prefix 覆盖默认的 operand-size 和/或 address-size 属性值。这个前缀的作用仅限于被它修饰的指令。
表3-3 展示了处理器工作在保护模式或兼容模式时,D标志位 、operand-size prefixe 和 address-size prefixe 对有效的操作数大小和地址大小的影响。
64位模式下的操作数大小和地址大小
64位模式下,
缺省地址 大小是 64 bits,
缺省操作数 大小是 32 bits。
可以使用指令前缀覆盖缺省值,在指令中加上 address-size prefix(67H) 和 operand-size prefix(66H) 指令前缀可以达到在一条指令上混合使用32/64位数据和32/64位地址。
表3-4 展示了 66H 指令前缀和 REX.W 前缀的有效组合覆盖 operand-size 缺省值。
注意:64位模式下不支持16位地址。
REX 前缀由4个bit位构成,共可以形成16(2^4)个不同的值。REX 前缀中的 W 位称为 REX.W。 如果将 REX.W 位设置位1,则操作数大小由缺省的32位变为64位(66H 前缀如果有不起作用)。 注意,软件仍可以使用 operand-size prefix (66H) 切换到16位操作数大小。 但是,如果在指令中同时使用 REX.W,则优先于 operand-size prefix (66H) 。
对于SSE/SSE2/SSE3/SSSE3 SIMD指令:操作码扩展必须使用 66H,F2H 和 F3H 前缀。 在这种情况下,有效的 REX.W 前缀和 66H 操作码扩展前缀之间将不存在任何交互。
— 翻译自intel官方手册