指令前缀共分为4类,对于每条指令,最多只有一个前缀有效。
(1) Lock and repeat prefixes-
LOCK指令前缀为0xF0, 用于互斥操作
-
REPNE/REPNZ前缀采用F2H编码。重复非零前缀仅适用于字符串和输入/输出指令。(F2H也被用作某些指令的强制前缀)
-
REP或REPE/REPZ采用F3H编码。重复前缀只适用于字符串和输入/输出指令。(F3H也被用作某些指令的强制前缀)
操作码 指令 说明 F3 6C REP INS r/m8, DX 将 (E)CX 个字节从端口 DX 输入到 ES:[(E)DI] F3 6D REP INS r/m16,DX 将 (E)CX 个字从端口 DX 输入到 ES:[(E)DI] F3 6D REP INS r/m32,DX 将 (E)CX 个双字从端口 DX 输入到 ES:[(E)DI] F3 A4 REP MOVS m8,m8 将 (E)CX 个字节从 DS:[(E)SI] 移到 ES:[(E)DI] F3 A5 REP MOVS m16,m16 将 (E)CX 个字从 DS:[(E)SI] 移到 ES:[(E)DI] F3 A5 REP MOVS m32,m32 将 (E)CX 个双字从 DS:[(E)SI] 移到 ES:[(E)DI] F3 6E REP OUTS DX,r/m8 将 (E)CX 个字节从 DS:[(E)SI] 输出到端口 DX F3 6F REP OUTS DX,r/m16 将 (E)CX 个字从 DS:[(E)SI] 输出到端口 DX F3 6F REP OUTS DX,r/m32 将 (E)CX 个双字从 DS:[(E)SI] 输出到端口 DX F3 AC REP LODS AL 将 (E)CX 个字节从 DS:[(E)SI] 加载到 AL F3 AD REP LODS AX 将 (E)CX 个字从 DS:[(E)SI] 加载到 AX F3 AD REP LODS EAX 将 (E)CX 个双字从 DS:[(E)SI] 加载到 EAX F3 AA REP STOS m8 使用 AL 填写位于 ES:[(E)DI] 的 (E)CX 个字节 F3 AB REP STOS m16 使用 AX 填写位于 ES:[(E)DI] 的 (E)CX 个字 F3 AB REP STOS m32 使用 EAX 填写位于 ES:[(E)DI] 的 (E)CX 个双字 F3 A6 REPE CMPS m8,m8 在 ES:[(E)DI] 与 DS:[(E)SI] 中查找不匹配的字节 F3 A7 REPE CMPS m16,m16 在 ES:[(E)DI] 与 DS:[(E)SI] 中查找不匹配的字 F3 A7 REPE CMPS m32,m32 在 ES:[(E)DI] 与 DS:[(E)SI] 中查找不匹配的双字 F3 AE REPE SCAS m8 从 ES:[(E)DI] 开始查找非 AL 字节 F3 AF REPE SCAS m16 从 ES:[(E)DI] 开始查找非 AX 字 F3 AF REPE SCAS m32 从 ES:[(E)DI] 开始查找非 EAX 双字 F2 A6 REPNE CMPS m8,m8 在 ES:[(E)DI] 与 DS:[(E)SI] 中查找匹配字节 F2 A7 REPNE CMPS m16,m16 在 ES:[(E)DI] 与 DS:[(E)SI] 中查找匹配字 F2 A7 REPNE CMPS m32,m32 在 ES:[(E)DI] 与 DS:[(E)SI] 中查找匹配双字 F2 AE REPNE SCAS m8 从 ES:[(E)DI] 开始查找 AL F2 AF REPNE SCAS m16 从 ES:[(E)DI] 开始查找 AX F2 AF REPNE SCAS m32 从 ES:[(E)DI] 开始查找 EAX
段寄存器的作用:早期8086cpu寻址范围小,Inter遍通过段寄存器来拓展内存.即通过段寄存器基址+偏移的方式来寻址。
[]中的地址为有效地址(Effect Address),有效地址+段寄存器基址才是实际地址LA(线性地址 Line Address)。
线性地址 = 段基址 + 有效地址
在后来的80386时,cpu的寻址范围大大提升,这些段寄存器便被用作了其他用途。但是DS:[]类似这种寻址格式却被保留了下来。
实际上操作码已经决定了寻址时使用哪个段寄存器作为基址,不需要其他字节描述。
-
如果没有特别说明,[]前为DS,即DS:[]
-
PUSH POP指令,以及在[]中使用ESP/EBP的,使用SS段
-
在[base + Index*2Scale + I]中,以base为判断条件,没有特别说明,用DS。如果base为ESP/EBP,则用SS段.
-
串操作指令一般使用ES。MOV ES:[EDI] DS:[ESI]中,目标EDI使用ES段,其他使用DS段.
-
EIP指向当前指令,EIP取指令时使用的是CS段.
-
如果指令加段寄存器前缀,则该条指令一律用这个段,如果加多个段寄存器前缀,默认只看op前的那个.
段寄存器 段寄存器覆盖前缀 CS 2E SS 36 DS 3E ES 26 FS 64 GS 65
例如:
本来默认是ds,但是加上了CS的段寄存器覆盖前缀后,所有寻址都在cs段内了
(3) Operand-size override prefix0x66 将操作数改为16字节
例如:
(4) Address-size override prefix0x67 允许程序在16位寻址和32位寻址之间切换
例如:



