《微机原理与接口技术(楼顺天)-第3章9》由会员分享,可在线阅读,更多相关《微机原理与接口技术(楼顺天)-第3章9(38页珍藏版)》请在金锄头文库上搜索。
1、本教案内容,第3章 8086CPU指令系统汇编语言指令8086指令分类数据与转移地址的寻址方式数据传送类指令算术运算类指令逻辑运算类指令移位类指令标志位操作指令,转移指令循环控制指令子程序调用返回指令中断调用返回指令字符串操作指令I/O输入输出指令其它指令宏指令,所谓字符串是指一组代码或数据,并不一定是常规的由字符构成的。字符串操作指令就是对这组代码或数据进行相同功能处理的指令。字符串存放在一个连续的存储区域中。,3.13 字符串操作指令,3.13 字符串操作指令,8086系统提供了5类字符串操作指令:字符串传送MOVS(Move byte or word string)字符串比较CMPS(C
2、ompare 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(R
3、epeat string operation while not equal/not zero),字符串处理指令既可以按字节操作,也可以按字操作,且DST和SRC的寻址方式均为隐含寻址。这类指令要遵循的共同约定如下:,3.13 字符串操作指令, 若源串在存储器,则存储器地址由DS:SI确定; 若源串在寄存器,则:,3.13 字符串操作指令, 若目的串在存储器,则存储器地址必须由ES:DI确定; 若目的串在寄存器,则:,3.13 字符串操作指令, 字符串操作指令CPU执行后,(SI)或(DI)会自动地修改,其修改方向受DF控制。,3.13 字符串操作指令,1时,会自动地减1或2,0时,会自动地增
4、1或2,当DF=,受操作类型控制,字节操作时,增/减1字操作时,增/减2,3.13 字符串操作指令, 字符串处理指令的重复次数。 (重复执行的次数)CX,3.13 字符串操作指令,字符串操作指令有:,3.13 字符串操作指令,3.13 字符串操作指令,一、字符串传送指令,在MOVS DST,SRC中,当DST和SRC同为字节类型时,等同于MOVSB指令;当DST和SRC同为字类型时,等同于MOVSW指令。,3.13 字符串操作指令,例如指令 MOVS VAR1,VAR2并不是完成VAR1变量的内容传送到VAR2,而是将(DS:SI)中的内容传送到由(ES:DI)指定的位置,当VAR1和VAR2
5、均为字节型变量时,该指令等同于MOVSB,当VAR1和VAR2均为字型变量时,该指令等同于MOVSW。,3.13 字符串操作指令,说明:字符串传送指令对PSW的标志位无影响。 字符串传送指令每次只能完成一个字和字节的传送,而实际应用中,经常需要将一块存储区域的内容整体搬移到另一个位置,为此,8086提供了重复前缀。,3.13 字符串操作指令,二、重复前缀有三种形式:REPREPZ/REPEREPNZ/REPNE它们放在字符串操作指令之前,表示重复执行该指令,重复次数由CX决定。,3.13 字符串操作指令,1. 重复前缀REP相当于LOOP指令,3.13 字符串操作指令,当REP与MOVS指令配
6、合时,有REP MOVSB ;(ES:DI)(DS:SI)(字节传送), ; (SI)(SI)1, (DI)(DI)1, ;(CX)(CX)-1, (CX)0时重复执行, ; 即当(CX)0时退出循环REP MOVSW ;与REP MOVSB指令类似, ; 只是每次传送一个字,3.13 字符串操作指令,2.重复前缀REPZ/REPE相当于LOOPZ/LOOPE指令,3.13 字符串操作指令,3.重复前缀REPNZ/REPNE相当于LOOPNZ/LOOPNE指令,3.13 字符串操作指令,三、字符串比较指令,3.13 字符串操作指令,指令CMPS与CMP类似,比较结果不进行保存,只是用于设置PS
7、W中的标志位,但是,在字符串比较指令中,采用“源操作数”减去“目的操作数”,而在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配合使用,其含义有所不同。1REPZ CMPS比较两字符串时,当遇到第一个不相同的字符时,就跳出比较循环(ZF=0)。2R
8、EPNZ CMPS比较两字符串时,当遇到第一个相同的字符时,就跳出比较循环(ZF=1)。,3.13 字符串操作指令,例3.37 BUFFER1和BUFFER2为长度100的两个字型缓冲区,对比这两个缓冲区中的数据,如果找到相同的字,则在ADDR中保存该数据在BUFFER1中的地址,如果找不到,则在ADDR中置0FFFFH。解:设在数据段中已经定义好字型缓冲区BUFFER1、BUFFER2和字型变量ADDR,并将DS和ES都指向该数据段,则在代码段中编写下列程序:,3.13 字符串操作指令,LEASI,BUFFER1LEADI,BUFFER2MOV CX,100REPNZ CMPSWJZ FOU
9、NDMOV ADDR,-1JMP ELSEFOUND:SUB SI,2MOV ADDR,SIELSE:,3.13 字符串操作指令,四、字符串扫描指令,3.13 字符串操作指令,说明:SCAS指令与字符串比较指令类似,只是源操作数固定为AL或AX的内容。其它说明类似于字符串比较指令。字符串扫描指令会正常影响PSW中的6个状态标志位,从而后续指令可以对比较结果进行判断与转移操作。因此SCAS指令经常与REPZ/REPE、REPNZ/REPNE配合使用,其含义有所不同。,3.13 字符串操作指令,1REPZ SCAS比较(AL)或(AX)的内容与目的字符串的内容,也就是在目的字符串中查找指定的字符(
10、AL)或(AX),当找到第一个不相同的字符时,就跳出比较循环(ZF=0)。2REPNZ SCAS比较(AL)或(AX)的内容与目的字符串的内容,也就是在目的字符串中查找指定的字符(AL)或(AX),当找到第一个相同的字符时,就跳出比较循环(ZF=1)。,3.13 字符串操作指令,例3.38 在字节型缓存区BUFFER中保存有20000个数据,要求在其中查找字符串“12345”(以ASCII码表示),并将其在BUFFER的偏移地址存放在ADDR单元中,如果没有找到,则将0FFFFH存放在ADDR中。解:为了查找一串数据,首先应该在BUFFER中查找第一个数据,当找到后,再对后续的数据进行对比,如
11、果恰好都相同,则表示找到了找到的字符串;如果有一个字符不相同,则应该回到刚才的位置继续查找第一个数据,这一点很重要,可以避免漏掉要查找的字符串。,3.13 字符串操作指令,例如在BUFFER中有这样的字符串:“112345”,就容易造成漏检,如图3.6所示,当找到第一个字符“1”时,DI指向位置“B”,接着与第二个字符“2”比较,发现两者不同,这时DI已经指向位置“C”,如果不恢复原来的地址进行搜索,则程序找不到第二个“1”,从而使该正确的字符串漏检。,3.13 字符串操作指令,数据段的内容为:BUFFER DB 20000 dup(?)ADDRdw ?STRINGDB 12345并使DS和E
12、S都指向该数据段,则设计的程序为:MOV ADDR,-1LEA DI,BUFFERMOV CX,20000MOV AL,STRING;取第一个字符,STARTSEARCH:REPNZ SCASB;查找第一个字符JNZ NOFOUNDLEA SI,STRING+1PUSH CX;保存搜索次数PUSH DI;保存搜索指针MOV CX,4 ;比较后续字符REPZ CMPSBPOP DI;恢复搜索指针POP CX;恢复搜索次数JNZ STARTSEARCHFOUND:SUB DI,1 ;指针修正MOV ADDR,DINOFOUND:,3.13 字符串操作指令,五、字符串装入指令,3.13 字符串操作指
13、令,字符串装入指令不影响FLAG。每次执行都会从源数据区取一个值送到(AL)或(AX),重复操作意味着后面装人的内容将覆盖前面装人的内容,因此LODS指令很少与重复前缀配合使用。,3.13 字符串操作指令,六、字符串存储指令,3.13 字符串操作指令,字符串存储指令不影响FLAG。每次执行都会将(AL)或(AX)的值存储到目的数据区中,重复操作意味着对整个数据区置入相同的值,因此STOS指令经常与RET前缀配合使用,表示将指定的数据区域进行清零或置入同一个初值。,3.13 字符串操作指令,例3.39 对字型缓冲区BUFFER1(长度为200)进行清零,对字节型缓冲区BUFFER2(长度为256)置入初值55H。解:设在数据段中已经定义好缓冲区BUFFER1和BUFFER2,并让ES执行该数据段,则可以设计汇编语言程序:,3.13 字符串操作指令,LEADI,BUFFER1MOV CX,200XOR AL,ALREPSTOSWLEADI,BUFFER2MOV CX,256MOVAL,55HREPSTOSB,3.13 字符串操作指令,作业:20,