指令前缀分为四组,每组都有一组允许的前缀代码。对于每条指令,仅包含来自四组(组 1、2、3、4)中的每一组最多一个前缀代码是有用的。第 1 组到第 4 组可以按任何相对彼此的顺序放置。
第 1 组
— Lock and repeat prefixes:
-
LOCK 前缀使用 F0H 进行编码。
-
LOCK
前缀用于在多处理器环境下实现原子操作。它可以应用于特定的指令,以确保这些指令在执行期间不会被中断或干扰。LOCK
前缀通常与内存操作指令一起使用,例如ADD
,SUB
,INC
,DEC
,AND
,OR
,XOR
,NOT
,CMPXCHG
,XCHG
等。它可以确保这些操作是原子的,即在执行期间不会被其他处理器中断或干扰。 -
; 使用LOCK前缀的ADD指令 LOCK ADD [address], eax
-
-
REPNE/REPNZ 前缀使用F2H 进行编码。重复非零前缀仅适用于字符串和输入/输出指令。 (F2H 也用作某些指令的强制前缀。)
-
REPNE
和REPNZ
是相同的前缀,用于指示带有字符串操作的指令在满足特定条件时重复执行。REPNE
(或REPNZ
)前缀通常与SCAS
,CMPS
,LODS
,MOVS
,STOS
等字符串操作指令一起使用。它的作用是在指令执行期间重复执行,直到满足特定条件为止。REPNE
前缀的行为取决于特定指令的操作。例如,对于SCAS
指令,REPNE
前缀将重复执行SCAS
指令,直到找到与累加器(通常是AL
或AX
)不相等的值或达到指定的重复次数。 -
; 使用REPNE前缀的SCAS指令 REPNE SCASB
-
-
REP 或 REPE/REPZ 使用 F3H 进行编码。重复前缀仅适用于字符串和输入/输出指令。 F3H 还用作 POPCNT、LZCNT 和 ADOX 指令的强制前缀。
-
REP
(或REPE
/REPZ
)前缀是汇编语言中的一个重复前缀,用于指示带有字符串操作的指令在满足特定条件时重复执行。REP
前缀通常与SCAS
,CMPS
,LODS
,MOVS
,STOS
等字符串操作指令一起使用。它的作用是在指令执行期间重复执行,直到满足特定条件为止。REP
前缀的行为取决于特定指令的操作。例如,对于SCAS
指令,REP
前缀将重复执行SCAS
指令,直到找到与累加器(通常是AL
或AX
)相等的值或达到指定的重复次数。 -
; 使用REP前缀的SCAS指令 REP SCASB
-
— BND prefix:
BND
前缀是Intel x86架构中的一个前缀,用于指示带有绑定检查的指令。绑定检查(Bound Checking)是一种用于数组访问的安全机制,可以检查数组索引是否在有效范围内。BND
前缀可以应用于特定的指令,以启用绑定检查。BND
前缀通常与MOV
, CMP
, ADD
, SUB
, INC
, DEC
等指令一起使用。它的作用是在执行这些指令时,检查操作数中的索引是否在绑定的范围内。
; 使用BND前缀的MOV指令 BND MOV eax, [ebx]
如果满足以下条件,则使用 F2H 对 BND 前缀进行编码:
-
CPUID.(EAX=07H,ECX=0):EBX.MPX[bit14] 已设置。
-
确保cpu支持MPX功能,MPX(Memory Protection Extensions)是一种硬件扩展,用于提供内存保护和边界检查功能
-
-
BNDCFGU.EN and/or IA32_BNDCFGS.EN 已设置。
-
BNDCFGU.EN(Bound Configuration User Enable)是一个控制寄存器位,用于启用或禁用MPX功能。当BNDCFGU.EN被设置为1时,MPX功能被启用。
-
IA32_BNDCFGS.EN(Bound Configuration Status Enable)是另一个控制寄存器位,用于指示MPX功能的当前状态。当IA32_BNDCFGS.EN被设置为1时,表示MPX功能已启用。
-
-
当F2 前缀位于near CALL、near RET、near JMP、short Jcc 或near Jcc 指令之前时
第 2 组
— Segment override prefixes:
-
2EH—CS 段覆盖(保留与任何分支指令一起使用)。
-
2E JMP label #2E前缀在JMP指令之前,指示JMP指令应该使用CS寄存器来访问代码段。这样可以覆盖默认的隐式段寄存器,确保JMP指令跳转到正确的代码段。
-
-
36H—SS 段覆盖前缀(保留与任何分支指令一起使用)。
-
3EH—DS 段覆盖前缀(保留与任何分支指令一起使用)。
-
26H—ES 段覆盖前缀(保留与任何分支指令一起使用)。
-
64H—FS 段覆盖前缀(保留与任何分支指令一起使用)。
-
65H—GS 段覆盖前缀(保留与任何分支指令一起使用)。
— Branch hints(分支提示):
-
用于向处理器提供关于分支指令的额外信息,以优化分支预测和执行。
-
2EH — 未采取分支(仅与Jcc 指令一起使用)。
-
Not Taken(NT):表示分支预测应该假设分支不会被执行(跳转未发生)。
-
-
3EH—采取分支(仅与Jcc 指令一起使用)。
-
Taken(T):表示分支预测应该假设分支会被执行(跳转发生)。
-
第 3 组
— Operand-size override prefix:
-
Operand-size override prefix (0x66):用于将指令的操作数大小从默认的16位改为32位。这个前缀通常用于在16位模式下使用32位操作数。
第 4 组
— Address-size override prefix:
-
Address-size override prefix (0x67):用于将指令的地址大小从默认的32位改为16位。这个前缀通常用于在32位模式下使用16位地址。