欢迎光临散文网 会员登陆 & 注册

第五周 串操作指令

2021-04-22 23:56 作者:康康Loong  | 我要投稿

大家好,又是我,沉迷学习无法自拔的小笨蛋康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状态。



第五周 串操作指令的评论 (共 条)

分享到微博请遵守国家法律