串操作指令
串操作指令针对数据块或字符串的操作,可以允许两个操作数是存储器操作数。
源操作数称为源串,目标操作数称为目标串
串操作指令的操作对象是多个字节数(一串字符或数据)
- 串所在区域
- 源串,目标串起始地址
- 串长度(大小)
- 串的操作方向
要求
- 串所在区域及首地址
- 源串一般存放在数据段,偏移地址由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
将源数据串传送到目标地址
格式:
- MOVS OPRD1,OPRD2
- MOVSB
- 按字节传送
- MOVSW
- 按字传送
注:
- 第一种格式仅用于源串操作数需段重设的情况下
- 串传送指令常与无条件重复前缀REP连用
串比较CMPS
用于实现两个数据串的比较
操作:
- 目标串减源串,结果不写回目标地址
- 常与条件重复前缀连用
格式:
- CMPS OPRD1,OPRD2
- CMPSB
- CMPSW
注:
- 第一种格式仅用于源串操作数需段重设的情况下
- 前缀的操作对标志位不影响
串扫描SCAS
常用于在指定存储区域寻找某个关键字
格式:
- SCAS OPRD
- SCASB
- SCASW
注:
执行与CMPS指令相似的操作,区别是这里的源操作数AX或AL
串装入LODS
将内存某个区域的数据传依次装入累加器,以便显示或输出到接口。
一般不加重复前缀
格式:
- LODS OPRD
- LODSB
- LODSW
操作:
对字节时,将数据段中SI所指向字节单元的内容送给AL
对字时,将数据段中SI所指向字单元的内容送给AX
串送存STOS
常用于将内存某个区域设置成同样的值。
- 将待送存的数据放入AL(字节数)或AX(字数据)
- 确定操作方向(增地址/减地址)和区域大小(传长度值)
- 使用串存储指令+无条件重复前景,实现数据传送
格式:
- STOS OPRD
- STOSB
- STOSW
操作:
对字节时,将AL的内容依次加入到附加段一片区域中去
对字时,将AX的内容依次加入到附加段一片区域中去