串操作指令(五)


串操作指令

串操作指令针对数据块字符串的操作,可以允许两个操作数是存储器操作数。
源操作数称为源串,目标操作数称为目标串
串操作指令的操作对象是多个字节数(一串字符或数据)

  • 串所在区域
  • 源串,目标串起始地址
  • 串长度(大小)
  • 串的操作方向

要求

  • 串所在区域及首地址
    • 源串一般存放在数据段,偏移地址由SI指定,允许段重设
    • 目标串必须在附加段,偏移地址由DI指定
  • 串长度由CX指定
  • 串的操作方向由DF标志位决定
    • DF=0表示增地址方向
    • DF=1表示减低址方向

重复前缀

无条件重复

REP

  • 当CX≠0时,REP后的指令将继续重复执行
  • 无条件重复指令的后面通常跟的传送类指令(未传完则继续传送)

:通过增加重复前缀,可以实现对CX值的自动修改

条件重复

条件前缀常用于运算类指令
相等(为零)重复:REPE(REPZ)
CX≠0且ZF=1,重复执行
不相等(不为零)重复:REPNE(REPNZ)
CX≠0且ZF=0,重复执行

分类

  • 串传送MOVS
  • 串比较CMPS
  • 串扫描SCAS
  • 串装入LODS
  • 串送存STOS

  • 若按增地址方向操作,串操作结束时:
    • 串传送指令:指针将指向串位+1
    • 串比较类指令:指针将指向结束位+1
  • 若按减地址方向操作,串操作结束时:
    • 串传送指令:指针将指向串位-1
    • 串比较类指令:指针将指向结束位-1

串传送MOVS

源数据串传送到目标地址
格式

  1. MOVS OPRD1,OPRD2
  2. MOVSB
    • 按字节传送
  3. MOVSW
    • 按字传送

  • 第一种格式仅用于源串操作数需段重设的情况下
  • 串传送指令常与无条件重复前缀REP连用

串比较CMPS

用于实现两个数据串的比较
操作

  • 目标串减源串,结果不写回目标地址
  • 常与条件重复前缀连用

格式

  1. CMPS OPRD1,OPRD2
  2. CMPSB
  3. CMPSW

  • 第一种格式仅用于源串操作数需段重设的情况下
  • 前缀的操作对标志位不影响

串扫描SCAS

常用于在指定存储区域寻找某个关键字
格式

  1. SCAS OPRD
  2. SCASB
  3. SCASW


执行与CMPS指令相似的操作,区别是这里的源操作数AX或AL

串装入LODS

将内存某个区域的数据传依次装入累加器,以便显示或输出到接口。
一般不加重复前缀
格式:

  1. LODS OPRD
  2. LODSB
  3. LODSW

操作
对字节时,将数据段中SI所指向字节单元的内容送给AL
对字时,将数据段中SI所指向字单元的内容送给AX

串送存STOS

常用于将内存某个区域设置成同样的值。

  • 将待送存的数据放入AL(字节数)或AX(字数据)
  • 确定操作方向(增地址/减地址)和区域大小(传长度值)
  • 使用串存储指令+无条件重复前景,实现数据传送

格式

  1. STOS OPRD
  2. STOSB
  3. STOSW

操作
对字节时,将AL的内容依次加入到附加段一片区域中去
对字时,将AX的内容依次加入到附加段一片区域中去


Author: ljs
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source ljs !
评论
  TOC