微机原理及接口技术-第4章-指令系统.ppt_第1页
微机原理及接口技术-第4章-指令系统.ppt_第2页
微机原理及接口技术-第4章-指令系统.ppt_第3页
微机原理及接口技术-第4章-指令系统.ppt_第4页
微机原理及接口技术-第4章-指令系统.ppt_第5页
已阅读5页,还剩155页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章8086instructionsystem本章主要教学内容1、8086指令的基本格式2、8086指令系统的寻址方式3、8086指令的应用本章教学目的使学生掌握指令的寻址方式过程,掌握指令的应用。教学重点:指令系统的寻址方式和指令的应用教学难点:指令的寻址方式,第4章8086InstructionSystem,4.1指令的基本概念和基本格式4.2指令的寻址方式4.38086指令系统4.4中断调用类指令,4.1DefinitionandFormatofInstruction,Machineinstruction:指挥计算机完成某种操作的命令。Format:OperationCode:OPD,OPS(0,1,2)OPD:目的操作数OPS:源操作数,4.2InstructionAddressing,4.2.1寻址方式的基本概念4.2.2与数据有关的寻址方式4.2.3I/O端口寻址方式,4.2.1DefinitionofAddressing、AddressingApproach,指令中操作数字段实质上是指出操作数存放于何处。一般来说,操作数可以跟随在指令操作码之后,称为立即数(immediatevalue);操作数也可以存放在CPU内部的寄存器中,称为寄存器操作数。绝大多数的操作数存放在内存储器中,称为存储器操作数。指令指定操作数的位置,即给出地址信息,在执行时需要根据这个地址信息找到需要的操作数。这种寻找操作数的过程称为寻址,而寻找操作数的方法称为寻址方式。,4.2.2relatedtodata,1.立即寻址(immediateaddressing)立即寻址方式中,指令操作码和操作数都在存储器代码段中。汇编格式:n(n为立即操作数,是用8位或16位二进制补码表示的有符号数)功能:操作数存放在存储器,指令下一单元的内容为立即操作数n。图形表示如右:,【例4.1】,【例2.5】MOVAX,2A50H执行后(AX)=?该例中源操作数为立即寻址方式,立即数为2A50H,存放在指令的下一单元。执行:2A50HAX执行后:(AX)=2A50HHOWarrangeitinAX?AXcanbeAL,ormemoryIVcannotbeOPDbutonlyOPS,2.RegisterAddressing,寄存器寻址方式的操作数在指令指明的寄存器中。汇编格式:R其中R表示寄存器名。功能:操作数直接存放在寄存器R中。图形表示:R指令操作数,【例4.2】,下列程序执行后,(AX)=1234H,(BX)=5678HMOVAX,BXAX=?BX=?HOWABOUTMOVAL,BHMOVAH,BXMOVAX,BLKeptsamelength,3.MemoryAddressing,如果操作码所需操作数存放在内存储器中,则指令中需要给出操作数的地址信息。为了提高程序的灵活性,8086指令系统提供了多种存储器寻址方式(1)直接寻址(2)寄存器间接寻址(3)寄存器相对寻址(4)基址变址寻址(5)关于段跨跃前缀,(1)直接寻址(directaddressing),汇编格式:含有变量的地址表达式。寄存器名:EAbedirectlygiven。DefaultDSorX:EA功能:指令下一字单元的内容是操作数的偏移地址EA。图形表示:,【例4.3】,【例4.3】寄存器和存储器内容为:(AX)=1212H,BUF为数据段定义的变量,其偏移地址是2000H,(DS)=3000H,(32000H)=4545H。执行指令:MOVAX,BUF执行后:(AX)=?图形表示:执行:(32000H)AX执行后:(AX)=4545H,指令操作例:MOVAX,3102HAL(3102H),AH(3103H),如果(DS)=2000H,(23012H)=CDH,(23013H)=ABH则操作数的物理地址为:20000H+3102H=23102H指令执行后:(AX)=ABCDH,MOV操作码,02H,31H,AH,AL,23102H,CDH,ABH,存储器,代码段,数据段,.,立即数,操作码,低8位,高8位,存储器,MOV操作码,02H,31H,AH,AL,代码段,代码段,立即寻址指令在存储器中的存放形式,AX,指令操作例:MOVAX,3102H;AX3102H执行后,(AH)=31H,(AL)=02H,(2)寄存器间接寻址(registerindirectaddressing),寄存器间接寻址方式中,寄存器的内容为操作数的偏移地址EA,操作数在存储器中。汇编格式:R功能:操作数存放在存储器,寄存器R存放操作数的偏移地址EA。Donotforgetbracket,寄存器间接寻址示意图:,例如:MOVAX,BX若(DS)2000H,(BX)1000H,物理地址20000H1000H21000H。指令执行前,(AX)2030H,(21000H)0A0H,(21001H)50H,指令执行后,(AX)50A0H,(21000H)0A0H,(21001H)50H。指令执行情况如下:,偏移地址EA计算方法如下:,EA=,SISI作间址寄存器。DSDIDI作间址寄存器。DSBXBX作间址寄存器。DSBPBP作间址寄存器。SS,执行指令:MOVAX,BP执行后:(AX)=?,(BP)=?,(SS)=?,(20030H)=?图形表示如下:,【例4.4】寄存器和存储器内容分别为:(AX)=0,(BP)=0030H,(SS)=2000H,(20030H)=1234H,(3)寄存器相对寻址(registerrelativeaddressing),寄存器相对寻址方式是在指令中给定一个基址寄存器(或变址寄存器)名和一个8位或16位的相对偏移量(displacement),两者之和作为操作数的有效地址。对BX、SI、DI这三个间址寄存器,指示的是数据段中的数据,而用BP作间址寄存器,则指示的是堆栈段中的数据。汇编格式:XR(X表示位移量,是8位或16位二进制补码表示的有符号数)。功能:操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。,偏移地址EA计算方法如下:,【例4.5】,设执行前:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0050H执行指令:MOVAX,6BX执行后:(AX)=?,(BX)=?,(DS)=?,(20036H)=?Difference?,(4)基址变址寻址(basedindexedaddressing),基址变址寻址方式是在指令中给出一个基址寄存器名和一个变址寄存器名,两者内容之和作为操作数的有效地址。基址寄存器为BX或BP,变址寄存器为SI或DI,但指令中不能同时出现两个基址寄存器或两个变址寄存器。如果基址寄存器为BX,则段寄存器使用DS;如果基址寄存器用BP,则段寄存器用SS。汇编格式:BR+IR功能:操作数存放在存储器,BR的内容加IR的内容是操作数的偏移地址EA。,操作数偏移地址EA计算方法如下,【例4.6】,例如MOVAL,BXSI(MOVAL,BXSI)若指令执行前,(DS)1000H,(BX)0010H,(SI)0002H,(10012H)45H则EA(BX)(SI)0012H,PA(DS)10HEA10012H指令执行后(AL)45H。,相对基址变址寻址(relativebasedindexedaddressing),汇编格式:XBR+IR功能:操作数存放在存储器,BR的内容加IR的内容加位移量X是操作数的偏移地址EA。,【例】,例如MOVAL,21HBXSI(MOVAL,21HBXSI)若指令执行前,(DS)1000H,(BX)0010H,(SI)0002H,(10033H)45H则EA21H+(BX)(SI)0033H,PA(DS)10HEA10033H指令执行后(AL)45H。,(5)跨段问题,按前述规定:若选用BP作间址基址寄存器、变址寄存器或基址寄存器,则操作数在堆栈段,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加后形成;否则,操作数在数据段,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移EA相加后形成。该规定为系统默认状态。当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。汇编格式:段寄存器名:操作数地址。功能:段寄存器名指明操作数属哪个段。,【例4.7】跨段前缀示例。,MOVAX,DS:BPMOVCX,SS:SI该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为:PA1=(DS)左移4位+BPPA2=(SS)左移4位+SI,4.2.3I/O端口寻址方式I/Ointerfaceaddressing,8086CPU采用独立编址的I/O端口,可以最多访问64K个字节端口或32K个字端口,用专门的IN指令和OUT指令访问。I/O端口寻址只用于这两种指令中。寻址方式有如下两种。1.直接端口寻址在指令中直接给出端口地址,端口地址一般采用2位十六进制数,也可以用符号表示,这种寻址方式为直接端口寻址。因此,直接端口寻址可访问的端口数为0255个。例如:INAL,25H2.寄存器间接端口寻址如果访问的端口地址值大于255,则必须用I/O端口的间接寻址方式。所谓间接寻址,是指把I/O端口的地址先送到DX中,用DX作间接寻址寄存器,而且只能用DX寄存器。例如:MOVDX,378HINAL,DX,计算机原理与汇编语言程序设计实验指导书李志民编著中南大学信息科学与工程学院自动化所,指令的机器码(machinecode)表示方法,一、机器语言指令的编码目的和特点1、机器语言指令汇编语言经过汇编机器语言流程序程序程序用符号指令编写的程序相当于解释用二进制表示如:CLC1111,1000WAIT1001,1011,MOD,二、机器语言指令代码的编制1、编码格式说明:以寄存器之间或寄存器与存储器之间数据传送的MOV指令为例:151098765320D15D10位:6为操作码(规定说明指令的功能)D9位(D位):规定数据的传送方向(direction)D=1数据传送到寄存器(或存储器)D=0数据从寄存器(或M单元)传出,R/M,REG,100010DW,操作码,典型的MOV指令的编码格式,D8位(W位):规定数据类型W=1数据为一个字W=0数据是一个字节D5D4D3位(REG位):寄存器编码,REG,W=1字,W=0字节,AXAL,BXBL,CXCL,DXDL,SPAH,BPCH,SIDH,000,011,001,010,100,111,101,110,REG,段寄存器,00CS,11DS,00ES,10SS,8086寄存器编码表,由于MOV指令有两个操作数,一个必为寄存器(由REG确定),另一个可能是寄存器、可能是存储单元(由MOD和R/M编码确定),MOD和R/M的编码,MOD,R/M,000110,11,W=0W=1,000BX+SIBX+SI+D8BX+SI+D16ALAX,001BX+DIBX+DI+D8BX+DI+D16CLCX,010BP+SIBP+SI+D8BP+SI+D16DLDX,011BP+DIBP+DI+D8BP+DI+D16BLBX,101DIDI+D8DI+D16CHBP,110D16(直接地址)BP+D8BP+D16DHSI,100SISI+D8SI+D16AHSP,111BXBX+D8BX+D16BHDI,Example:MOVSP,BX100010DWMODREGR/MW=1D=1MOD=11REG=100R/M=0111000101111100011W=1D=0MOD=11REG=011R/M=1001000100111011100,4.38086instructionsystem,包括数据传送类指令、算术运算类指令、位操作类指令、串操作类指令、控制转移类指令、处理机控制类指令。后几节将分别介绍这些指令的语句格式和功能。4.3.1数据传送类指令4.3.2算术运算类指令4.3.3逻辑运算与移位类指令4.3.4串操作类指令4.3.5控制转移类指令4.3.6处理器控制指令,4.3.1数据传送类指令,1通用数据传送指令2累加器专用传送指令3地址传送指令4标志寄存器传送指令,通用数据传送指令(generalpurposedatatransfer),(1)传送指令MOV(2)堆栈指令PUSHPOP(3)数据交换指令XCHG,(1)传送指令MOVformat:MOVOPD,OPSfunction:将源操作数传送入目的地址,源地址内容不变。即(OPS)OPD。下图4.1描述了MOV指令在传送数据时允许传送的路径及类型。,图4.1MOV指令所允许的数据传送路径及类型,MOV指令的形式有如下几种:,1)从通用寄存器到通用寄存器MOVreg1,reg22)立即数传送到通用寄存器MOVreg,data3)通用寄存器和存储单元之间MOVmem(reg),reg(mem)4)立即数传送到存储单元MOVmem,data5)段寄存器与通用寄存器间的数据传送MOVseg,reg或MOVreg,seg6)段寄存器与存储单元间的数据传送MOVseg,mem或MOVmem,seg,Attention:IP不能做操作数(DorS)。CS和IV不能用作目的操作数(D)。两操作数中必有一寄存器(exceptIVasS)。IVcannotbedirectlyassignedtoSR.,【例4.8】,MOVAL,B;把字符B的ASCII码(42H)AL中MOVAX,DATA;MOVDS,AX;以DATA为数据段的基址,由于DS不能用立即数传送,所以先把DATAAX,再由AXDS,2数据交换指令XCHG,Format:XCHGOPD,OPSFunction:将源地址与目的地址中的内容互换。即(OPD)OPS,(OPS)OPD。【例4.9】寄存器与存储器之间数据交换。MOVAX,5678H;(AX)=5678HMOVBX,0FFFFH;(BX)=0FFFFHXCHGAX,BX;(AX)=0FFFFH,(BX)=5678H,2数据交换指令XCHG,ATTENTION:R与R之间R与M之间(段寄存器不行)(M与M之间不行),(2)堆栈(Stack)操作指令,1)进栈指令PUSH2)出栈指令POP,1)进栈指令PUSH,format:PUSHOPSfunction:将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2。即:(SP)SP(OPS)158SP(SP)SP(OPS)70SP,2)出栈指令POP,语句格式:POPOPD功能:将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。从POP指令功能可看出,该指令为PUSH指令的逆过程。即:(SP)(OPD)70(SP)+SP(SP)(OPD)158(SP)+SP,例:设SS=2000HSP=40HBX=3120HAX=25FEH执行下述程序PUSHBXPUSHAXPOPBX堆栈中的数据和SP的变化情况如下图,20000000,FE,25,20,31,2000003C,20000040,SP,AX=25FEH,BX=3120H,(C)执行PUSHAX指令后,20000000,20000040,SP,AX=25FEH,BX=3120H,(A)指令执行前,20000000,FE,25,20,31,2000003E,20000040,SP,AX=25FEH,BX=25FEH,(D)执行POPBX指令后,20000000,20000040,SP,AX=25FEH,BX=3120H,(B)执行PUSHBX指令后,31,20,2000003E,2.累加器专用传送指令,(1)输入/输出指令(2)XLAT查表指令,1)输入指令IN,输入指令用来从指定的外设寄存器取信息送入累加器。它有四种形式:语句格式:INAL,PORT功能:(PORT)AL语句格式:INAX,PORT功能:(PORT)AX语句格式:INAL,DX功能:(DX)AL语句格式:INAX,DX功能:(DX)AL,例:INAL,0F1H;ALF1H端口内容INAX,80H;AL80H口内容AH81H口内容MOVDX,310H;INAL,DX;AL310H口内容INAX,DX;AL310H口内容AH311H口内容,2)输出指令OUT,输出指令用来把累加器的内容送往指定的外设存储器,它有四种形式:语句格式:OUTPORT,AL功能:(AL)PORT语句格式:OUTPORT,AX功能:(AX)PORT语句格式:OUTDX,AL功能:(AL)DX语句格式:OUTDX,AX功能:(AX)DX,例3-34下面几个是用OUT指令对输出端口进行操作的例子OUT85H,AL;85H端口AL内容MOVDX,0FF4HOUTDX,AL;FF4H端口AL内容MOVDX,300H;DX指向300HOUTDX,AX;300H端口AL内容301H端口AH内容,(2)查表转换指令XLAT,format:XLAT转换表或XLATfunction:把一个字节从一种代码转换为另一种代码。使用XLAT前,建一个表格(此表最大为256单元);表格首址BX;AL中存表中位移量。执行完XLAT指令后,AL转换后的代码。,3地址传送指令,(1)传送有效地址指令LEA(2)传送有效地址及数据段首址指令LDS(3)传送有效地址及附加数据段指令LES,(1)传送有效地址指令LEA,语句格式:LEAOPD,OPS功能:主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。LEA与MOV指令的区别:MOV传送源操作数的内容LEA指令传送的是偏移地址例:设SI=1000H,DS=5000H,(51000H)=1234HLEABX,SI;BX=1000HMOVBX,SI;BX=1234H=(51000H),(2)传送有效地址及数据段首址指令LDS(loadpointerusingDS),语句格式:LDSOPD,OPS功能:将主存中指定字单元数据送入指定存储器,下一字单元数据送DS寄存器。,Format:LDSOPD,OPS指令功能:源(连续四个单元的M)目的偏移DS段地址注意:源操作数必须为M单元,目的操作数必须为除段R外的16位R,(2)传送有效地址及数据段首址指令LDS(loadpointerusingDS),例:设(12450H)=F346H(12452H)=0A90HDS=1200H执行LDSSI,450H;后SIF346124504612451F3DS0A901245290124530A,(3)传送有效地址及附加数据段指令LES(loadpointerusingES),format:LESOPD,OPSfunction:将主存某字单元内容送指定寄存器。即(OPS)OPD,(OPS+2)ES。DIcommonlyusedinOPD,4标志寄存器传送指令,(1)标志送AH指令LAHF(2)AH送标志指令SAHF(3)标志寄存器进栈指令PUSHF(4)标志寄存器出栈指令POPF,(1)标志送AH指令LAHF,语句格式:LAHF功能:将标志寄存器的低8位送入AH寄存器。即(FLAGS)7-0AH。该指令的执行对标志位无影响。【例4.11】标志寄存器传送。执行前:(FLAGS)=0485H,(AX)=0FFFFH执行指令:LAHF,(2)AH送标志指令SAHF,语句格式:SAHF功能:将AH的内容送入标志寄存器的低8位,高8位不变。即(AH)FLAGS7-0.。从该指令功能可看出,SAHF为LAHF的逆过程。,(3)标志寄存器进栈指令PUSHF,语句格式:PUSHF功能:将标志寄存器的内容压入堆栈。即(FLAGS)(SP)。,(4)标志寄存器出栈指令POPF,功能:将栈顶内容弹出送入标志寄存器中。即(SP)FLAGS。POPF指令与PUSHF指令互为逆过程。【例4.12】将标志寄存器的单步标志TF置位。PUSHF;(FLSGS)(SP)POPAX;(SP)AXORAX,0100H;设置D8=TF=1PUSHAX;(AX)(SP)POPF;(SP)FLAGS,即(AX)FLAGS,4.3.2算术运算类指令(Arithmeticcalculation),1加法类指令2减运算指令3乘运算指令4除运算指令5BCD码调整指令,算术运算指令可处理4种类型的数:1、无符号二进制整数2、带符号二进制整数3、无符号压缩十进制整数(packeddecimal)4、无符号非压缩十进制整数(unpackeddecimal)若为带符号数:用补码(complement)表示压缩十进制数:BCDBCD一字节中表示两个十进制数非压缩十进制数:0000BCD一字节中只表示一个十进制数,Example:BHD(无)D(有)UDPD00000111077+77071000100189137-119invalid8911000101C5197-59invalidinvalid,1、加法指令(addition)1)ADD算术加法(addition)格式:ADD目的,源;功能:目的地目的操作数源操作数2)ADC带进位算术加法(additionwithcarry)格式:ADC目的,源;功能:目的地目的操作数源操作数CF上述两指令:源操作数:寄存器,存储器,立即数。目的操作数:只能是寄存器和存储单元。,example:5EH+3CH=?Influenceonflags?编程如下:MOVAL,5EH;AL=5EH(94)MOVBL,3CH;BL=3CH(60)ADDAL,BL;AL=9AH(154)01011110(5E)+00111100(3C)10011010(9A)标志位:ZF=0,AF=1,CF=0,SF=1,PF=1,OF=1,a.若5EH,3CH为无符号数:D7data0255(FFH)9AH9或标志位AF=1,则:a.ALAL+6b.将AL高四位清0c.AF是1,CF是1,AHAH+1否则只将AL高四位清0。,例:设AL=9BCDBL=5BCDAH=0求和?ADDAL,BL;000010019+00000101500001110低4位9AAA+00000110加6调整0001010000001111清高4位留低4位00000100AL中CF=1AF=1AH=1,DAA加法的十进制调整指令(DecimalAdjustforAddition)格式:DAA;功能:将AL中内容调整为压缩BCD数应用场合:用于将两压缩BCD数之和调整为正确的BCD数。调整过程:若AL低四位9或标志位AF=1,则:ALAL+6对低半字节调整,调整过程:若AL低四位9或标志位AF=1,则:ALAL+6对低半字节调整若AL高四位9或标志位CF=1则:ALAL+60H对高半字节调整并CF置1,否则CF是0。,例:设AL=88BCDBL=49BCD求AL+BL=?ADDAL,BL;1000100088+010010014911010001AF=1DAA+00000110加6调整11010111+01100000加60H调整00110111结果AL=37BCDCF=1,2、减法指令(subtraction)1)SUB不带借位的减法指令格式:SUB目的,源;功能:目的目的操作数源操作数2)SBB带进位算术减法(subtractionwithborrow)格式:SBB目的,源;功能:目的目的操作数源操作数CF应用于多字节减法中。3)DEC减1指令格式:DEC目的;功能:目的目的操作数1,4)NEG取补指令(negate)格式:NEG目的;功能:目的0目的操作数5)CMP比较指令(compare)格式:CMP目的,源;功能:两个操作数相减,不产生运算结果,仅影响标志,6)AAS减法的ASCII调整指令(ASCIIAdjustforsubtraction)格式:AAS;功能:对AL中的内容调整为非压缩十进制数用在SUB和SBB指令之后,且操作数是非压缩十进制数或ASCII码表示的十进制数。调整过程:若AL低四位9或标志位AF=1,则:a.ALAL6AF是1b.将AL高四位清0c.AHAH1,CF是1否则不调整。,例3-54设AL=3BCDCL=8BCD求AL-BL=?指令控制过程如下:SUBAL,CL00000011BCD300001000BCD8AAS11111011低4位大于900000110减6调整111101010000111100000101高4位清0结果AL5,CF1,7)DAS减法的十进制调整指令(DecimalAdjustforSubtraction)格式:DAS;功能:将AL中内容调整为正确的压缩十进制数调整过程:若AL低四位9或标志位AF=1,则:ALAL6AF是1若AL高四位9或标志位CF=1,则:ALAL60HCF是1否则不调整。,3、乘法指令(只有非压缩十进制数乘)1)MUL无符号数乘法(multiply)格式:MUL源;功能:(ALorAX)a.源操作数为字节:积高8位AH积低8位ALb.源操作数为字:积高16位DX积低16位AX,源操作数:可以是寄存器或存储单元,不能是立即数,源操作数为存储单元时,必须说明是字节(B)还是字(W)。如:MULBSI;AXAL*(内存中某字节)MULWBX;(DX,AX)AX*(内存中某字)MUL指令执行后影响CF和OF标志。若积的高半部分(AH或DX)不为0,则CF是1,OF是1。通常测CF和OF的状态,确定(AH或DX)是否为积的高半部分。P85例3-573-58,例:设AL=55HBL=14HMULBL;AXAL*BL=06A4HAHALAX06A4因为AH=06H=0,所以CF=1,OF=1.AH中是积的高半部分。注意:不能用MUL指令做带符号数的乘法!,例如:FFHFFH=?二进制乘式:111111111111111111111110000000011、当作无符号数FFHFFH=25525565025正确2、当作带符号数FFHFFH=(1)(1)=(1111111000000001)取补码=1000000111111111=(-511)D错误正确答案为:0000000000000001=(+1)D,2)IMUL带符号数乘法(IntegerMultiply)格式:IMUL源;功能:a.源操作数为字节:AXAL源b.源操作数为字:AXAX源低字DXAX源高字若积的高半部分为非全0或非全1为积的一部分,置CF=1,OF=1若积的高半部分为全0或全1仅为符号,置CF=0,OF=0,所以检测CF和OF的状态,确定是否保存积的高半部分(字节或字)。AAM乘法的ASCII调整指令(ASCIIAdjustformultiply)格式AAM功能:将AL中的BCD数调整为两个非压缩十进制数。(低位AL,高位AH)调整过程:AHAL/10的商(quotient)ALAL/10的余数(remainder)执行指令后,影响ZF,SF,PF标志。,例3-60求两个非压缩十进制数09和06之乘积,可用如下指令实现:MOVAL,09H;AL00001001MOVBL,06H;BL00000110MULBL00110110AAM(54B)其中调整AL/10商为5AH,AL/10余数为4AL,所以AH=05,AL=04。即在AX中得到正确结果AX0504H,即BCD数54。,4、除法指令(只有非压缩十进制数除)1)DIV无符号数除法(division,unsigned)格式:DIV源;功能:两个无符号二进制数除法操作若a.源为字节:ALAX/源(字节)的商AHAX/源(字节)的余数b.源为字:32位被除数在DX,AX中AX(DX,AX)/源(字)的商DX(DX,AX)/源(字)的余数c.若为16位数除16位数,则DX清0,被除数AX。,2)IDIV带符号数除法格式:IDIV源;功能:操作与DIV相同关于除法运算产生溢出的问题:字节操作时:被除数高8位除数产生溢出字操作时:被除数高16位除数产生溢出即商数超过了AL或AX所表示的范围,产生溢出时CPU自动产生除法错中断,此时所得的商和余数为不确定数。,3)CBW字节转移为字指令(convertbytetoword)格式:CBW;功能:将AL中符号位扩展到AH所有位。4)CWD字节转换为双字指令(convertwordtodoubleword)格式:CWD;功能:将AX中符号位扩展到DX所有位。,例:求383的商和余数。38的补码11011010BMOVAL,11011010B;-38ALMOVCH,00000011B;+3CHCBW;AX=1111111111011010BIDIVCH;AX/CHAL=-12(商)AH=-2(余数)AAD除法的ASCII调整指令(ASCIIAdjustforDivision)格式:AAD;功能:做除法时,把BCD码转为二进制数ALAH10+ALAH00,例:设AX0307HBL05H求AXBL=?编程如下:AAD;转换0310+07371025H=00100101BAL,AH=00DIVBL;AX/BL的商AL=7AX/BL的余数AH=2,例3-64编写程序,计算75/6123该除法运算过程表示如下:第一个商为112第二个商为26756第一个余15数为1123第二个余数为3,程序如下:FIRSTDB06H;除数6SECONDDB75H;被除数75THIRDDB2DUP(0);存商FOURDB?;存余数.MOVAH,00H;第一个被除数高位AH清零MOVAL,SECOND;AL被除数75ANDAL,0F0H;截取高4位MOVCL,04HROLAL,CL;移至低4位DIVFIRST;AX/06,即0007/06得结果:AL商为1,AH余数1,MOVTHIRD+1,AL;结果单元第一个商1MOVAL,SECOND;AL被除数75ANDAL,0FH;AL截低四位,故AX0105HAAD;将AX中内容0105H调整为0FHDIVFIRST;0FH/6,结果:AL商为2AH余数为3MOVTHIRD,AL;THIRD单元第二个商2MOVFOUR,AH;FOUR单元第二个余数2,图316表示上述除法程序执行过程中,数据在内存中的存放格式。FIRST06除数SECOND75被除数THIRD02商THIRD+101FOUR03余数,4.3.3逻辑运算与移位指令,1逻辑运算指令2移位指令3循环移位指令,1逻辑运算指令,(1)求反指令NOT(2)逻辑乘指令AND(3)测试指令TEST(4)逻辑加指令OR(5)按位加指令XOR,(1)求反指令NOT语句格式:NOTOPD功能:将目的地址中的内容逐位取反后送入目的地址。即(OPD)OPD【例4.21】逻辑非运算。MOVAX,878AH;(AX)=878AHNOTAX,;(AX)=7875H,(2)逻辑乘指令AND语句格式:ANDOPD,OPS功能:将目的操作数和源操作数进行逻辑乘运算,结果存目的地址。即(OPD)(OPS)OPD。该指令用于清除目的操作数中与源操作数置0的对应位。说明:逻辑乘的运算法则为:11=1,10=0,01=0,00=0【例4.22】将AL中第3位和第7位清零。MOVAL,0FFHANDAL,77H,(3)测试指令TEST语句格式:TESTOPD,OPS功能:源地址和目的地址的内容执行按位的逻辑乘运算,结果不送入目的地址。即(OPD)(OPS)。【例4.23】测试AX中的第12位是否为0,不为0则转L。TESTAX,1000HJNEL,(4)逻辑加指令OR语句格式:OROPD,OPS功能:将目的操作数和源操作数进行逻辑加运算,结果存目的地址。即(OPD)(OPS)OPD。说明:逻辑加的运算法则为:11=1,10=1,01=1,00=0。【例4.24】将AL寄存器中第3位和第7位置1。MOVAL,0ORAL,88H,(5)按位加指令XOR语句格式:XOROPD,OPS功能:目的操作数与源操作数做按位加运算,结果送入目的地址。即(OPD)(OPS)OPD。说明:按位加的运算法则为;11=0,10=1,01=1,00=0。【例4.25】按位加运算。MOVAL,45H;(AL)=45HXORAL,31H;(AL)=74H,2移位指令,移位指令包括算术移位指令、逻辑移位指令和循环移位指令,分别进行左移和右移操作。这些指令均有统一的语句格式:标号:操作符OPD,1或标号:操作符OPD,CL其功能为将目的操作数的所有位按操作符规定的方式移动1位或按寄存器CL规定的次数(0255)移动,结果送入目的地址。目的操作数是8位(或16位)的寄存器数据或存储器数据。,(1)算术左移和逻辑左移指令SAL(SHL)语句格式:SALOPD,1或SHLOPD,1SALOPD,CL或SHLOPD,CL功能:将(OPD)向左移动CL指定的次数,最低位补入相应的,的内容为最后移入位的值。,(2)算术右移指令SAR语句格式:SAROPD,1或SAROPD,CL功能:将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。,【例4.26】算术右移运算。MOVBH,0F4H;(BH)=0F4HMOVCL,2;(CL)=2SARBH,CL;(BH)=0FDH,(CF)=0该例语句“SARBH,CL”实际上完成了(BH)BH的运算,所以,用SAR指令可以实现对有符号数除2n的运算(n为移位次数)。,(3)逻辑右移指令SHR语句格式:SHROPD,1或SHROPD,CL功能:将(OPD)向右移动CL规定的次数,最高位补入相应个数的,CF的内容为最后移入位的值。,3.循环移位指令(1)循环左移指令ROL语句格式:ROLOPD,1或ROLLPD,CL功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向左移动CL规定的次数。CF的内容为最后移入位的值。,(2)循环右移指令ROR语句格式:ROROPD,1或ROROPD,CL功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向右移动CL规定的次数,CF的内容为最后移入位的值。,(3)带进位的循环左移指令RCL语句格式:RCLOPD,1或RCLOPD,CL功能:将目的操作数连同CF标志一起向左循环移动CL规定的次数。,(4)带进位的循环右移指令RCR语句格式:RCROPD,1或RCROD,CL功能:将目的操作数连同CF标志一起向右循环移动所规定的次数。,4.3.4串操作类指令(string),串操作指令:数据传送类指令每次只能传送一个数据,若要传送大批数据就需要重复编程,这样就浪费了大量的时间和空间。为此8086提供了一组处理主存中连续存放数据串的指令,这就是串操作指令。,图4.3流程图总结了串操作的过程。,图2.3串操作流程图,1传送指令MOVS;format:MOVS目的串,源串;(judgeMOV)MOVSB,MOVSWfunction:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。即:(DS:SI)ES:DI。DF=0,(SI)和(DI)+1or2。DF=1,(SI)和(DI)-1or2。,2串比较指令CMPSformat:CMPS目的串,源串;CMPSB,CMPSWfunction:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。即:(SI)(DI)。修改串指针,使之指向串中的下一个元素。当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。,3串搜索指令SCASformat:SCAS目的串SCASB,SCASWFunction:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存,即:字节操作:(AL)(DI),字操作:(AX)(DI)。修改指针使之指向串中的下一个元素。当DF=0时,(DI)增量。当DF=1时,(DI)减量。,4从源串中取数指令LODSfunction:LODS源串;LODSB,LODSWfunction:将SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入AL(或AX)中。即:字节操作:(SI)AL,字操作:(SI)AX。修改指针SI,使它指向串中的下一个元素。当DF=0时,(SI)增量。当DF=1时,(SI)减量。,5往目的串中存数指令STOSformat:STOS目的串STOSB,STOSWfunction:将AL或AX中的数据送入DI所指的目的串中的字节(或字)存储单元中。即:字节操作:(AL)DI,字操作:(AX)DI。修改指针DI,使之指向串中的下一个元素。当DF=0时,(DI)增量)。当DF=1时,(DI)减量。,6重复前缀指令REPREPE/REPZREPNE/REPNZ(1)REPREP前缀用在MOVS、STOS、LODS指令前。功能:每执行一次串指令(CX)1,直到(CX)=0,重复执行结束。(2)REPE/REPZ该指令一般用在CMP、SCAS指令前。功能:每执行一次串指令(CX)1,并判断ZF标志是否为0,只要(CX)=0或ZF=0,则重复执行结束。(3)REPNE/REPNZ该指令一般用在CMPS、SCAS指令前。功能:每执行一次串指令(CX)1,并判断ZF标志是否为0,只要(CX)=0或ZF=1,则重复执行结束。,字符串指令的隐含约定:1)源串:位于当前数据段,始(末)地址DS:SI,可用段前缀修改段地址。2)目的串:位于当前附加段,始(末)地址ES:DI,不允许用前缀修改ES.若在同一段内进行串运算,必使DS和ES指向同一段。,指令名称,字节/字操作,字节操作,字操作,字符串传送MOVS目的串,源串MOVSBMOVSW,字符串操作指令的类型和格式,字符串比较CMPS目的串,源串CMPSBCMPSW,字符串扫描SCAS目的串SCASBSCASW,字符串装入LODS源串LODSBLODSW,字符串存储STOS目的串STOSBSTOSW,3)每执行一次串操作,SI、DI自动修改。4)SI、DI自动修改方法(每执行一次时)DF=0(递增)字节操作:SI、DI增1字操作:SI、DI增2DF=1(递减)字节操作:SI、DI减1字操作:SI、DI减25)字符串长度放在CX寄存器中重复前缀的使用:在基本串指令前加前缀,每重复一次CX1CX,4.3.5控制转移类指令,1无条件转移指令2条件转移指令3循环控制指令4子程序调用指令,1、无条件转移和调用指令1)JMP无条件转移指令(JUMP)格式:JMP目的地址功能:使程序转到指令中指定的目的地址去执行。,JMP指令的类型:A类:段内转移转移目的地址与JMP指令同段B类:段间转移程序转到另一代码段去执行,类型方式寻址目标指令举例,段内转移,段间转移,直接立即短转移(8位)JMPSHORTPROG_S,直接立即近转移(16位)JMPNEARPTRPROG_N,间接寄存器(16位)JMPBX,间接存储器(16位)JMPWORDPTR5BX,直接立即转移(32位)JMPFARPTRPROG_F,间接存储器(32位)JMPDWORDPTRDI,表3-10无条件转移指令的类型和方式,a.段内直接转移指令JMPSHORT标号;IPIP+DISP_LJMPNEARPTR标号;IPIP+16位位移量例:偏移量机器码程序00000405PROG_S:ADDAL,05H000290NOP0003EBFBJMPSHORTPROG_S;000590NOPEND,机器码在内存中放置:代码段CS=0000H00000040000105000029000003EB00004FB00005900000600007,计算:指令中位移量(FB)目的地址偏移量IP当前值0-5-5补码FBH转移指针IPIP当前值+指针中的位移量0005H+FFFB0000H即转到PROG_S处去执行。,b.段内间接转移指令*设BX4500HJMPBX;IPBX寄存器内容*设DS=2000H,BX=100H,(20105H)=4F00HJMPWORDPTR5BX;IP存储器单元内容IP(20000H+100H+5H)(20105H)=4F00H程序转到代码段内地址为4F00处去执行。,c.段间直接(远)转移指令指令中指定的段地址CS指定的位移量IP设标号PROG_F所在段址3500H,其偏移量080AHJMPFARPTRPROG_F;转到:IP080AHCS=3500H处去执行,d.段间间接转移指令设CS=1200HIP=05HDS=2500HSI=1300H(26425H)=4500,(26427H)=32F0JMPDWORDPTRSI+0125H;目的操作数地址=DS10HSIDISP=26425HIP=4500HCS=32F0H执行后转到32F0:4500H处去执行,2)过程调用和返回指令(CALLandRETURN)子程序(subroutine)(过程procedure):具有特定功能的程序段主程序:调用子程序的程序过程嵌套:在过程运行中又去调用另一过程,过程(子程序)以PROC语句打头过程结束RETENDP主程序:过程:过程名:PROCNEAR:CAL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论