微机原理:串操作指令(详解)
什么是串操作指令?
你或许觉得对连续的数据进⾏重复的操作会花费你⼤量的时间并且显得代码极其冗余,那为何不试试“专门⽤于对连续数据进⾏操作的指
令“——串操作指令。”串“操作指令,顾名思义就是对在内存中连续存在的数据进⾏操作的指令,那为何不是寄存器或者⽴即数呢?寄存器⼀共也就16位并且⽴即数是我们直接给出的操作数,这两者根本不⽤调⽤多条指令,⼀条指令即可KO他们。
串操作指令的特点
说起串操作指令,那它不但具有普通操作指令的共性,同时也具备连续操作指令的特性。要对⼀连串数据进⾏操作,我们要知道以下内容:特性要对多少数据进⾏操作?数据串长度
特性数据串操作⽅向(从低到⾼还是从⾼到低)串操作⽅向
共性到底进⾏何种操作?操作指令
共性数据从哪⾥来⼜到哪⾥去?源/⽬标操作数
注意:⽆论是字符还是数据,在内存中均以其ASCII表⽰,我们统称之为数据。
⾸先,我们先来解决⼀下串操作指令独有的个性:
相关寄存器串操作属性
CX计数寄存器数据串长度/操作重复次数
FLAGS标志寄存器中DF标志位串操作⽅向
注意:DF标志位与串操作的⽅向⼀定别闹混了:
DF标志位状态连续操作⽅向指令
0从低地址到⾼地址CLD
1从⾼地址到低地址SLD
其次,我们再来了解⼀下串操作指令作为操作指令的共性——操作数的寻址⽅式,除了与累加器AX打交道的串操作指令外,所有串操作指令都具有以下特点:
1)源操作数为SI寄存器操作数,且指向的内存地址默认在数据段(DS:SI),但是允许我们进⾏段重设,毕竟被移动的数据串所在逻辑段可以是四个逻辑段中的任意⼀个;
2)⽬标操作数为DI寄存器操作数,且⼀定在ES附加段(ES:DI),不允许段重设,这就好⽐“我们打出租的地点不同,但是⽬的地均是
比较指令cmp怎么用家“⼀样。
串操作寄存器可以拓展为以下流程:
由于⼀个完整的串操作指令的格式为:
[重复操作前缀] 指令助记符 [⽬标操作数] [源操作数]
因此,我们也可以将流程分解:
串操作指令会对FLAGS寄存器中的标志位产⽣影响,因此后⾯可以跟随程序跳转指令。除此之外,如
果串操作指令前加上重复前缀,那么串操作指令可以在满⾜条件的情况下不断循环执⾏相同的操作。串操作指令的重复前缀如下所⽰:
重复执⾏的条件指令助记符
CX不为零REP
CX不为零且ZF=1REPE/REPZ
CX不为零且ZF=0REPNZ/REPNE
注意:ZF表⽰结果为0,常⽤于判断运算类指令的执⾏结果。
总之,有关串操作指令的三⼤块分别为:
地址指针源变址寄存器SI、⽬标变址寄存器DI
串操作⽅向DF的状态
重复执⾏前缀REP、REPZ/REPE、REPNZ/REPNE
特别注意:DF状态和源变址寄存器SI、⽬标变址寄存器DI搭配所出现的情况:
串操作指令解析
数据传送指令
数据传送类指令⼀共有三个:MOVS、MOVSB、MOVSW,MOVSB和MOVSW均采⽤隐含寻址的⽅法,⽬标操作数默认为DS:SI,源操作数默认为ES:DI。三种指令如下所⽰:
穿操作指令格式⽬标操作数源操作数操作数字长
MOVS SI DI DI SI字节或者字
MOVSB隐含寻址隐含寻址字节
MOVSW隐含寻址隐含寻址字
1. 源操作数不可以段重设,⼀定是ES:DI所指向的位置;⽬标操作数可以段重设,如果不显式进⾏段重设,那么⽬标操作数默认在数据段,即DS:SI;
2. 数据串传送类指令常常结合“重复前缀”⼀起使⽤,⼀提⾼运⾏效率,⽽且因为数据传送类指令不影响标志位,因此使⽤的重复前缀是⽆条件重复前缀REP。
数据传送类指令的使⽤⽅式如下所⽰:
串⽐较指令
要想知道⼀个指令的⼯作逻辑以及后⾯⼀条指令与其的关系,⾸先我们要关注“这条指令的执⾏前提”以及“该指令执⾏完后的影响”。在我们前⾯算术运算类指令章节中提及过⽐较指令CMP,CMP属于减法运算指令,影响除DF外的其他全部标志位,但是不影响⽬标操作数的值,因此⽐较类指令后⾯跟着的⼀定是和标志位有关系的跳转指令。与前⾯的数据传送类指令⼀样,传⽐较指令也分为三个:CMPS、CMPSB、CMPSW,其中CMPSB、CMPSW均采⽤隐含寻址的⽅法,⽬标操作数默认为DS:SI,源操作数默认为ES:DI。
指令类型源操作数⽬标操作数操作数字长
CMPS DI SI字节或者字
CMPSB隐含寻址隐含寻址字节
CMPSW隐含寻址隐含寻址字
1. 源操作数不可以段重设,⼀定是ES:DI所指向的位置;⽬标操作数可以段重设,如果不显式进⾏段重设,那么⽬标操作数默认在数据段,即DS:SI;
2. 数据串⽐较类指令常常结合“重复前缀”⼀起使⽤,⼀提⾼运⾏效率,⽽且因为数据⽐较类指令影响标志位,因此使⽤的重复前缀是有条件重复前缀REPZ或者REPNZ。
串⽐较类指令的使⽤⽰例:
串扫描指令
CMPS、CMPSB、CMPSW都是将两个数据串进⾏⽐较,那有没有⼀种指令将数据串和⼀个特定的数
据⽐较呢?有,这就是串扫描指令SCAS、SCASB、SCASW,三者形式如下所⽰:
指令助记符⽬标操作数操作数字长
SCAS DI字节或者字
SCASB隐含寻址字节
SCASW隐含寻址字
注意:
1. 串扫描类指令其实有两个操作数,⼀个是放置⽐较数据的AX或者AL,另⼀个是由ES:DI指向的存储器操作数;
2. 串扫描类指令只影响标志位不影响任何⼀个操作数的数值。
串扫描类指令使⽤⽰例:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论