串
命令格式
串操作指令 [目的操作数][源操作数]
- 串操作的本质是数据块的传输
数据块的传输是有正反的
- 执行指令
CLD
指令后,从给定的点 向后(地址由低到高) 开始 读取/传输 ----(默认) - 执行指令
STD
指令后,从给定的点 向前(地址由高到低) 开始 读取/传输
- 执行指令
- 串操作指令的操作数是主存中连续存放的数据串----即在连续的主存区域中,字节或字的序列
- 源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越:
DS:[SI]
- 目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:
ES:[DI]
每执行一次串操作指令,SI和DI将自动修改:
- ±1(对于字节串)或±2(对于字串)
- 执行指令
CLD
指令后,DF = 0
,地址指针增1或2 - 执行指令
STD
指令后,DF = 1
,地址指针减1或2
串操作
串传送 MOVS
MOVS(move string)
把字节或字操作数从主存的源地址传送至目的地址
MOVSB
作用:字节串传送
MOVSB
ES:[DI]←DS:[SI] ( SI←SI±1,DI←DI±1 )
MOVSW
作用:字串传送
MOVSW
ES:[DI]←DS:[SI] (SI←SI±2,DI←DI±2)
MOVSD(386+)
作用:双字串传送
MOVSD
ES:[EDI]←DS:[ESI] (SI←SI±4,DI←DI±4)
串存储 STOS
STOS(store string)
把AL或AX数据传送至目的地址
STOSB
作用:字节串存储
STOSB
ES:[DI]←AL (DI←DI±1)
STOSW
作用:字串存储
STOSW
ES:[DI]←AX (DI←DI±2)
STOSD
作用:双字串存储
STOSD
ES:[EDI]←EAX (DI←DI±4)
串读取 LODS
LODS(load string)
把指定主存单元的数据传送给AL或AX
LODSB
作用:字节串读取
LODSB
AL←DS:[SI] (SI←SI±1)
LODSW
作用:字串读取
LODSW
AX←DS:[SI] (SI←SI±2)
LODSD
作用:双字串读取
LODSD
SEAX←DS:[ESI] (SI←SI±4)
串比较 CMPS
CMPS
将主存中的源操作数减
去至目的操作数,以便设置标志,进而比较两操作数之间的关系
标志位影响参考 减法
CMPSB
作用:字节串比较
CMPSB
DS:[SI]-ES:[DI] ( SI←SI±1,DI←DI±1 )
CMPSW
作用:字串比较
CMPSW
DS:[SI]-ES:[DI] (SI←SI±2,DI←DI±2)
CMPSD
作用:双字串比较:
CMPSD
DS:[ESI]-ES:[EDI] ( SI←SI±4,DI←DI±4 )
串扫描 SCAS
SCAS(scan string)
将AL/AX减
去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系
标志位影响参考 减法
SCASB
作用:字节串扫描
SCASB
AL-ES:[DI] (DI←DI±1)
SCASW
作用:字串扫描:
SCASW
AX-ES:[DI] (DI←DI±2)
SCASD
作用:字串扫描
SCASD
EAX-ES:[EDI] (DI←DI±4)
重复前缀
- 串操作指令执行一次,仅对数据串中的一个字节或字进行操作
- 串操作指令前,可以加一个重复前缀,实现串操作的重复执行
- 重复次数隐含在
CX
寄存器中
重复前缀分2类,3条指令:
配合不影响标志的MOVS
、STOS
(和LODS
)指令的REP
前缀
配合影响标志的CMPS
和SCAS
指令的REPZ
和REPNZ
前缀
REP
REP:
- 每执行一次串指令,
CX减1
,直到CX=0
,重复执行结束 - 理解为:当数据串没有结束
(CX≠0)
,则继续传送 - 在实际 操作中 可能被优化成
REPZ
举例:
REP LODS/LODSB/LODSW/LODSD
REP STOS/STOSB/STOSW/STOSD
REP MOVS/MOVSB/MOVSW/MOVSD
REPZ
REPZ:
- 每执行一次串指令,
CX减1
- 并判断
ZF
是否为0
- 只要
CX=0
或ZF=0
,重复执行结束 - 理解:当数据串没有结束
(CX≠0)
,并且串相等(ZF=1)
,则继续比较
举例:
REPE/REPZ SCAS/SCASB/SCASW/SCASD
REPE/REPZ CMPS/CMPSB/CMPSW/CMPSD
REPNZ
REPNZ:
- 每执行一次串指令,
CX减1
- 并判断
ZF
是否为1
- 只要
CX=0
或ZF=1
,重复执行结束 - 理解:当数据串没有结束
(CX≠0)
,并且串不相等(ZF=0)
,则继续比较
举例:
REPNE/REPNZ SCAS/SCASB/SCASW/SCASD
REPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD