第五周 串操作指令
大家好,又是我,沉迷学习无法自拔的小笨蛋康sir。 这个文集将会同步更新我观看吴宁老师的《微机原理与接口技术》教学视频写的笔记,学习笔记,大概每周一章。 有问题大家可以在评论下面留言讨论,欢迎纠错! 欢迎收藏阅读,动动小手给个硬币点个赞。 ——@正能量的康sir
也可移步我的博客(https://blog.csdn.net/qq_33956508)获得更好的阅读体验(暂不更新),也会更新一些其它技术类文章。

串操作指令说明:
针对数据块或字符串的操作(这类数据在内存中存放)
可实现存储器到存储器的数据传送(允许两个操作数都是存储器操作数)
待操作的数据串成为源串,目标地址称为目标串

串操作指令的操作对象是多个字节数(一串字符或数据),因此,指令的执行需要确定:
串所在的区域
串的首地址
串长度(大小)
串的操作方向
串操作指令的要求
串所在区域及首地址:
源串一般存放在数据段,偏移地址由SI指定,允许段重设。
目标串必须在附加段,偏移地址由DI指定。

串长度:
串长度值由CX指定
串的操作方向:由DF标志位决定。指令根据DF状态自动修改地址指针
DF=0——>增地址方向
DF=1——>减地址方向
通过增加重复前缀,可以实现对CX值的自动修改
重复前缀:
无条件重复:REP
当CX≠0时,REP后的指令将继续重复执行;
常用于传送类指令前——>未传完则继续传送
条件重复:
相等(为0)重复:REPE(REPZ),CX≠0∩ZF=1,则前缀后的指令将继续重复执行
不相等(不为零)重复:REPNE(REPNZ), CX≠0∩ZF=0,则前缀后的指令将继续重复执行
条件前缀常用于运算类指令前,当:1)操作未结束AND结果=0或者
2)操作未结束AND结果≠0
使其后的指令继续重复执行。
串操作指令
串传送MOVS
串比较CMPS
串扫描SCAS
串装入LODS
串送存STOS
串操作指令流程

(串操作中,完成一个字节或字操作、修改地址指针(SI、DI)是通过串操作指令实现的,修改串长度值(修改CX)、判断完成否 是通过重复前缀实现的)

因为是先修改地址指针,再判断完成否,所以:
若按增地址方向操作,串操作结束时:
串传送指令:指针将指向串尾+1
串比较类指令:指针将指向结束位+1
若按减地址方向操作,串操作结束时:
串传送指令:指针将指向串尾-1
串比较类指令:指针将指向结束位-1
第25讲 串传送与串比较指令
1.串传送指令
功能:将源数据串传送到目标地址
格式:①MOVS OPRD1,OPRD2即MOVS [DI],[SI];此格式仅用于源操作数需段重设的情况下。所以②③更常用
②MOVSB按字节传送
③MOVSW按字传送
串传送指令常与无条件重复前缀连用
例子:分别用MOV指令和MOVS指令编写将200个字节数据从内存数据段
MEM1为首地址的区域送到同一逻辑段MEM2为首地址的区域中的程
序。
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
NEXT:MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
DEC CX
JNZ NEXT
HLT
用MOVS修改
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD;CLD将DF清零,表示按增地址方向操作
REP MOVSB
HLT
2.串比较指令
功能:用于实现两个数据串的比较
操作:目标串-源串,结果不写回目标地址
常与条件重复前缀连用
格式:①CMPS OPRD1,OPRD2
②CMPSB
③CMPSW
注意:前缀的操作对标志位不影响。所以标志位完全取决于CMPS的结果。
例子:测试上例中200个字节数据是否传送正确
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REPE CMPSB;(用REPE或REPZ相等则重复。结束串比较指令的条件有两种:①CX=0,意味着两个串完全相等;②CX≠0但ZF=0,意味着碰到了不相等的字节)
JZ STOP;当ZF=1,两数据串相同,转移到STOP
DEC SI;指向存放不相等数据的地址。因为串操作会指向最后一个字节加一的位置,那再减一就是指向存放不相等数据的地址
MOV AL,[SI]
MOV BX,SI;这两句是获取不相等数据及存放该数据的地址
STOP: HLT
第26讲 串扫描指令
常用于在指定存储区域中寻找某个关键字
格式:SCAS OPRD;(OPRD是目标操作数)
SCASB
SCASW
执行与CMPS指令相似的操作,区别是:这里的源操作数是AX或AL
串扫描指令应用例:
在ES段中从2000H单元开始存放了10个字符,寻找其中有无字符“A”。若有则记下搜索次数,将搜索次数写入到DATA1单元,并将存放“A”的地址写入DATA2单元。
MOV DI,2000H
MOV BX,DI;做备份
MOV CX,0AH;因为有10个字符所以把0AH送给CX
MOV AL,’A’
CLD
REPNZ SCASB;不相等则重复 扫描
JZ FOUND
MOV DI,0
JMP DONE
FOUND:DEC DI;地址减一才是存放的地址
MOV DATA2,DI
INC DI
SUB DI,BX
DONE:MOV DATA1,DI
HLT

第27讲 串装入与串送存指令
串装入指令
格式:LODS OPRD;源操作数
LODSB
LODSW
操作
对字节:Al←[DI:SI]数据段中SI所指向单元的内容送给AL
对字:AX←[DS:SI]数据段中SI所指向的字单元的内容送给AX
(1)用于将内存某个区域的数据串依次装入累加器,以便显示或输出到接口。
(2)LODS指令一般不加重复前缀(会覆盖掉原来的内容)
串存储指令
格式:STOS OPRD
STOSB
STOSW
操作:对字节:Al→[ES:DI]附加段的一块区域
对字:AX→[ES:DI]
常用于将内存某个区域置同样的值
此时:将待送存的数据放入AL(字节数)或AX(字数据);
确定操作方向(增地址/减地址)和区域大小(串长度值)
使用串存储指令+无条件重复前缀,实现数据传送
串存储指令例
将6000H:1200H单元开始的100个字存储单元格内容清零·
分析:可以用MOV指令或串存储指令实现
MOV AX,6000H
MOV ES,AX
MOV DI,1200H
MOV CX,100
CLD
MOV AX,0
REP STOSW
HLT
串操作指令应用注意事项
需要定义附加段:目标操作数必须在附加段(后面第四章 汇编语言程序设计会学)
需要设置数据的操作方向:确定DF的状态。(CLD将DF清零,增地址方向)
源串和目标串指针分别为SI和DI
串长度值必须由CX给出
注意重复前缀的使用方法:
除了串装入指令以外,其他串操作指令都建议使用重复前缀简化编写;
传送类指令前加无条件重复前缀;
串比较类(串比较、串扫描)指令前加条件重复前缀,但前缀不影响ZF状态。