资源描述
微机原理及接口技术,第二级,第三级,第四级,第五级,微机原理及接口技术,微机原理及应用,第,3,章,3.3,串操作指令,常见串操作,计算字符串的长度、查找某个特定字符、改换字符、判断字符串是否一致等,串操作类指令,MOVS,、,CMPS,、,SCAS,、,LODS,、,STOS,注意事项,操作数的源串在当前数据段,DS,中,若不在,可使用段前缀指令;目的串必须在附加段,ES,中,且不能使用段前缀指令,字符串指令中的操作数只用于指出指令的操作类型。目的操作数与源操作数的逻辑地址由,ES,:,DI,和,DS,:,SI,指出,用,CX,存放要处理的字符串的元素个数。在执行带重复前缀的字符串指令时,每执行一次字符串操作指令,,CX,的内容自动减,1,用,DF,标志置来规定字符串处理方向。,DF=0,,由低向高,,DF=1,,相反,每处理完一个元素,自动修改,SI,和,DI,的内容,字符串处理过程可被中断,3.3.1,字符串的传送,MOVS,目的串,源串(,MOVSB/MOVSW,),把一个字节或一个字从源串传送到目的串,并自动修改,SI,和,DI,,指向下一个元素,通常加,REP,,完成块的传送,MOVSB,和,MOVSW,是,MOVS,的替代符,等价语句:,MOVS PAP1,,,PAP2,MOVSW,传送字符串程序片断:,MOV SI,,,2000H,MOV DI,,,4000H,MOV CX,,,200H,CLD,REP MOVSB,LODS,源串(,LODSB/LODSW,),指令是把由,SI,寻址的源串元素装入到寄存器,AL/AX,中,并修改,SI,,指向下一元素,通常不加前缀,地址增减取决于方向标志,DF,,,DF=0,增量修改,,DF=1,减量修改,替代符,LODSB/LODSW,举例:编制一程序段,要求将,0700H,单元开始的,5,个字节的内容逐一装入累加器中进行处理,处理完后,再送入,0700H,为首地址的内存区中,3.3.2,字符串的存与取,CLD,MOV SI,,,0700H,MOV CX,,,5,LOOP1,:,LODSB,PUSH CX,:,POP CX,DEC CX,MOV DI,,,AL,JNZ LOOP1,STOS,目的串(,STOSB/STOSW,),指令所完成的操作和,LODS,指令相反。他将累加器,AL/AX,中的内容存入附加段中由,DI,寻址的存储单元中,并自动修改地址指针,与,REP,结合,可使一串内存单元填满相同的数,替代符,STOSB/STOSW,举例:若对某一数据缓冲区清零,并设(,ES,),=3000H,,数据缓冲区首地址,DI=0200H,,缓冲区长度为,100,个字节,则可用以下的程序段:,CLD,MOV AX,,,3000H,MOV ES,,,AX,MOV DI,,,0200H,MOV CX,,,100,MOV AL,,,00,REP STOSB,CMPS,源串,目的串(,CMPSB/CMPSW,),用源串减去目的串,根据操作结果影响标志,结果不回送,源串由,SI,指出,目的串由,DI,指出,源操作数写在左边,目标操作数写在右边,与其他指令不同,CPMS,的替代符,CMPSB,、,CMPSW,,使用方法与,MOVSB/MOVSW,相同,3.3.3,字符串的比较与扫描,SCAS,目的串(,SCASB/SCASW,),功能是在字符串中查找一个与已知数值相同或不同的元素。它以,AL,或,AX,的内容与附加段,ES,中用,DI,寻址的目的串元素进行比较,利用结果影响标志位,来反映扫描结果,执行结果不改变源串、目的串的数据,与,REPNE,或,REPNZ,配合使用,,CX,不等于,0,且,ZF=0,,查找相同元素;,CX,不等于,0,且,ZF=1,,查找不同元素,SCAS,替代符,SCASB/SCASW,3.3.4,重复前缀指令,重复前缀指令,REP,与,MOVS,、,STOS,指令联合使用时,他的意义是“字符串未处理完时重复”,REPE,(相等时重复)和,REPZ,(等于,0,时重复)实际上是相同的。将他们与,CMPS,、,SCAS,指令联合使用,可对本条指令操作所设置的,ZF,进行测试,,ZF=1,且,CX,不等于,0,,重复,否则退出,REPNE,(不等于时重复)和,REPNZ,(不等于,0,时重复)意义相同。与,CMPS,、,SCAS,联合使用,,ZF=0,且,CX,不等于,0,,则重复,否则退出,3.4,控制转移类指令,控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的常用指令,重点掌握:,JMP,/,Jcc,/,LOOP,/,JCXZ,CALL,/,RET,INT n,/,IRET,常用系统功能调用,控制转移类指令通过,改变,IP,(和,CS,),值,实现程序执行顺序的改变,3.4.1,程序转移的地址,相对寻址方式,指令代码中提供目的地址,相对,于当前,IP,的位移量,转移到的目的地址(转移后的,IP,值)就是当前,IP,值加上位移量,直接寻址方式,指令代码中提供目的逻辑地址,转移后的,CS,和,IP,值,直接,来自指令操作码后的目的地址操作数,间接寻址方式,指令代码中指示寄存器或存储单元,目的地址从寄存器或存储单元中,间接,获得,用标号表达,用标号表达,用寄存器或存储器操作数表达,目标地址的寻址范围:段内,寻址,段内转移,近转移(,near,),在当前代码段,64KB,范围内转移(,32KB,范围),不需要更改,CS,段地址,,只要改变,IP,偏移地址,段内转移,短转移(,short,),转移范围可以用一个字节表达,在段内,128,127,范围的转移,代码段,代码段,目标地址的寻址范围:段间,寻址,段间转移,远转移(,far,),从当前代码段跳转到另一个代码段,可以在,1MB,范围,需要,更改,CS,段地址和,IP,偏移地址,目标地址必须用一个,32,位数表达,叫做,32,位远指针,它就是逻辑地址,代码段,代码段,实际编程时,汇编程序会根据目标地址的属性,,自动处理,成短转移、近转移或远转移,程序员可用操作符,short,、,near ptr,或,far ptr,强制成为需要的转移类型,3.4.2,无条件转移指令,只要执行无条件转移指令,JMP,,就使程序转到指定的目标地址,从目标地址处开始执行指令,操作数,label,是要转移到的,目标地址,(,目的地址,、,转移地址,),JMP,指令分成,4,种类型:, 段内转移、相对,(,直接,),寻址,,JMP disp8/disp16,段内转移、间接寻址,,JMP MEM/REG,段间转移、直接寻址,,JMP ADDR,段间转移、间接寻址,,JMP MEM,JMP label,;程序转向,label,标号指定的地址,JMP,label,;,段内转移、相对寻址,;IPIP,位移量,JMP,r16/m16,;,段内转移、间接寻址,;IPr16/m16,JMP,far ptr label,;,段间转移、直接寻址,;IP,偏移地址,CS,段地址,JMP,far ptr mem,;,段间转移,间接寻址,;IPmem,CSmem,2,演示,演示,演示,演示,演示,3.4.3,条件转移指令,条件转移指令,Jcc,根据指定的条件确定程序是否发生转移。其通用格式为:,Jcc,label,;,条件满足,发生转移,;,IPIP,8,位位移量;,;,否则,顺序执行,label,是一个标号、一个,8,位位移量,表示,Jcc,指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移,label,只支持短转移的相对寻址方式,Jcc,指令的分类,Jcc,指令不影响标志,但要利用标志(,表,3-4,),根据利用的标志位不同,分成三种情况:, 判断单个标志位状态, 比较无符号数高低, 比较有符号数大小,Jcc,指令实际虽然只有,16,条,但却有,30,个助记符,采用多个助记符,目的是为了方便记忆和使用,1.,判断单个标志位状态,JZ,/,JE,和,JNZ,/,JNE,利用零标志,ZF,,判断结果是否为零(或相等),JS,和,JNS,利用符号标志,SF,,判断结果是正是负,JO,和,JNO,利用溢出标志,OF,,判断结果是否产生溢出,JP,/,JPE,和,JNP,/,JPO,利用奇偶标志,PF,,判断结果中“,1”,的个数是偶是奇,JC,/,JB,/,JNAE,和,JNC,/,JNB,/,JAE,利用进位标志,CF,,判断结果是否进位或借位,例题,题目:将,AX,中存放的无符号数除以,2,,如果是奇数则加,1,后除以,2,问题:如何判断,AX,中的数据是奇数还是偶数?,解答:,判断,AX,最低位是“,0”,(偶数),还是“,1”,(奇数)。可以用位操作类指令,1,:,用逻辑与指令将除最低位外的其他位变成,0,,保留最低位不变。判断这个数据是,0,,,AX,就是偶数;否则,为奇数,2,:,将最低位用移位指令移至进位标志,判断进位标志是,0,,,AX,就是偶数;否则,为奇数,3,:,将最低位用移位指令移至最高位(符号位),判断符号标志是,0,,,AX,就是偶数;否则,为奇数,例题解答,1,用,JZ,指令实现,test ax,01h,;测试,AX,的最低位,D,0,(不用,AND,指令,以免改变,AX,),jz,even,;标志,ZF,1,,即,D,0,0,:,AX,内是偶数,程序转移,add ax,1,;标志,ZF,0,,即,D,0,1,:,AX,内的奇数,加,1,even:,shr ax,1,;,AXAX2,用右移一位的方法实现除以,2,。,本例中用,RCR,指令比,SHR,指令更好。,例题解答,2,用,JNC,指令实现,mov bx,ax,shr bx,1,;将,AX,的最低位,D,0,移进,CF,jnc,even,;标志,CF,0,,即,D,0,0,:,AX,内是偶数,程序转移,add ax,1,;标志,CF,1,,即,D,0,1,:,AX,内的奇数,加,1,even:,shr ax,1,;,AXAX2,还可用,SAR,、,ROR,和,RCR,指令,例题解答,3,用,JNS,指令实现,mov bx,ax,ror bx,1,;将,AX,的最低位,D,0,移进最高位(符号位,SF,),jns,even,;标志,SF,0,,即,D0,0,:,AX,内是偶数,程序转移,add ax,1,;标志,SF,1,,即,D0,1,:,AX,内的奇数,加,1,even:,shr ax,1,;,AXAX2,错误!,循环指令不影响,SF,等标志,ADD BX,0,;增加一条指令,例 判断是否为字母,Y,;寄存器,AL,中是字母,Y,(含大小写),则令,AH,0,,否则令,AH,1,cmp al,y,;比较,AL,与小写字母,y,je,next,;相等,转移,cmp al,Y,;不相等,,;继续比较,AL,与大写字母,Y,je,next,;相等,转移,mov ah,-1,;不相等,令,AH,1,jmp done,;无条件转移指令,next:mov ah,0,;相等的处理:令,AH,0,done:,例 偶校验,;对,DL,寄存器中,8,位数据进行,偶校验,;校验位存入,CF,标志,test dl,0ffh,;,使,CF,0,,同时设置,PF,标志,jpe,done,;,DL,中“,1”,的个数为偶数,;,正好,CF,0,,转向,done,stc,;,DL,中“,1”,的个数为奇数,设置,CF,1,done:,;,完成,2.,比较无符号数高低,无符号数的大小用高(,Above,)、低(,Below,)表示,需要利用,CF,确定高低、利用,ZF,标志确定相等(,Equal,),两数的高低分成,4,种关系,对应,4,条指令,JB,(,JNAE,):目的操作数低于(不高于等于)源操作数,JNB,(,JAE,):目的操作数不低于(高于等于)源操作数,JBE,(,JNA,):目的操作数低于等于(不高于)源操作数,JNBE,(,JA,):目的操作数不低于等于(高于)源操作数,3.,比较有符号数大小,判断有符号数的大(,Greater,)、小(,Less,),需要组合,OF,、,SF,标志、并利用,ZF,标志确定相等与否,两数的大小分成,4,种关系,分别对应,4,条指令,JL,(,JNGE,):目的操作数小于(不大于等于)源操作数,JNL,(,JGE,):目的操作数不小于(大于等于)源操作数,JLE,(,JNG,):目的操作数小于等于(不大于)源操作数,JNLE,(,JG,):目的操作数不小于等于(大于)源操作数,将,AX,和,BX,中较大的数值存放在,WMAX,内存单元,cmp ax,bx,;,比较,AX,和,BX,jae,next,;,若,AXBX,,转移,xchg ax,bx,;,若,AX,BX,,交换,next:,mov wmax,ax,如果,AX,和,BX,存放的是有符号数,,则条件转移指令应采用,JGE,指令,例 上题(另解),cmp ax,bx,;,比较,AX,和,BX,jae,next,mov wmax, bx,;,若,AX,BX,,,wmax,BX,jmp,done,next:,mov wmax,ax,;,若,AXBX,,,wmax,AX,done:,例 上题(另解对比),cmp ax,bx,;,比较,AX,和,BX,jbe,next,mov wmax, ax,;,若,AX,BX,,,wmax,AX,jmp,done,next:,mov wmax,bx,;,若,AXBX,,,wmax,BX,done:,例,设有,10,个数据存放在以,2000H,单元为首地址的数据缓冲区中,试编写找出其中最大数,并存入,2100H,单元的程序,MAXSTA: MOV BX,2000H,MOV AL,BX,MOV CX,9,LAB1: INC BX,CMP AL,BX,JAE LAB2,MOV AL,BX,LAB2: DEC CX,JNZ LAB1,MOV BX,2100H,MOV BX,AL,3.4.4,循环控制指令,一段代码序列多次重复执行就是循环,8088,设计有针对,CX,计数器的计数循环指令,LOOP,label,;,循环指令,;首先,CXCX,1,;然后判断;若,CX0,,转移,JCXZ,label,;,为,0,循环指令,:如果,CX,0,,则转移,label,操作数采用相对短寻址方式,还有,LOOPZ,/,LOOPE,和,LOOPNZ,/,LOOPNE,两条指令,dec cx,jnz label,例:将数据段的,Sbuf,指示的,1KB,数据送到附加段的,Dbuf,区,mov cx,400h,;设置循环次数:,1K,1024,400H,mov si,offset sbuf,;设置循环初值:,SI,指向数据段源缓冲区开始,mov di,offset dbuf,;,DI,指向附加段目的缓冲区开始(附加段),again:,mov al,si,;循环体:实现数据传送,mov es:di,al,;每次传送一个字节,inc si,;,SI,和,DI,指向下一个单元,inc di,loop again,;循环条件判定:循环次数减,1,,不为,0,转移(循环),例(按字),mov cx,2,00h,;设置循环次数:,1K2,200H,mov si,offset sbuf,;设置循环初值:,SI,指向数据段源缓冲区开始,mov di,offset dbuf,;,DI,指向附加段目的缓冲区开始(附加段),again:,mov,ax,si,;循环体:实现数据传送,mov es:di,ax,;每次传送一个字,add,si,2,;指向下一个(字)单元,add,di,2,loop again,;循环条件判定:循环次数减,1,,不为,0,转移(循环),3.4.5.,子程序调用与返回指令,子程序是完成特定功能的一段程序,当主程序(调用程序)需要执行这个功能时,采用,CALL,调用指令转移到该子程序的起始处执行,当运行完子程序功能后,采用,RET,返回指令回到主程序继续执行,演示,转移,指令,有去无回,子程序,调用需要返回,,,其中利用堆栈保存返回地址,子程序调用指令,CALL,CALL,指令分成,4,种类型(类似,JMP,),CALL label,;段内调用、直接寻址,CALL r16/m16,;段内调用、间接寻址,CALL far ptr label,;段间调用、直接寻址,CALL far ptr mem,;段间调用、间接寻址,CALL,指令需要保存返回地址:,段内调用,入栈偏移地址,IP,SPSP,2,,,SS:SPIP,段间调用,入栈偏移地址,IP,和段地址,CS,SPSP,2,,,SS:SPCS,SPSP,2,,,SS:SPIP,子程序返回指令,RET,根据段内和段间、有无参数,分成,4,种类型,RET,;无参数段内返回,RET i16,;有参数段内返回,RETF,;无参数段间返回,RETF i16,;有参数段间返回,需要弹出,CALL,指令压入堆栈的返回地址,段内返回,出栈偏移地址,IP,IPSS:SP,,,SPSP,2,段间返回,出栈偏移地址,IP,和段地址,CS,IPSS:SP,,,SPSP,2,CSSS:SP,,,SPSP,2,例 十六进制转换为,ASCII,码的子程序,;子程序:,将,DL,低,4,位的一位,16,进制数,转换,成,ASCII,码,htoascproc,and dl,0fh,;只取,DL,的低,4,位,or dl,30h,;,DL,高,4,位变成,3,cmp dl,39h,;是,0,9,,还是,0Ah,0Fh ?,jbe htoend,;是,0,9,,转移,add dl,7,;是,0Ah,0Fh,,加上,7,htoend:,ret,;子程序返回,htoascendp,转换原理,;主程序:调用,子程序,mov dl,28h,call,htoasc,3.4.6,中断和中断返回指令,中断,(,Interrupt,)是又一种改变程序执行顺序的方法,8088CPU,支持,256,个中断,每个中断用一个编号(中断向量号)区别,中断指令有,3,条:,INT i8 IRET INTO,本节主要掌握类似子程序调用指令的中断调用指令,INT i8,中断指令,INT i8,;中断调用指令:产生,i8,号中断,;主程序使用,其中,i8,表示中断向量号,IRET,;中断返回指令:实现中断返回,;中断服务程序使用,3.4.7,处理器控制类指令,处理器控制类指令用来控制,CPU,的状态,使,CPU,暂停、等待或空操作等,NOP,;空操作指令,等同于“,xchg ax,ax,”,指令,占,3,个时钟,SEG:,;段超越前缀指令:,CS:,,,SS:,,,DS:,,,ES:,HLT,;暂停指令:,CPU,进入暂停状态,还有其他指令:,LOCK,(总线封锁),ESC,(交权),WAIT,(等待),总结,本章展开了,8086CPU16,位指令系统的常用指令,希望大家就如下几个方面进行一下总结:,操作数寻址方式和目的地址寻址方式,指令支持的操作数形式,常用指令的助记符和功能,指令对标志的影响,通过复习整理,形成指令系统的整体概念,进而掌握常用指令,指令执行,掌握寻址方式,熟悉汇编语言的语句格式,掌握,8088/8086,基本指令:,数据传送:,MOV,XCHG,XLAT,、,PUSH,POP,、,LEA,加减运算:,ADD,SUB,、,ADC,SBB,、,CMP,、,INC,DEC,位操作:,AND,OR,XOR,NOT,TEST,、,SHL,SHR,SAR,、,ROL,ROR,RCL,RCR,控制转移:,JMP,Jcc,LOOP,、,CALL,RET,、,INT n,目的地址相对寻址方式,目的地址寄存器段内间接寻址方式,目的地址存储器段内间接寻址方式,目的地址段间直接寻址方式,目的地址存储器段间间接寻址方式,条件转移指令的含义,JZ/JE,Jump on Zero/Equal,JNZ/JNE,Jump on Not Zero/Equal,JS,Jump on Sign,JNS,Jump on Not Sign,JP/JPE,Jump on Parity/Parity Even,JNP/JPO,Jump on Not Parity/Parity Odd,JO,Jump on Overflow,JNO,Jump on Not Overflow,JC/JB/JNAE,Jump on Carry/Below/Not Above or Equal,JNC/JNB/JAE,Jump on Not Carry/Not Below/Above or Equal,JBE/JNA,Jump on Below or Equal/Not Above,JNBE/JA,Jump on Not Below or Equal/Above,JL/JNGE,Jump on Less/Not Greater or Equal,JNL/JGE,Jump on Not Less/Greater or Equal,JLE/JNG,Jump on Less or Equal/Not Greater,JNLE/JG,Jump on Not Less or Equal/Greater,奇偶校验,奇偶校验是计算机中最常使用的校验方法,因为不论用硬件还是用软件都很容易实现,偶校验:,如果数据中“,1”,的个数不是偶数,则校验位是,1,,使得包括校验位在内的数据中“,1”,的个数为偶数;否则,校验位为,0,奇校验:,如果数据中“,1”,的个数不是奇数,则校验位是,1,,使得包括校验位在内的数据中“,1”,的个数为奇数;否则,校验位为,0,主程序与子程序,CALL label,主程序,RET,子程序,回到,CALL,指令后的指令处,返回地址,十六进制数转换为,ASCII,码的原理,主程序与中断服务程序,主程序,IRET,中断服务程序,断点,中断请求,中断请求可以来自处理器外部的中断源,,也可以由处理器执行指令引起:,例如执行,INT i8,指令。,
展开阅读全文