串操作指令一
串传送 MOVSB (正向 DF=0 )
串传送 MOVSW(反向 DF=1)
在使用MOVS指令进行字符串传送时,要注意传送方向。 – 如果源字符串与目标字符串不重迭,则传送方向没有任何影响。 – 如果源字符串与目标字符串部分重迭,则传送方向要特别注意。
DF=0? DF=1?
例 将数据段中首地址为SOURCE的100个字节串元素传送到附加段中首地址 为DEST的内存单元址连续的若干单元字符或数据。 由多个字节数据组成的数据串称为字节数据串,简 称字节串; 由多个字数据组成的数据串称为字数据串,简称字 串。 成串的字节数据或字数据称为数据串元素。 对数据串元素作同样的操作,就称为串操作。 把能完成串操作功能的指令称为数据串操作指令或 简称为串操作指令。
3、串操作指令 (1)串传送指令 指令功能:把位于数据段DS:SI中一个字节或字的数据传送到附 加段ES:DI中。 指令格式: 注意: 1)源串可以段跨越,目的串不可以。 MOVSB;字节传送:ES:[DI]←DS:[SI],SI ←SI±1, 2)DF=0,地址指针 +1 或 +2 , DF=1 ,指针 -1 或 -2 。 ;DI ←DI±1 3)指令隐含操作数,只有助记符,无操作数。 MOVSW;字传送:ES:[DI]←DS:[SI],SI ←SI±2, 4)不影响标志位。 ;DI ←DI±2
实现该功能的程序段如下: CLD LEA SI,SOURCE LEA DI,DEST MOV CX,100 AGAIN: MOVSB
DEC JNZ HLT CX AGAIN ;使DF=0 ;SI指向源串 ;DI指向目的串 ;(DS:SI)→ES:DI, ;(SI)+1→SI,(DI)+1→DI
本例中MOVSB指令可用以下4条指令替代: MOV AL,[SI] MOV ES:[DI],AL INC SI INC DI
REP重复前缀指令 —字节串传送(例) mov si,offset source mov di,offset destination mov cx,n ;cx←传送次数n cld ;置DF=0,地址增加 again: rep movsb movsb ;传送一个字节 dec cx ;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束
二、串操作对象 串操作对象有两组,分别叫做源串、目的串,而且他 们都处于存储器中,是8086指令系统中唯一的一类所有数 据都来源于存储器的指令。 所有指令的操作数普遍采用地址描述的方式来对应, 因为是地址连续的,可以通过地址修正的方式,查找下一 个数据。
源串和目的串的分布情况可以有下面三种情况。 1、两串信息相互独立,地址不重迭。 2、源串的下半(高地址)部分和目的串上半(低地址)部分重迭。 3、源串的上半(低地址)部分和目的串下半(高地址)部分重叠。 b图和c图有重合部分,为保证原始数据不会 受影响,就需要先从重合的部分处理,b图先 a图,没有重合部分,处理数据 处理源串的高地址部分, c图先处理源串的低 时,可以从低地址开始,也可以 地址部分。源串和目的串的地址修正方向一 从高地址开始。 致,通过 DF来确定。
三、串操作指令 1、特点 (1)串处理指令只能处理单个字节或字,应用中需要串重复前 缀配合使用。 (2)用CX寄存器存放要处理的字符串的元素个数,要在字符 串指令执行前,给CX赋值。 (3)一般源串存放在数据段DS中,偏移地址由SI指定;目的 串存放在附加段ES中,偏移地址由DI指定;在同一个段内实现 字符串传送时,应将DS=ES。 (4)设置方向标志指令:DF=0时,SI、DI作自动增量修改; DF=1时,SI、DI作自动减量修改。
2、指令初始化 在使用串操作指令之前需要先做一些准备工作,这些准备工作 包括指明源串、目的串的起始位置,所要处理的数据的数量以 及数据查找的方向,即对DS、SI、ES、DI、CX、DF设定初值。 (1) DS、SI、ES、DI是地址信息可以使用MOV或LEA进行赋值 个别情况也可以考虑LDS、LES指令。 (2)对CX初始化需要考虑指令中数据串元素的类型,通常会选用 MOV指令进行赋值。 (3)设定DF时可以用指令 CLD(DF=0)和STD(DF=1)。
串操作指令执行一次,仅对数据串中的一个字节或字量进行操 作。但是串操作指令前,都可以加一个重复前缀,实现串操作 的重复执行。重复次数隐含在CX寄存器中。 重复前缀指令用来控制紧跟其后的字符串指令是否重复,为单 字节指令,不能单独使用。 无条件重复前缀REP ●指令功能:重复执行指令规定的操作,直到(CX)=0。 ●指令格式:REP MOVS(B/W) ●指令操作:① 如(CX)=0 则退出 REP,否则转②; ②(CX)←(CX)-1; ③ 执行其后的串操作指令; ④ 重复①〜③。