串操作类指令
- 格式:ppt
- 大小:395.00 KB
- 文档页数:19
串操作指令的使用一、串操作指令概述所谓串就是内存中一段地址相连的字节或字。
串操作就是对串中各项数据进行某种运算,也叫数据块操作。
8086/8088有5种基本串操作:⏹MOVS(Move string)串传送指令⏹CMPS(Compare string)串比较指令⏹SCAS(Scan string)串扫描指令⏹LODS(Load from string)从串取指令⏹STOS (Store in to string)存入串指令可以使用3种重复前缀:⏹REP(Repeat)无条件重复⏹REPE/REPZ(Repeat while equal/zero)相等/为零则重复⏹REPNE/REPNZ(Repeat while not equal/not zero)不相等/不为零则重复二、串操作指令详解★MOVS 串传送格式:MOVS dest,srcMOVSB(字节传送)MOVSW(字传送)功能:把DS:SI所指向的内存单元中的一个字或字节的内容取出复制到ES:DI所指向的字或字节内存单元中。
同时SI±1、DI±1或SI±2、DI±2,方向标志DF=1进行加运算,DF=0进行减运算;字节传送加减1,字传送加减2。
说明:☆单条MOV指令不能完成存储单元之间的数据传送;MOVS指令就是为解决内存储单元之间数据传送而设置的。
☆所涉及到的源内存单元和目的内存单元的地址分别存放在DS:SI和ES:DI中。
✧MOVS串传送指令不影响标志寄存器。
★LODS 从串取指令格式:LODS srcLODSB (取字节)LODSW(取字)功能:把DS:SI所指向的内存单元中的字或字节内容传送到AX或AL寄存器中。
同时SI 加减1或2;方向标志DF=1进行加运算,DF=0进行减运算;字节传送加减1,字传送加减2。
说明:☆LODS指令可用于取出指定的内存单元中的内容。
✧默认目的寄存器为AX或AL寄存器。
实验五串操作类指令的使用一.实验目的:掌握串操作类指令的用法。
二.实验内容:1. 用串操作指令实现:将数据段中BUF开始的一段字符串传送到附加段中BLOCK开始的数据区中,数据段定义如下:DATA SEGMENTBUF DB ‘HELLO,WORLD!’COUNT EQU $-BUFDATA ENDSEDATA SEGMENTBLOCK DB COUNT DUP (?)EDATA ENDS2. 数据段定义如下:DATA SEGMENTBUF DB ‘COMMAND’X DB ‘N’ADDR DW ?DA TA ENDS编程实现:检测BUF中是否有与X单元相同的字符,如有,则将该字符所在位置的偏移地址送到ADDR中。
三、实验步骤:第一题:程序如下DATA SEGMENTBUF DB 'HELLO,WORLD!'COUNT EQU $-BUFDATA ENDSEDATA SEGMENTBLOCK DB COUNT DUP (?)EDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:EDATA什么时候用一个什么时候又用两个?START:MOV AX,DATAMOV DS,AXMOV AX,EDATAMOV ES,AXCLDMOV CX,COUNTLEA SI,BUFLEA DI,BLOCKREP MOVSB为什么运行不了的MOV AH,4CHINT 21HCODE ENDSEND START第二题:程序如下DATA SEGMENTBUF DB 'COMMAND'X DB 'N'ADDR DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA.ES:DATASTART:MOV AX,DATAMOV DS,AXMOV ES,AXCLDMOV CX,7LEA DI,BUFMOV AL,XREPNE SCASBMOV ADDR,DISUB ADDR,1;此处减一是因为比较到相同的字符时DI会指向下一个,所以要减一 MOV AH,4CHINT 21HCODE ENDSEND START。
串操作指令串操作指令串操作指令就是用一条指令实现对一串字符或数据的操作。
8086的串操作指令的特点是:◆通过加重复前缀来实现重复操作。
重复的次数取决于C X寄存器的内容(在字符串比较和字符串检索指令中还与Z F标志有关)。
◆可以对字节串进行操作,也可以对字串进行操作。
◆所有的串操作指令都用寄存器S I对源操作数进行间接寻址,默认段寄存器为D S;所有的串操作指令都用寄存器D I为目的操作数进行间接寻址,默认段寄存器为E S。
串操作指令是唯一的一组源操作数和目的操作数都在存储器中的指令。
◆串操作时,地址指针的修改与方向标志D F有关,当D F=1时,S I和D I作自动减量修改,当D F=0时,S I和D I作自动增量修改。
串操作指令一共有5条:◆字符串传送指令M O V S B/M O V S W◆字符串比较指令C M P S B/C M P S W◆字符串检索指令S C A S B/S C A S W◆取字符串指令L O D S B/L O D S W◆存字符串指令S T O S B/S T O S W与上面串操作指令配合使用的重复前缀有:◆重复R E P◆相等则重复/为零则重复R E P E/R E P Z◆不相等则重复/不为零则重复R E P N E/R E P N Z在串操作指令的前面加上重复前缀,使C P U能重复执行该指令,这使处理长字符串比用软件循环处理快得多。
在执行有重复前缀的串操作指令时,C X寄存器控制重复次数,每重复执行一次,C X 内容减1,C X减为0结束;此外,还可以按规定的条件(Z F=1或Z F =0)结束重复过程。
重复前缀对规定条件的检测,是在每次进入串操作以前进行的。
所以若初始化使操作次数C X为0,它将不会引起任何操作。
一、字符串传送指令M O V S B/M O V S W字符串传送指令M O V S B/M O V S W将位于D S段的、由S I所指出的存储单元的内容传送到位于E S段、由D I所指的存储单元中,再修改S I和D I,从而指向下一个元素,M O V S B用于字节传送,M O V S W用于字传送。
3.3.4 串操作指令串或字符串是指在内存中连续存放的由字节或字组成的数据串,可以是数值型或字符型数据。
我们常常要从数据串中查找特定数据;或者比较两个串是否相同等,或者把一个串从内存的一个区域传送到另一个区域等操作;使用串操作指令就是最佳选择。
串操作指令对串中数据进行相同的操作,可以以字节为单位或以字为单位,可操作的最大串长度为64K。
串操作指令包括:MOVS 串传送CMPS 串比较SCAS 串扫描STOS 存入串LODS 取串这五种串操作指令都是隐含指令,说明如下:①源操作数(源串)默认由DS:SI指定,即源串默认在数据段,允许段超越为CS、ES 和SS。
偏移地址指针SI自动修改。
②目的操作数(目的串)默认由ES:DI指定,即目的串默认在附加数据段。
不允许段超越。
偏移地址指针DI自动修改。
③通过设定标志寄存器中的方向标志位DF的值,可以控制串操作的方向。
DF设定为0,偏移地址指针SI和DI自动增量,如果串操作为字节操作,每次偏移地址指针加1,如果为字操作,每次偏移地址指针加2。
DF设定为1,偏移地址指针自动减量。
如果串操作为字节操作,每次偏移地址指针减1,如果为字操作,每次偏移地址指针减2。
如图3-9所示。
④串操作指令本身只操作一次,例如指令MOVSB的功能为将DS:SI指明的一个字节传送到ES:DI指明的内存单元中。
如果要使整个的源串数据全部传送到目的串中,需要再加一个重复前缀REP。
用于串操作指令的重复前缀有三种,分别是:REP:无条件重复前缀REPE:相等时重复(ZF=1),REPZ:比较结果为0时重复REPNE:不相等时重复(ZF=0),REPNZ:比较结果不为0时重复⑤带重复操作前缀的串操作指令,需要指明重复次数。
用计数器CX指定串长度,即重复次数,每次串操作后CX自动减1,直到CX=0,串操作结束。
综上所述:在使用串操作指令前应预先设置源串指针DS:SI,目的串指针ES:DI,计数器CX 和标志位DF。