




已阅读5页,还剩288页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章Intel8086/8088指令系统,4.1指令格式与寻址方式4.28086/8088的指令系统4.3汇编语言程序格式4.4汇编语言程序设计4.5汇编语言程序使用示例,4.1指令格式及寻址方式,4.1.18086/8088的通用指令格式机器语言指令是由二进制代码组成的。一条指令是由操作码与操作数字段构成的,其一般格式为操作码字段+操作数字段操作码字段指明计算机所要执行的操作(即功能);操作数字段指出在指令执行过程中所需要的操作数。例如:ADDAX,BX,其中ADD是操作码助记符,指明做加法运算;AX和BX是操作数助记符,指出被加数和加数,AX还存放相加后的结果(原来的被加数被冲掉)。对有操作数的指令,在执行指令所规定的操作之前首先要寻找操作数。操作数可放在CPU寄存器中,或内存单元中,或I/O端口内,寻找这些操作数的方式称为寻址方式,即指令中用于说明操作数或操作数所在地址的方法。,4.1.2立即寻址特点:操作数直接存放在指令中,作为指令的一部分存放在代码段里,这种操作数称为立即数,这种寻址方式称为立即寻址。立即数常用于给寄存器或存储单元赋初值(即初始化),立即数只能用于源操作数字段,不能用于目的操作数字段。例4.1MOVAX,5;(AX)5MOVAX,1234H;(AX)1234HMOV200H,AX;(错误的,立即数不能作目的操作数)5和1234H为立即数,立即数可以是二进制、十进制、十六进制的。,4.1.3寄存器寻址特点:操作数在某寄存器中,存取这类操作数在CPU内部进行,所以执行速度快。存放16位操作数的寄存器有:AX,BX,CX,BP,SP,SI,DI;存放8位操作数的寄存器有:AH,AL,BH,CH,CL,DH,DL。例4.2已知:(BX)=1234H。执行MOVAX,BX;(AX)(BX)执行后:(AX)=1234H,(BX)不变。,4.1.4存储器寻址操作数在存储器中。存储器是分段管理的,要找到操作数,必须指明操作数所在的段(段基址由段寄存器指明)及段内偏移地址(以有效地址EA的形成方式指出)。1直接寻址方式特点:指令中直接给出操作数在段内的偏移量,段基址隐含给出或用段前缀指明。该寻址方式适用于处理单个变量。一般操作数存放在数据段中,故操作数的物理地址为物理地址=(DS)16+EA=(段基址的寄存器)16+偏移地址,例4.3已知:(DS)=4000H,1000H=3355H。执行MOVAX,1000H执行后:(AX)=3355H,物理地址=40000H+1000H=41000H,EA=1000H,寻址过程如图4-1所示。,图4-1例4.3直接寻址示意图,说明:(1)偏移地址(EA)在指令中直接给出。指令中缺省段寄存器说明,段基址在DS段寄存器中;否则在指令中需对段寄存器加以说明。例如:MOVAX,ES:2300H。(2)可用符号地址代替数值地址,例如:MOVAX,VALUE;此时,VALUE为存放操作数单元的符号地址,即变量名,也可写成:MOVAX,VALUE,两者等价。,2寄存器间接寻址特点:操作数有效地址在基址寄存器BP、DI中,而操作数则在存储器中。它适用于表格处理,执行完一条指令后,只需修改寄存器内容就可取出表格中的下一项元素。(1)指令中的有效地址(EA)存放在BX,SI,DI寄存器中,则操作数在数据段中,即操作数的物理地址为,(2)若有效地址存放在BP寄存器中,则操作数在堆栈段中,即操作数物理地址为物理地址=(SS)16+(BP)(3)可使用段跨越前缀来取得其他段中的数据,如:MOVAX,ES:BX注意:MOVAX,BX;(AX)(BX)与上面的MOVAX,BX含义不同。,例4.4已知:(DS)=1000H,(BX)=0A00H。执行MOVAX,BX执行后:(AX)=4422H,物理地址=10000H+0A00H=10A00H,如图4-2所示。,图4-2例4.4寄存器间接寻址示意图,3寄存器相对寻址特点:操作数的有效地址是一个基址寄存器或变址寄存器的内容和指令中指定的8位或16位位移量(即偏移量)之和。适用于表格处理,修改基址或变址寄存器的内容来取得表格中的元素。一般形式:,物理地址=(SS)16+(BP)+8位或16位位移量,例4.5已知(DS)=2000H,(SI)=50H,DISP=1000H,其中DISP为16位位移量的符号地址。执行MOVAX,DISPSI或MOVAX,DISP+SI执行后:(AX)=6688H,物理地址=20000H+1000H+50H=21050H,如图4-3所示。该寻址方式可使用段跨越前缀,例如:MOVDL,ES:STRINGSI。,图4-3例4.5寄存器相对寻址示意图,4基址变址寻址特点:操作数的有效地址是一个基址寄存器的内容与一个变址寄存器内容之和。,适用表格或数组处理,表格或数组首地址可存放在基址寄存器中。,例4.6已知:(DS)=3000H,(BX)=1100H,(SI)=0050H。执行MOVAX,BXSI或MOVAX,BI+SIEA=1100H+0050H=1150H物理地址=30000H+1150H=31150H执行后:(AX)=5678H。,5相对基址变址寻址特点:操作数的有效地址是一个基址寄存器与一个变址寄存器的内容之和再加上8位或16位位移量。同样,当基址寄存器为BX时,用DS作为段寄存器;而当基址寄存器为BP时,则用SS作为段寄存器。因此物理地址为,例4.7已知(DS)=5000H,(BX)=3000H,(SI)=2000H,BUFF=0350H,(55350H)=6684H。执行MOVAX,BUFFSIBX或MOVAX,BUFFBXSI或MOVAX,BUFF+SI+BX物理地址=(DS)16+(BX)+(SI)+BUFF=50000H+3000+2000+0350=55350H执行后:(AX)=6684H。该寻址方式为堆栈和多重表格处理提供了方便,无段跨越前缀。,4.1.5I/O端口寻址1.直接端口寻址方式I/O端口地址以8位立即数方式在指令中直接给出。例如:INAL,PORT;其中,PORT为寻址端口编号,只能在0255范围之内。,2.间接端口寻址方式I/O地址超过8位时,应放在DX寄存器中,即通过DX间接寻址所能寻址的端口编号为065535。如OUTDX,AL,表示将AL的内容输出到由DX指出的端口中去。在16位PC机中,仅用A9A010条地址线表示I/O端口,所以DX间接寻址的范围为01023,即03FFH。,4.28086/8088的指令系统,目前许多计算机的指令系统包含了几百条指令,十几种寻址方式,这对丰富汇编语言程序设计,提高高级语言的执行效率是有利的。我们称这些计算机为“复杂指令系统计算机”,简称CISC(ComplexInstructionSetComputer)。基本指令集是80X86微机不断发展的指令集的一个基本子集,包括8086/8088指令系统的全部指令。IBMPC/XT微型计算机的微处理器采用的是8088芯片,本节将介绍8086/8088微处理器的指令系统。指令系统是指处理器所能完成的所有指令的集合,它是微处理器设计时就确定了的。,所以,对于不同的微处理器,其指令系统中所包含的具体指令是各不相同的。由于微处理器8088与8086的指令系统是完全一样的,所以,本节介绍的指令系统同样适用于8086CPU。8086/8088CPU指令系统可以分成下列几类:(1)数据传送指令;(2)算术运算指令;(3)逻辑运算和移位指令;(4)转移和循环控制指令;(5)调用和返回指令;(6)字符串操作指令;(7)处理器控制指令。,为了便于了解指令的形式和功能,对指令中的操作数符号的约定如下:OPR:操作数;DST:在多操作数指令中,表示目标操作数;SRC:在多操作数指令中,表示源操作数;SEG:段寄存器;REG:通用寄存器;MEM:8位或16位存储器;DATA:8位或16位立即数。,4.2.1数据传送指令数据传送类指令是计算机中最基本、最常用、最重要的一类指令。这里讨论的数据传送指令仅指CPU中的寄存器与寄存器或者寄存器与存储器之间的数据传送指令。这类指令的基本格式及功能说明见表4-1。表中除了SAHF和POPF指令之外,其余指令对标志位寄存器F的各位均不影响。指令中出现两个操作数时,目的操作数在前,源操作数在后,并且目的操作数的寻址方式一定不能为立即数和段寄存器CS。,表4-1数据传送类指令的格式和功能,1.通用数据传送指令(1)MOV指令。格式:MOVDST,SRC操作:(DST)SRC),即把源操作数的内容送目的操作数。其中DST代表目的操作数,SRC代表源操作数。说明:MOV指令不允许两个存储器单元传送数据,即DST和SRC不能同时为存储器操作数,DST目的操作数不允许使用立即寻址方式。MOV指令也不允许在两个段寄存器之间传送数据。CS不能作目的操作数。对标志位无影响。,(2)交换指令。格式:XCHGOPR1,OPR2操作:OPR1OPR2,即将操作数(OPR1)与操作数(OPR2)进行交换。说明:该指令在使用过程需要注意的几点与MOV指令说明相同。一条交换指令完成的功能相当于三条MOV指令完成的功能。,(3)压入堆栈指令。格式:PUSHSRC操作:(SP)(SP)-2,(SP)+1),(SP)SRC,即SP指针先减2,后按字入栈。注意:堆栈的存取必须以字为单位。堆栈是按“后进先出”的方式工作的一个存储区,只有一个出入口,用一个堆栈指针寄存器SP来指示进出栈操作。SP的工作内容在任何时候都指向当前的栈顶,源操作数SRC除了立即寻址之外的其他存储器操作数寻址方式均可使用。,(4)出栈指令。格式:POPDST操作:(DST)(SP)+1,(SP),(SP)(SP)+2,即先出栈,后指针加2,按字取出。目标操作数DST的寻址方式为除了立即寻址方式之外的所有存储器操作数寻址方式和寄存器寻址方式。,(5)有效地址送寄存器指令。该指令把存储器操作数的有效地址送到指定的寄存器中。格式:LEAREG,SRC操作:(REG)SRC,即把源操作数(SRC应是存储器操作数)的有效地址送到指定的寄存器(REG)中。例如:LEADX,BX+SI+0B62H执行前:(BX)=3000H,(SI)=0050H执行后:(DX)=3000H+0050H+0B62H=3BA2H(有效地址或偏移地址),注意:这里DX寄存器得到的是偏移地址而不是该存储单元的内容。例如:(SI)=0500H,(BX)=1000H,(DS)=2000HDS:0500H单元存放3412HDS:1000H单元存放00AAHMOVAX,SI;(AX)SI,(AX)=1234HLEAAX,SI;(AX)EA,(AX)=0500HMOVDI,BX;(DI)BX,(DI)=AA00HLEADI,BX;(DI)BX,DI=1000H,(6)指针送寄存器和DS指令。格式:LDSREG,SRC操作:(REG)(SRC),(DS)(SRC+2),即把源操作数指定的4个相继字节的内容作为一个地址指针送到由指令指定的寄存器和DS寄存器。REG为16位寄存器名。例如:(DS)=9000H,(90012H)=0150H,(90014H)=4000H执行LDSSI,12H源操作数物理地址=9000H16+0012H=90012H,即将90012H开始的4个单元的内容送到SI和DS中。执行后:(SI)=0105H,(DS)=4000H,如图4-4所示。,(7)指针送寄存器和ES指令。格式:LESREG,SRC操作:(REG)(SRC)(ES)(SRC+2)把源操作数指定的4个相继字节的内容作为一个地址指针送到由指令指定的寄存器REG和ES中。,例如,执行前:(DS)=0A000H,(BX)=0800H,(0A0800H)=0230H,(0A0802H)=2000H。执行LESDI,BX执行后:(DI)=0230H,(ES)=2000H;0A000H:0800H字单元存放的内容为3002H;0A000H:0802H字单元存放的内容为0020H。,(8)累加器专用传送指令。输入指令。格式:INAL,PORT;字节输入INAX,PORT;字输入操作:(AL)(PORT),(AX)(PORT),从外设读入数据。格式:INAL,DX;字节输入INAX,DX;字输入操作:(AL)(DX)(字节),(AX)(DX)+1,(DX)(字),输出指令。格式:OUTPORT,AL;字节输出OUTPORT,AX;字输出操作:PORT(AL)(字节),PORT+1,PORT(AX)(字),将数据传送给外设。格式:OUTDX,AL;字节输出OUTDX,AX;字输出操作:(DX)(AL)(字节),(DX)+1,(DX)(AX)(字),IN/OUT指令有两种格式,选择哪一种,取决于外部设备端口地址的宽度。格式指令有两个字节,称长格式;格式只有一个字节,称短格式。例如:下面六条指令先将外设端口16H的内容(16位)传送到存储单元MEMWORD中;再从外设端口04ABH送一个字到AX中;最后将AX输出到端口地址为0123H的外设上。,INAX,16HMOVMEM-WORD,AXMOVDX,04ABHINAX,DXMOVDX,0123HOUTDX,AX,XLAT换码指令。格式:XLATOPR或XLAT操作:(AL)(BX)+(AL),将AL中的当前内容转换为某一种代码。在使用这条指令前,先建立一个字节表格,OPR为表格首地址,应存入BX寄存器中,待转换的代码应放在AL寄存器中,该代码是相对于表格首地址的位移量,再根据(BX)+(AL)所求得的地址读取所要的代码,并存入AL中。该指令常用于查表,根据元素在表格中的位置查表求元素的值。,例4.8在当前数据段中,从TABLE存储单元开始连续存放了09的ASCII码,在程序中将BX寄存器赋值为TABLE,等待转换数字符09放在AL中,执行如下程序段,即可查得AL中字符的ASCII码,如图4-5所示。,LEABX,TABLE;BXTABLMOVAL,6;AL6XLATTABLE;AL36H,图4-5XLAT指令操作示意图,2.标志传送指令(1)LAHF指令。格式:LAHF操作:(AH)(PSW的低字节),即标志寄存器的低字节传送到AH寄存器中。(2)SAHF指令。格式:SAHF操作:(PSW的低字节)(AH),即将AH寄存器的内容传送到标志寄存器的低字节中。该指令影响状态标志SF、ZF、AF、PF和CF。,(3)PUSHF指令。格式:PUSHF操作:(SP)(SP)-2,(SP)+1,(SP)(PSW),标志寄存器的内容入栈。(4)POPF指令。格式:POPF操作:(PSW)(SP)+1,(SP),(SP)(SP)+2,标志寄存器的内容出栈。该指令影响标志寄存器的所有标志位。数据传送指令除了SAHF和POPF两条外,执行结果都不影响标志位。,4.2.2算术运算指令,图4-6加、减运算的操作数,1.加法指令(1)ADD加法指令。格式:ADDDST,SRC操作:(DST)(DST)+(SRC),完成两个操作数相加,结果传送到目的操作数中。说明:ADD不允许两个存储器单元内容相加,即DST和SRC不能同时为存储器操作数,DST目的操作数不允许使用立即寻址方式。ADD指令也不允许在两个段寄存器之间相加。对标志位有影响,主要是CF、ZF、OF、SF标志位。,(2)ADC带进位加法指令。格式:ADCDST,SRC操作:(DST)(DST)+(SRC)+(CF),即完成两个操作数及进位(CF)三者相加,结果传送到目的操作数中。说明:与ADD指令说明相同。例4.9已知(DX)=0002H,(AX)=0E365H,(BX)=0003H,(CX)=0D024H。执行ADDAX,CXADCDX,BX第一条指令执行后,(AX)=0B389H,SF=1,ZF=0,CF=1,OF=0;第二条指令执行后,(DX)=0006H,SH=0,ZF=0,CF=0,OF=0。,(3)INC加1指令。格式:INCDST操作:(DST)(DST)+1,即操作数加1。说明:DST单操作数不允许使用立即寻址方式。除了CF标志位之外,对其他标志位均有影响。,2.减法指令(1)SUB减法指令。格式:SUBDST,SRC操作:(DST)(DST)-(SRC),目的操作数与源操作数相减,差值传达到目的操作数中。说明:SUB指令不允许两个存储器单元内容相减,即DST和SRC不能同时为存储器操作数,DST目的操作数不允许使用立即寻址方式。SUB指令也不允许在两个段寄存器之间相减。对标志位有影响,主要是CF、ZF、OF、SF标志位。,(2)SBB带借位的减法指令。格式:SBBDST,SRC操作:(DST)(DST)-(SRC)-(CF),该指令与SUB的操作基本相同,惟一不同是还需减去借位位(CF)。一般在多字节相减时,先进行低字节内容相减,然后再进行高字节内容相减,这时需减去低字节所产生的借位。说明:与SUB指令说明相同。,(5)CMP比较指令。格式:CMPOPR1,OPR2操作:(OPR1)-(OPR2),该指令与SUB指令一样,执行减法操作,但它并不保存结果,只是根据结果设置状态标志位,用于分支程序。,3.乘法指令(1)MUL无符号乘法指令。格式:MULSRC操作:字节操作数:AX)(AL)SRC;字操作数:(DX,AX)(AX)SRC。该指令要求被乘数必须存放在AL或AX中,乘数必须存放在寄存器或存储器单元中,不能是立即数。乘积存放在AX或DX、AX中。,说明:通用寄存器中存放乘数:MULREG。MULSI;(DX)(AX)(AX)(SI)MULDH;(AX)(AL)(DH)存储单元存放乘数:MULMEM。MULSI;(AX)(AL)SIMULBUFFER;(DX)(AX)(AX)BUFFER,(2)IMUL带符号数乘法指令。格式:IMULSRC操作:字节操作数:(AX)(AL)SRC;字操作数:(DX,AX)(AX)SRC。该指令与MUL指令字操作一样,仅操作数为有符号数。说明与MUL相同。,4.除法指令(1)DIV无符号数除法指令。格式:DIVSRC操作:16位被除数,除数为8位:(AX)/SRC(AL)(商)(AX)/SRC(AH)(余数)32位被除数,除数为16位:(DX)(AX)/SRC(AX)(商)(DX)(AX)/SRC(DX)(余数),(2)IDIV带符号数除法指令。格式:IDIVSRC操作:带符号数16位被除数,带符号数除数为8位:(AX)/SRC(AL)(商)(AX)/SRC(AH)(余数)带符号数32位被除数,带符号数除数16位:(DX)(AX)/SRC(AX)(商)(DX)(AX)/SRC(DX)(余数),说明:通用寄存器中存放除数:DIVREG。DIVBL;商(AL)(AX)/(BL),余数(AH)(AX)/(BL)DIVCX;商(AX)(DX)(AX)/(CX),余数(DX)(DX)(AX)/(CX)存储器中存放数:DIVMEM。DIV2000H;商(AL)(AX)/2000H,余数(AH)(AX)/2000HDIVDATASI;商(AX)(DX)(AX)/DATA+(SI),余数(DX)(DX)(AX)/DATA+(SI),(3)CBW字节转换为字指令。格式:CBW操作:将AL中的字节数值按其符号扩展到AH中,成为一个16位数。例如:(AL)=0D5H,CBW指令执行后:(AX)=0FFD5H。(4)CWD字转换为双字指令。格式:CWD操作:AX的内容按符号扩展到DX。如(AX)的最高有效位为0,则(DX)=0000;如(AX)的最高有效位为1,则(DX)=0FFFFH。,例4.10(算术运算综合举例)计算(V-(XY+Z-540)/X,其中X、Y、Z、V均为16位带符号数,已分别装入X、Y、Z、V单元中,要求上式计算结果的商存入AX寄存器,余数存入DX寄存器。编制程序如下:,MOVAX,X;被乘数X传送到(AX)IMULY;(DX)(AX)XYMOVCX,AX;将低位积存放到(CX)中MOVBX,DX;将高位积存放到(BX)中MOVAX,Z;存放到(AX)中CWD;扩展Z,将字变为双字(DXAX),ADDCX,AX;低位积+低位ZADCBX,DX;高位积+高位Z带进位SUBCX,540;低位相减(CX)X*Y+Z-540SBBBX,0;高位相减(BX)(BX)-0-CFMOVAX,V;(AX)VCWD;扩展V将字变为双字(DXAX)SUBAX,CX;(AX)(V-(X*Y+Z-540),低16位相减SBBDX,BX;(DX)(V-(X*Y+Z-540),高16位相减带进位IDIVX;(V-(X*Y+Z-540)/X,5.十进制调整指令加、减、乘法十进制调整指令的实质是对二进制形式的运算结果进行修正,从而得到以BCD码表示的十进制数的形式;除法的十进制调整指令则是将两位的非压缩十进制被除数调整成二进制数,以便得到正确的商和余数(一位十进制数,与二进制数的结果一样)。其目的是配合二进制运算指令,实现用BCD码表示的十进制数的运算。,(1)DAA加法十进制调整指令。格式:DAA操作:把AL中的和调整为压缩的BCD码。若(AL0FH)9或AF=1,则AL(AL)+6,AF1;若(AL)9FH或CF=1,则AL(AL)+60H,CF1。说明:该指令在ADD或ADC指令后使用,而且和一定放在AL寄存器中。例如:已知:(AL)=38H,(BL)=48H,为压缩BCD码格式,执行下面指令后(AL)=?,执行ADDAL,BLDAA执行ADD后:(AL)=80H,CF=0,AF=1;执行DAA时:由于AF=1,所以(AL)(AL)+06。经过DAA指令调整后得到了以压缩的BCD码表示的十进制数:(AL)=86H。,(2)DAS减法十进制调整指令。格式:DAS操作:把AL中的差调整为压缩的BCD码格式。若(AL0FH)9或AF=1,则AL(AL)-6,AF1;若(AL)9FH或CF=1,则AL(AL)-60H,CF1。,说明:该指令在SUB或SBB指令后使用,并且差一定在AL寄存器中。例如:(AL)=85H,(AH)=07H。执行SUBAL,AHDAS执行SUB指令后,(AL)=7EH,CF=0,AF=1;执行DAS指令时,因AF=1,需做:(AL)=(AL)-06=78H。最后,(AL)=78H,CF=0,AF=1,调整结果正确。,(3)AAA加法ASCII调整指令。格式:AAA操作:将AL中的两个非压缩BCD码之和调整为非压缩BCD码,结果送AX。若(AX0FH)9或(AF)=1,则AL(AL)+6,AH(AH)+1,AF1,CFAF;否则AL(AL)0FH,AF0,(CF)AF。说明:在ADD或ADC指令之后使用,并且结果在AL中。例如:(AX)=0008H,(BL)=06H。执行:ADDAL,BLAAA调前,(AL)=0EH;调整后,(AX)=0104H。,(4)AAS减法ASCII调整指令。格式:AAS操作:将AL中的两个非压缩BCD码的差调整成非压缩BCD码,结果送AX。若(AL0FH)9或(AF)=1,则AL(AL)-6,AH(AH)-1,AF1,CFAF;否则AL(AL)0FH,AF0,(AF)CF。例如:0406H、0907H非压缩BDC码分别存放在变量V1和V2中,求V1-V2的结果。,MOVAX,0MOVAL,BYTEPTRV1SUBAL,BYTEPTRV2;低位相减AAS;调整MOVDL,AL;(DL)送低位结果MOVAL,BYETPTRV1+1SBBAL,BYTEPTRV2+1;高位相减AAS;调整MOVDH,AL;(DH)送高位结果,(5)AAM非压缩BCD码乘法调整指令。格式:AAM操作:将AL中两个非压缩BCD码之积调整成非压缩BCD码,结果送AX。即:(AH)(AL)/0AH(商),(AL)(AL)/0AH(余数)。,说明:应在MUL指令之后使用,并且乘积一定在AL中。例如:MOVAH,08H;取被乘数MOVCL,08H;取乘数MULCL;非压缩BCD码乘AAM;调整AX中的积为40H,调整后,(AH)=6,(AL)=4。,(6)AAD非压缩BCD码除法调整指令。格式:AAD操作:在除法运算前,必须用AAD指令把AX中非压缩BCD码被除数调整为二进制数,即执行下面的操作:(AL)10(AH)+AL,(AH)0。说明:该指令一定出现在DIV指令之前,影响SF、ZF和PF标志位。,例如:MOVAX,0408H;被除数为非压缩十进制数48MOVBL,4;除数AAD;调整,(AX)=48=30HDIVBL;除运算,(AL)=12,(AH)=0,4.2.3逻辑指令和移位指令1逻辑指令(1)AND逻辑“与”指令。格式:ANDDST,SRC操作:(DST)(DST)(SRC),对两个操作数按位作“与”运算。例如:要使(AL)中D5和D1两位为零,用AND指令来完成,所需设置源操作数的立即数为0DDH,即11011101B。执行MOVAL,0EFH;(AL)0EFHANDAL,0DDH;(AL)(AL)0DDH,只要将源操作数的立即数字段的相应位设为0就可达到目的,其余位均为1。,(2)OR逻辑“或”指令格式:ORDST,SRC操作:(DST)(DST)(SRC)例如:要使(AL)中D3置1,用OR指令来完成,所设置的源操作数的立即数为00001000B。执行MOVAL,36HORAL,08H,只要将源操作数(立即数)字段的相应位置1,其余位均为零。,(5)TEST测试指令。格式:TESTOPR1,OPR2操作:(OPR1)(OPR2),按位相与,结果不保存,只根据其特征置响应状态标志位。说明:其中OPR1可以是除立即数之外的任意一种寻址方式,OPR2可以是任意一种寻址方式,但两者不可同为存储器操作数。,例如:要求测试(AL)中D7,D4,D2位是否同时为0,用TEST指令来完成。执行MOVAL,0D4HTESTAL,94H;(AL)10010100B对应要测试的位将源操作数中相应位设为“1”,其余位为0,然后用条件转换指令来判断ZF位是否为1。若要测试某些位是否为1,则应先将该数取反,然后用EST指令测试即可。,2.移位指令(1)逻辑/算术左移指令。格式:SHL/SALDST,CNT操作:指令按照CNT指定的移位次数对目的操作数进行左移位,移位结果送DST,最后一次移出的位送CF中。图4-7为操作示意图。,图4-7SHL/SAL操作示意图,说明:DST是除立即数以外的任何寻址方式。CNT是移位次数,CNT只能是1或CL寄存器的值。例如:已知(SI)=1230H。执行MOVCL,2SHLSI,CL执行后:(SI)=48C0H,扩大了4倍。,(2)SAR逻辑右移指令。格式:SHRDST,CNT操作:如图4-8所示。说明:与SHL/SAL指令说明相同。,例如:(BH)=42H(十进制数为66D)。执行SHRBH,1执行后:(BH)=21H,42H缩小2倍等于66/2=33=21H,这种缩小2倍关系只对正数或无符号数成立。,图4-8SHR操作示意图,(3)SAR算术右移。格式:SARDST,CNT操作:最高有效位保持不变同时右移(称符号复制),如图4-9所示。说明:与SHL/SAL指令说明相同。对于有符号数,SAR右移一次相当于除以2。例如:已知(DS)=8000H,(DI)=4000H,(84000H)=00C8H(十进制数为200)。执行MOVCL,5SARDI,CL执行后:(84000H)=0006H,00C8H缩小32倍,即200/32,图4-9SAR操作示意图,(4)不带进位的循环移位指令。格式:ROLDST,CNT;左移RORDST,CNT;右移操作:如图4-10所示。说明:与SHL/SAL指令说明相同。,图4-10循环移位操作示意图,例如:已知(AX)=0067H,(BX)=0089H,要求把它们装配在一起形成(AX)=6789H。程序如下:MOVCL,8ROLAX,CLADDAX,BX,(5)带进位循环移位指令。格式:RCLDST,CNT;左移RCRDST,CNT;右移操作:如图4-11所示。说明:与SHL/SAL指令说明相同。例如:有一个4字节数存放在DX和AX中,(DX)=0123H,(AX)=0456H,要求该数的4个字节一起左移一位。执行SALAX,1RCLDX,1注意:将AX的D15移到CF,再将CF移到DX的D0,DX的D15最后移到CF中。,4.2.4串操作指令串操作常用于数据块快速移动、比较、搜索以及存、取等,使用快捷方便。1.MOVS串传送格式:WBREPMOVSBWB;字节传送REPMOVSW;字传送操作:WBES:DIDS:SI,(SI)(SI)1,(DI)(DI)1,(CX)(CX)-1;ES:DIDS:SI,(SI)(SI)2,(DI)(DI)2,(CX)(CX)-1。,说明:无REP前缀时与MOV指令基本类似,但MOV指令无自动修改地址指针的功能。有REP前缀时表示将由(DS:SI)指定的源串传送到由(ES:DI)指定的目的串中,直到计数器CX减到0为止。字节传送,SI和DI都1;字传送,SI和DI都2;传送一次,CX减1。,执行串指令之前需做如下初始化工作:设置方向标志DF。若DF=0,则SI和DI增量变化,否则减量变化。源串偏移量送SI,目的串偏移量送DI。DS指向源串所在的段,ES指向目的串所在的段。将传送的长度装入CX寄存器中。,串指令中的REP重复前缀起到了计数循环的作用,其执行过程如下:判断(CX)是否等于零,若等于零则结束串传送,否则往下执行。(CX)(CX)-1。执行串传送指令(MOVSB或MOVSW)。转到。,2.LODS读取串格式:WBLODSB;装入字节串LODSW;装入字串操作:ALDS:SI,(SI)(SI)1;AXDS:SI,(SI)(SI)2。说明:该指令把DS:SI所指定的串装入累加器,字节送到AL中,字送到AX中。LODS指令一般不用重复前缀。,3.STOS存入串格式:REPSTOSB;字节存入REPSTOSW;字存入操作:ES:DI(AL),(DI)(DI)1;ES:DI(AX),(DI)(DI)2。说明:该指令是将AL或AX寄存器的内容存入由(ES:DI)指定的存储单元中。有REP前缀可对内存某一存储区域进行初始化(存入相同的数值)。,4.CMPS串比较格式:REPZ/REPE/REPNZ/REPNECMPSB;字节比较REPZ/REPE/REPNZ/REPNECMPSW;字比较操作:ES:DI-DS:SI,(SI)(SI)1,(DI)(DI)1;ES:DI-DS:SI,(SI)(SI)2,(DI)(DI)2。说明:该指令表示将由(DS:SI)指定的源串的内容与由(ES:SI)指定的目的串的内容进行比较,比较是通过减操作完成的。字节比较,SI和DI都1;字比较,SI和DI都2。,串指令中REPZ/REPE前缀起到计数循环和条件循环双重作用,执行操作过程如下:判断CX或ZF是否等于零,只要有一个条件为0,则串比较退出,否则往下执行。(CX)(CX)-1。执行串传送指令(MOVSB或MOVSW)。转到。若前缀是REPNZ/REPNE,表示ZF=1或CX=0时,串比较退出,其余操作与上面一样。利用REPZ前缀可以查找出两个串中第一个不匹配字符,利用REPNZ可查找出两个串中第一个匹配字符。,5.SCAS串扫描格式:REPZ/REPE/REPNZ/REPNESCASB;字节比较REPZ/REPE/REPNZ/REPNESCASW;字比较操作:ES:DI(AL),(DI)(DI)1;ES:DI(AX),(DI)(DI)2。,说明:SCAS指令是将AL或AX寄存器的内容与(ES:DI)指定的串的内容依次进行比较,每比较一次,DI寄存器自动1或2,以指向下一个元素;同时比较的结果影响ZF标志位,以判断AL或AX的内容是否在串中找到,找到ZF=1,否则ZF=0。前缀REPZ/REPNZ作用与串指令CMPS的前缀相同。利用该指令可以查找到某个元素是否在指定的串中。上述五条串操作指令中的串地址指针SI、DI寄存器的变化方向,由方向标志位DF的当前值来决定,CLD指令使DF=0,为自动地址增量;STD指令使DF=1,为自动地址减量。总之,串指令的特点是串操作的寻址为隐含寄存器间接寻址,规定源串的段基址在数据段DS寄存器中,起始偏移地址在SI寄存器中;目的串的段基址在附加段ES寄存器中,起始偏移地址在DI寄存器中;执行串指令之前必须将它们设置好。,4.2.5程序控制指令程序的结构有顺序结构也有非顺序结构,非顺序结构的实现就需要用转移指令或调用指令。寻址方式从广义上讲,既包括数据的寻址,也包括指令的寻址。对指令来说,一指令指针IP的值作为下一条指令的偏移地址,也就是以IP为指令寻址的依据(在段的大致CS不变的情况下)。在顺序执行的情况下,IP的值是自动增加的;非顺序执行的情况下,也就是需要改变程序执行流向的情况下,转移指令或调用指令里就要包括目标指令寻址的必要信息,以这些信息为依据,就可以求出新的IP值,从而执行转移后的程序段。在有些情况下,代码地址CS也会改变,这时既要求IP值还要求CS值,以形成新的指令地址。,1.转移指令转移指令分无条件转移指令和条件转移指令。(1)无条件转移指令。格式:JMPTARGET使程序无条件地从当前位置转移到由“目标(TARGET)”标号指定的地址去执行,不再返回到当前位置。该指令根据目标地址位置与寻址方式有以下四种格式。,段内直接转移。格式:JMPNEARPTRJMPSHORT操作:(IP)(IP)+16位位移量;(IP)(IP)+8位位移量。,说明:TARGET为转向的有效符号地址,在汇编后的目的指令中用位移量来表示。若位移量为16位,则符号地址前加操作符“NEARPTR”,跳转范围是以IP执行转移指令之前的值为基准,可达到段内的-32768+32767;若为8位位移量,则在符号地址前加操作符“SHORT”,段内跳转范围以IP执行转移指令之前的值为基准,可达-128+127。该指令是相对转移。,段内间接寻址。格式:JMPWORDPTRTARGET操作:(IP)(EA)。说明:转向有效地址是一个通用寄存器或一个存储器单元的内容。该指令是绝对转移。,例如:若(DS)=0A000H,(BX)=0056H,TABLE=3200H,(SI)=256H,(0A3256H)=1688H。执行JMPSI;(IP)(SI)=0256HJMPTABLEBX;(IP)(0A3256H)=1688HEA=(16D(DS)+(BX)+TABLE)=(0A0000H+0056H+3200H)=(0A3256H)=1688H,段间直接转移。指令直接给出了转向的段基址和偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段基址取代CS寄存器的内容,就完成了从一个段到另一个段的转向操作。格式:JMPFARPTRTARGET操作:(IP)TARGET偏移地址,(CS)TARGET段基址。说明:TARGET为转向的符号地址,FARPTR是表示段间转移的操作符。,段间间接转移。用存储器中的两个相继字单元的内容来取代IP和CS寄存器中原先的内容,以达到段间转移的目的。这是绝对转移。格式:JMPDWORDPTRTARGET操作:(IP)EA,(CS)EA+2。说明:TRAGET只能是存储器操作数,如:JMPDWORDPTRLAB2+BX。其中LAB2+BX说明数据寻址方式;DWORDPTR为双字操作符,说明转向地址需取双字(一个字表示偏移量,一个字表示段基址)。,(2)条件转移指令。条件转移指令有16条,转移的条件是依据对除AF之外的五个状态标志位的判断。可对一个标志位进行判断,也可对两个甚至三个标志位进行判断。判断两个数A与B的大小有以下几种情况。当A与B为无符号数时,可用以下指令来判断,见表4-2。,表4-4单个标志位判断转移指令,2.循环指令LOOPOPR;测试条件:(CX)0,跳转OPR;LOOPZ/LOOPEOPR;测试条件:(CX)0且ZF=1(结果为零/两者相等),跳转OPR;LOOPNZ/LOOPNEOPR;测试条件:(CX)0且ZF=0(结果不为零/两者不相等,跳转OPR。,三条指令的步骤是:(CX)(CX)-1。检查是否满足测试条件,如满足则(IP)(IP)+D8。OPR是跳转的目的标号。其中8位位移量D8是转向地址与当前IP值的差。由于是8位,所以转向指令地址的范围为-128+127B。,3.子程序调用子程序调用时,系统将自动保护返回地址,以使调用结束后返回调用程序。(1)段内调用。格式:CALL子程序名;段内直接调用操作:(SP)(SP)-2,(SP)+1,(SP),(IP)(IP)+DISP16。格式:CALLREG/MEM;段内间接调用,操作:(SP)(SP)-2,(SP)+1,(SP)(IP),(IP)(REG)或(IP)(MEM)。说明:DISP16为16位偏移量,REG为寄存器,MEM为存储单元,段内间接调用子程序入口地址存放在REG或MEM中。段内调用是将IP指向子程序入口地址,从而进入子程序。,(2)段间调用。格式:CALLFARPRT子程序名操作:(SP)(SP)-2,(SP)+1,(SP)CS);(SP)(SP)-2,(SP)+1,(SP)(IP);(IP)子程序名对应的偏移量,(CS)子程序所在段的段的段基址。格式:CALLDWORDPRTMEM操作:(SP)(SP)-2,(SP)+1,(SP)(CS);(SP)(SP)-2,(SP)+1,(SP)(IP);(IP)(EA),(CS)(EA+2)。,说明:段间直接调用时,先保护当前段点CS和IP入栈,再将子程序所在段的段基址送CS寄存器,子程序入口偏移量送IP寄存器;段间间接调用时,先保护当前段点入栈,然后根据寻址方式计算出物理地址,最后从存储单元中取两个字送入IP和CS寄存器,进入子程序。,(3)段内返回。格式:RET操作:(IP)(SP)+1,(SP);(SP)(SP)+2。,(4)段间返回。格式:RET操作:(IP)(IP)+1,(SP),(SP)(SP)+2;(CS)(SP)+1,(SP),(SP)(SP)+2。说明:子程序结束之前必须要有一条RET指令,才能保证调用程序正确返回调用处。段内返回时,系统自动从堆栈顶部弹出一个字的内容,送到IP寄存器,使子程序返回到主程序中CALL指令的下一条指令。段间返回时系统自动从堆栈顶部中弹出两个字的内容,分别送到IP和CS寄存器中。,4.中断指令中断调用与子程序调用有相似之处,都需将CS和IP入栈保护,不同的是中断是一种随机的过程,中断调用虽受程序控制,但仍需先将标志寄存器入栈。格式:INTn操作:(SP)(SP)-2,(SP)+1,(SP)(PSW);(SP)(SP)-2,(SP)+1,(SP)(CS);(SP)(SP)-2,(SP)+1,(SP)(IP);(IP)n4,(CS)n4+2。,说明:中断子程序入口地址称为中断矢量或中断向量,存放在内存0000H03FFH中,共有1024个单元,称为中断矢量表。一个中断矢量占4个字节,中断矢量表中最多可放1024/4=256个中断矢量,中断矢量在该表中的排列序号称为中断矢量类型号n(n=02555)。n可以是常数或常数表达式,若缺省,则中断类型号为3。根据类型号寻找到相应的中断矢量,从而得到中断子程序的入口地址。,5.中断返回格式:IRET操作:(IP)(SP)+1,(SP),(SP)(SP)+2;(CS)(SP)+1,(SP),(SP)(SP)+2;(PSW)(SP)+1,(SP),(SP)(SP)+2。说明:先弹出返回地址,后弹出标志寄存器的内容。,4.2.6处理机控制指令处理机控制指令可分为两类。(1)标志位处理指令。CLC;进位标志CF清0CMC;进位标志CF求反STC;进位标志CF置1CLD;方向标志清0STD;方向标志置1CLI;中断允许标志清0STI;中断允许标志置1,(2)其他控制处理器控制指令。NOP;空操作HLT;停机WAIT;等待ESC;换码LOCK;总线分锁,4.3汇编语言程序格式,4.3.1汇编语言的语句格式,1.标识符将指令性语句和伪指令语句中的标号和标号名统称为标识符。标识符命名规则如下:(1)标识符是由英文字母(AZ)或英文字母与数字(09)组成的序列。(2)第一个字符必须是字母。专用字符“?”“-”“”“”不能独立使用。(3)当使用小数点时,必须放置在标号首。(4)标识符的长度为31个字符。系统保留字都不能独立地作为标识符来使用。,2.语句的种类语句是构成程序的基本单位。构成汇编语言源程序的语句按功能可分为两大类:指令语句和伪指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车展汽车经销商购车返利合同样本
- 药审中心关于已上市药品说明书增加儿童用药信息工作细则(试行)
- 采砂厂租赁承包管理协议书
- 车辆维修厂车辆事故救援与维修合同
- 厕所节水节能技术改造合同
- 高端社区车库产权转移及维修保养协议
- 烧烤连锁品牌区域经营合作协议
- 商场专柜导购管理制度
- 喷砂车间相关管理制度
- 培训基地日常管理制度
- 护理核心制度培训试题及答案
- T/CAQI 126-2020家用和类似用途母婴净水机
- 2025年上半年山东铁投集团校园招聘社会公开招聘165人笔试参考题库附带答案详解
- 2024-2025学年广东省佛山市南海区高二下学期素养提升学业水平测试数学试卷(含答案)
- 2025年高考化学冲刺押题卷-化学01上海卷参考答案
- 2025年货运司机从业资格考试试卷及答案
- 五朵金花抗抑郁药
- 重症监护病房新生儿皮肤管理指南(2021)解读
- 2025年下半年江苏省南通海门区应急管理局招聘政府购买服务人员2人易考易错模拟试题(共500题)试卷后附参考答案
- 全国县中头雁教师岗位计划人员推表
- 幼儿园小班科学《汽车嘟嘟》课件
评论
0/150
提交评论