资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本教案内容,第,3,章,8086CPU,指令系统,汇编语言指令,8086,指令分类,数据与转移地址的寻址方式,数据传送类指令,算术运算类指令,逻辑运算类指令,移位类指令,标志位操作指令,转移指令,循环控制指令,子程序调用返回指令,中断调用返回指令,字符串操作指令,I/O,输入输出指令,其它指令,宏指令,所谓字符串是指一组代码或数据,,并不一定是常规的由字符构成的。字符串操作指令就是对这组代码或数据进行相同功能处理的指令。,字符串存放在一个连续的存储区域中,。,3.13,字符串操作指令,3.13,字符串操作指令,8086,系统提供了,5,类,字符串操作指令:,字符串传送,MOVS,(,Move byte or word string,),字符串比较,CMPS,(,Compare byte or word string,),字符串扫描,SCAS,(,Scan byte or word string,),字符串装入,LODS,(,Load byte or word string,),字符串存储,STOS,(,Store byte or word string,),3.13,字符串操作指令,由于这类指令要对一组代码进行操作,希望能够成批处理数据,这需要字符串指令与重复前缀配合使用。,重复前缀,REP,(,Repeat string operation,),重复前缀,REPZ/REPE,(,Repeat string operation while equal/zero,),重复前缀,REPNZ/REPNE,(,Repeat string operation while not equal/not zero,),字符串处理指令既可以按,字节操作,,也可以按,字操作,,且,DST,和,SRC,的寻址方式均为,隐含寻址,。这类指令要遵循的共同约定如下:,3.13,字符串操作指令,若源串在存储器,,则存储器地址由,DS:SI,确定;,若源串在寄存器,,则:,字操作时,在,AX,中,字节操作时,在,AL,中,3.13,字符串操作指令,若目的串在存储器,,,则存储器地址,必须,由,ES:DI,确定;,若目的串在寄存器,,,则:,字操作时,在,AX,中,字节操作时,在,AL,中,3.13,字符串操作指令,字符串操作指令,CPU,执行后,(,SI,),或(,DI,),会自动地修改,其修改,方向受,DF,控制,。,3.13,字符串操作指令,1,时,会自动地减,1,或,2,0,时,会自动地增,1,或,2,当DF=,受操作类型控制,,字节操作时,增,/,减,1,字操作时,增,/,减,2,3.13,字符串操作指令,字符串处理指令的重复次数,。,(重复执行的次数),CX,3.13,字符串操作指令,字符串操作指令有:,3.13,字符串操作指令,助记符格式,主要功能,MOVS DST,SRC,MOVSB,MOVSW,(ES:DI)(DS:SI),字操作时,:(,SI)(SI)2,(DI)(DI)2,字节操作时,:(SI,),(SI)1,(DI)(DI)1,字节传送,字传送,3.13,字符串操作指令,一、字符串传送指令,在,MOVS DST,,,SRC,中,当,DST,和,SRC,同为字节类型时,等同于,MOVSB,指令;当,DST,和,SRC,同为字类型时,等同于,MOVSW,指令。,3.13,字符串操作指令,例如指令,MOVS VAR1,,,VAR2,并不是完成,VAR1,变量的内容传送到,VAR2,,而是将,(DS,:,SI),中的内容传送到由,(ES,:,DI),指定的位置,当,VAR1,和,VAR2,均为字节型变量时,该指令等同于,MOVSB,,当,VAR1,和,VAR2,均为字型变量时,该指令等同于,MOVSW,。,3.13,字符串操作指令,说明:,字符串传送指令对,PSW,的标志位无影响。,字符串传送指令每次只能完成一个字和字节的传送,而实际应用中,经常需要将一块存储区域的内容整体搬移到另一个位置,为此,,8086,提供了,重复前缀。,3.13,字符串操作指令,二、重复前缀,有三种形式:,REP,REPZ/REPE,REPNZ/REPNE,它们放在字符串操作指令之前,表示重复执行该指令,重复次数由,CX,决定。,助记符格式,主要功能,REP MINST,当,(CX)0,时,重复执行,MINST,(CX)-1(CX);,MINST,STOSW,STOSB,MOVSW,MOVSB,3.13,字符串操作指令,1.,重复前缀,REP,相当于,LOOP,指令,3.13,字符串操作指令,当,REP,与,MOVS,指令配合时,有,REP MOVSB,;,(ES,:,DI)(DS,:,SI),(字节传送),;(SI)(SI)1,(DI)(DI)1,,,;,(CX)(CX)-1,(CX)0,时重复执行,,;,即当,(CX),0,时退出循环,REP MOVSW,;与,REP MOVSB,指令类似,,;,只是每次传送一个字,助记符格式,主要功能,REPE/REPZ CINST,当,(CX)0,时,且,ZF=1,时,重复执行,CINST,(CX)-1(CX);,3.13,字符串操作指令,CINST,CMPS,SCAS,2.,重复前缀,REPZ/REPE,相当于,LOOPZ/LOOPE,指令,助记符格式,主要功能,REPNE/REPNZ CINST,当,(CX)0,时,且,ZF=0,时,重复执行,CINST,(CX)-1(CX).,3.13,字符串操作指令,CINST,SCAS,CMPS,3.,重复前缀,REPNZ/REPNE,相当于,LOOPNZ/LOOPNE,指令,助记符格式,主要功能,CMPS DST,SRC,CMPSB,CMPSW,(DS:SI)-(ES:DI),建立标志,字操作时:(,SI,),(SI)2,(DI)(DI)2,字节操作时:(,SI,),(SI)1,(DI)(DI)1,字节比较,字比较,3.13,字符串操作指令,三、字符串比较指令,3.13,字符串操作指令,指令,CMPS,与,CMP,类似,比较结果不进行保存,只是用于设置,PSW,中的标志位,但是,在字符串比较指令中,采用“源操作数”减去“目的操作数”,而在,CMP,指令中,采用“目的操作数”减去“源操作数”。因此,对比较结果的转移的条件是不同的:,CMP DST,SRC,CMPS DST,SRC,JG ABC,JG ABC,当(,DST,),(,SRC,)时转,ABC,当,(ES,:,DI)(DS,:,SI),时转,ABC,这一点应特别引起注意。,3.13,字符串操作指令,字符串比较指令会正常影响,PSW,中的,6,个标志位。,CMPS,指令经常与,REPZ/REPE,、,REPNZ/REPNE,配合使用,其含义有所不同。,1,REPZ CMPS,比较两字符串时,当遇到第一个不相同的字符时,就跳出比较循环,(ZF=0),。,2,REPNZ CMPS,比较两字符串时,当遇到第一个相同的字符时,就跳出比较循环,(ZF=1),。,3.13,字符串操作指令,例,3.37 BUFFER1,和,BUFFER2,为长度,100,的两个字型缓冲区,对比这两个缓冲区中的数据,如果找到相同的字,则在,ADDR,中保存该数据在,BUFFER1,中的地址,如果找不到,则在,ADDR,中置,0FFFFH,。,解:,设在数据段中已经定义好字型缓冲区,BUFFER1,、,BUFFER2,和字型变量,ADDR,,并将,DS,和,ES,都指向该数据段,则在代码段中编写下列程序:,3.13,字符串操作指令,LEASI,BUFFER1,LEADI,BUFFER2,MOV CX,100,REPNZ CMPSW,JZ FOUND,MOV ADDR,-1,JMP ELSE,FOUND:,SUB SI,2,MOV ADDR,SI,ELSE:,助记符格式,主要功能,SCAS DST,SCAB,SCAW,字扫描时,:(AX)-(ES:DI),建立标志,(DI)(DI)2,字节扫描时,:(AL)-(ES:DI),建立标志,(DI)(DI1),3.13,字符串操作指令,四、字符串扫描指令,3.13,字符串操作指令,说明:,SCAS,指令与字符串比较指令类似,只是源操作数固定为,AL,或,AX,的内容。其它说明类似于字符串比较指令。,字符串扫描指令会正常影响,PSW,中的,6,个状态标志位,从而后续指令可以对比较结果进行判断与转移操作。因此,SCAS,指令经常与,REPZ/REPE,、,REPNZ/REPNE,配合使用,其含义有所不同。,3.13,字符串操作指令,1,REPZ SCAS,比较(,AL,)或(,AX,)的内容与目的字符串的内容,也就是在目的字符串中查找指定的字符(,AL,)或(,AX,),当找到第一个不相同的字符时,就跳出比较循环,(ZF=0),。,2,REPNZ SCAS,比较(,AL,)或(,AX,)的内容与目的字符串的内容,也就是在目的字符串中查找指定的字符(,AL,)或(,AX,),当找到第一个相同的字符时,就跳出比较循环,(ZF=1),。,3.13,字符串操作指令,例,3.38,在字节型缓存区,BUFFER,中保存有,20000,个数据,要求在其中查找字符串“,12345”,(以,ASCII,码表示),并将其在,BUFFER,的偏移地址存放在,ADDR,单元中,如果没有找到,则将,0FFFFH,存放在,ADDR,中。,解:,为了查找一串数据,首先应该在,BUFFER,中查找第一个数据,当找到后,再对后续的数据进行对比,如果恰好都相同,则表示找到了找到的字符串;如果有一个字符不相同,则应该回到刚才的位置继续查找第一个数据,这一点很重要,可以避免漏掉要查找的字符串。,3.13,字符串操作指令,例如在,BUFFER,中有这样的字符串:“,112345”,,就容易造成漏检,如图,3.6,所示,当找到第一个字符“,1”,时,,DI,指向位置“,B”,,接着与第二个字符“,2”,比较,发现两者不同,这时,DI,已经指向位置“,C”,,如果不恢复原来的地址进行搜索,则程序找不到第二个“,1”,,从而使该正确的字符串漏检。,3.13,字符串操作指令,数据段的内容为:,BUFFER DB 20000 dup(?),ADDR,dw,?,STRINGDB 12345,并使,DS,和,ES,都指向该数据段,则设计的程序为:,MOV ADDR,-1,LEA DI,BUFFER,MOV CX,20000,MOV AL,STRING,;取第一个字符,STARTSEARCH:,REPNZ SCASB,;查找第一个字符,JNZ NOFOUND,LEA SI,STRING+1,PUSH CX,;保存搜索次数,PUSH DI,;保存搜索指针,MOV CX,4,;比较后续字符,REPZ CMPSB,POP DI,;恢复搜索指针,POP CX,;恢复搜索次数,JNZ STARTSEARCH,FOUND:,SUB DI,1,;指针修正,MOV ADDR,DI,NOFOUND:,助记符格式,主要功能,LODS SRC,LODSB,LODSW,字操作时:,(AX)(DS:SI),(,SI,),(SI)2,字节操作时:,(AL)(DS:SI),(,SI,),(SI)1,3.13,字符串操作指令,五、字符串装入指令,3.13,字符串操作指令,字符串装入指令不影响,FLAG,。,每次执行都会从源数据区取一个值送到(,AL,)或(,AX,),重复操作意味着后面装人的内容将覆盖前面装人的内容,因此,LODS,指令很少与重复前缀配合使用。,助记符格式,主要功能,STOS DST,STOSB,STOSW,字操作时:,(ES:DI)AX,(,DI,),(DI)2,字节操作时:,(ES:DI)(AL),(,DI,),(DI)1,3.13,字符串操作指令,六、字符串存储指令,3.13,字符串操作
展开阅读全文