一、串处理指令
(一)串传送指令 MOVS
-
格式
MOVS DST,SRC
MOVSB(字节)
MOVSW(字)
其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:
MOVS ES:BYTE PTR[DI],DS:[SI]
-
执行的操作 :
((DI)) ← ((SI))
字节操作 :
(SI) ← (SI)±1
,(DI) ← (DI)±1
字操作 :
(SI) ← (SI)±2
,(DI) ← (DI)±2
注 :方向标志
DF=0
时用+
;DF=1
时用-
-
标志位:不影响
(二)存入串指令 STOS
-
格式
STOS DST,SRC
STOSB(字节)
STOSW(字)
-
执行的操作:
字节操作 :
((DI)) ← (AL)
,(DI) ← (DI)±1
字操作 :
((DI)) ← (AX)
,(DI) ← (DI)±2
该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据 DF 的值及数据类型修改 DI 的内容,当它与 REP 联用时,可把 AL 或 AX 的内容存入一个长度为(CX)的缓冲区中
-
标志位:不影响
(三)串取指令 LODS
-
格式
LODS SRC
LODSB(字节)
LODSW(字)
-
执行的操作:
字节操作 :
(AL) ← ((SI))
,(SI) ← (SI)±1
字操作 :
(AX) ← ((SI))
,(SI) ← (SI)±2
**该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,**并根据方向标志及数据类型修改 SI 的内容
-
标志位:不影响
注意
- LODS 指令一般不和 REP 联用
- 源串一般在数据段中(允许使用段跨越前缀来修改),目的串必须在附加段中
(四)比较指令 CMPS
-
格式
CMPSB(字节)
CMPSW(字)
-
执行的操作 :
((SI)) ← ((DI))
字节操作 :
(SI) ← (SI)±1
,(DI) ← (DI)±1
字操作 :
(SI) ← (SI)±2
,(DI) ← (DI)±2
指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其他特性和MOVS 指令的规定相同
-
标志位:影响条件标志 (同 CMP)
(五)串扫描指令 SCAS
-
格式
SCAS DST
SCASB(字节)
SCASW(字)
-
执行的操作:
字节操作 :
(AL) ← ((DI))
,(DI) ← (DI)±1
字操作 :
(AX) ← ((DI))
,(DI) ← (DI)±2
该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码。指令的其他特性和MOVS 的规定相同
-
标志位:影响条件标志 (同 CMP)
以上串操作指令具有下列共性
DS:SI
指向源串,ES:DI
指向目的串- SI 和 DI 自动增加或者减少1,2,4,关键要看 DF 的值以及操作类型是字节、字、双字,若DF=0,则SI和DI增加,否则减少
二、串重复前缀
当以上5种串操作指令与重复前缀 REP,REPZ\REPE,REPNZ\REPNE 结合使用时,可以处理整个数据串
重复前缀分2类,3条指令:
- 配合不影响标志的 MOVS\STOS\LODS 指令的 REP 前缀
- 配合影响标志的 CMPS\SCAS 指令的 REPZ\REPNA 前缀
(一)重复前缀 REP
-
格式 :
REP String_Primitive
其中
String_Primitive
可为MOVS
,LODS
或STOS
指令 -
执行的操作:
- 如
(CX)=0
则退出REP ,否则往下执行 (CX) ← (CX)-1
- 执行其中的串操作
- 重复 1~3
功能:使其后的一条串指令重复执行 CX 次,若 CX 的初值为0,则不执行任何操作
- 如
设置方向标志指令
- CLD(Clear direction flag),该指令使 DF=0,在执行串操作指令时可使地址自动增量
- STD(Set direction flag),该指令使 DF=1,在执行串操作指令时可使地址自动减量
举例 :REP MOVS BYTE PTR[DI],BYTE PTR[SI]
上面指令将 [SI] 中的值拷贝到 [DI] 位置,然后 DI 和 SI 同方向增加或者减少一个字节(由DF值决定),直到 ECX 中的值为 0
(二)有条件重复前缀
(1)相等/为零重复串操作 REPE / REPZ
- 格式 :
REPE(或REPZ) String_Primitive
其中String_Primitive
可为CMPS
或SCAS
指令 - 执行的操作 :
- 如
(CX)=0
或ZF=0
(即某次比较的结果两个操作数不等)时退出,否则往下执行 (CX) ← (CX)-1
- 执行其中的串操作
- 重复 1~3
- 如
(2)不等/非零重复串操作 REPNE / REPNZ
- 格式 :
REPNE(或REPNZ) String_Primitive
其中String_Primitive
可为CMPS
或SCAS
指令 - 执行的操作 :
- 如
(CX)=0
或ZF=1
(即某次比较的结果两个操作数相等)时退出,否则往下执行 (CX) ← (CX)-1
- 执行其中的串操作
- 重复 1~3
- 如
补充理解
参考文章