命令格式

串操作指令  [目的操作数][源操作数]
  1. 串操作的本质是数据块的传输
  2. 数据块的传输是有正反的

    • 执行指令CLD指令后,从给定的点 向后(地址由低到高) 开始 读取/传输 ----(默认)
    • 执行指令STD指令后,从给定的点 向前(地址由高到低) 开始 读取/传输
  3. 串操作指令的操作数是主存中连续存放的数据串----即在连续的主存区域中,字节或字的序列
  4. 源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越:DS:[SI]
  5. 目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:ES:[DI]
  6. 每执行一次串操作指令,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条指令:
配合不影响标志的MOVSSTOS(和LODS)指令的REP前缀
配合影响标志的CMPSSCAS指令的REPZREPNZ前缀

REP

REP:

  1. 每执行一次串指令,CX减1,直到CX=0,重复执行结束
  2. 理解为:当数据串没有结束(CX≠0),则继续传送
  3. 在实际 操作中 可能被优化成 REPZ

举例:

REP LODS/LODSB/LODSW/LODSD
REP STOS/STOSB/STOSW/STOSD
REP MOVS/MOVSB/MOVSW/MOVSD

REPZ

REPZ:

  1. 每执行一次串指令,CX减1
  2. 并判断ZF是否为0
  3. 只要CX=0ZF=0,重复执行结束
  4. 理解:当数据串没有结束(CX≠0),并且串相等(ZF=1),则继续比较

举例:

REPE/REPZ SCAS/SCASB/SCASW/SCASD
REPE/REPZ CMPS/CMPSB/CMPSW/CMPSD

REPNZ

REPNZ:

  1. 每执行一次串指令,CX减1
  2. 并判断ZF是否为1
  3. 只要CX=0ZF=1,重复执行结束
  4. 理解:当数据串没有结束(CX≠0),并且串不相等(ZF=0),则继续比较

举例:

REPNE/REPNZ SCAS/SCASB/SCASW/SCASD
REPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD
Last modification:December 17, 2018
如果觉得我的文章对你有用,请随意赞赏