




已阅读5页,还剩57页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,数据传送指令总结,共14条,分为4组,2,二、算术运算类指令,算术运算类指令用来执行二进制的算术运算:加减乘除。这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志方法:通过理解指令含义、多读程序掌握指令。,3,80868088有丰富的算术运算指令,而且可以处理4种类型的数据,如下表所示:,4,二、算术运算指令(四类,20条),5,运算数据格式和对标志位影响,1)数据类型,6,2)运算数据格式和对标志位影响,对标志位的影响:所有算术运算指令都影响状态标志CF、PF、AF、ZF、SF和OF当无符号数运算结果溢出时,CF=1当有符号数运算产生溢出时,OF=1当运算结果中低8位有偶数个1或0个1,则PF=1若加法时第3位给第4位进位,或减法时第3位从第4位借位,则AF=1若运算结果为0,则ZF=1若运算结果为负数,则SF=1,7,3)加法和减法指令,加法指令:ADD,ADC和INC减法指令:SUB,SBB,DEC,NEG和CMP他们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位操作数组合:运算指令助记符reg,imm/reg/mem运算指令助记符mem,imm/reg,8,加和减指令,ADDdest,src;加法:destdestsrc;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数SUBdest,src;减法:destdestsrc;SUB指令使目的操作数减去源操作数,差的结果送到目的操作数,9,(1)加法指令,在微处理器中,没有专用的BCD码运算指令,使用二进制运算指令进行BCD码数的运算,然后用BCD码运算调整指令进行调整,重新得到BCD码的结果。,:影响;:不影响:状态不定;1:置为1,10,(1)加法指令,加法指令ADD(ADDition)。指令格式及操作:ADDdst,src;(dst)(dst)+(src)带进位加法指令ADC(ADditionwithCarry)。ADCdst,src;(dst)(dst)+(src)+(CF)例、4字节的加法MOVAX,SIADDDI,AXMOVAX,SI+2ADCDI+2,AX,11,多字节加法运算程序例4.3计算两个多字节十六进制数之和:3B74AC60F8H+20D59E36C1H=?式中被加数和加数均有5个字节,可以编一个循环程序实现以上运算。假设已将被加数和加数分别存入从DATA1和DATA2开始的两个内存区,且均为低位字节在前,高位字节在后,如图4.15所示。要求相加所得结果仍存回以DATA1为首址的内存区。(如果结果存放到DATA3为为首址的内存区?),12,图4.15例4.3中被加数和加数在内存中的存放情况,图4.16例4.3的程序流程图,13,程序流程图如图4.16所示。程序如下:MOVCX,5;设置循环次数MOVSI,0;置位移量初值CLC;清进位CFLOOPER:MOVAL,DATA2SI;取一个加数ADCDATA1SI,AL;和一个被加数相加INCSI;位移量加1DECCX;循环次数减1JNZLOOPER;加完否,若没完,转LOOPERHLT;程序暂停,14,如果结果存放到DATA3为为首址的内存区?程序如下:MOVCX,5;设置循环次数MOVSI,0;置位移量初值MOVDI,0CLC;清进位CFLOOPER:MOVAL,DATA2SI;取一个加数ADCAL,DATA1SI;和一个被加数相加MOVDATA3DI,ALINCSI;位移量加1INCDIDECCX;循环次数减1JNZLOOPER;加完否,若没完,转LOOPERHLT;程序暂停,15,加1指令INC(INCrementby1)。指令格式及操作:INCdst;(dst)(dst)+1INCreg/mem;指令影响状态标志位,如SF、ZF、AF、PF和OF,但对进位标志CF没有影响。INC指令中目的操作数可以是寄存器或存储器,但不能是立即数和段寄存器。其类型为字节操作或字操作均可。例如:INCDLINCSIINCBYTEPTRBXSI;对存储器字节操作INCWORDPTRDI;对存储器字操作使用场合:INC指令常常用于在循环程序中修改地址。,16,(2)减法指令。减法指令包括不带借位减法指令、带借位减法指令、减1指令、求补指令和比较指令。,SUB目的,源;不带借位的减法SBB目的,源;带借位的减法DEC目的;减1指令NEG目的;求补指令CMP目的,源;结果不送回,只影响状态位AAS;减法的ASCII调整指令DAS;减法的十进制调整指令,17,减法指令,18,减法指令SUB(SUBtraction)。指令格式及操作:SUBdst,src;(dst)(dst)(src),影响状态标志位操作数的类型:目的操作数可以是寄存器或存储器,源操作数可以是立即数、寄存器或存储器,但不允许两个存储器操作数相减;既可以字节相减,也可以字相减。数据的类型:可据程序员的要求约定为带符号数或无符号数。当无符号数不够减时产生借位(CF=1)。当带符号数的不够时减将得到负的结果(SF1),带符号数相减如果结果溢出,则OF置1。SUBAL,37HSUBDX,BXSUBCX,VARE1SUBARRAYDI,AXSUBBETABXDI,512;BETA为字型变量,若为字节型变量,则源操作数超出范围,19,带借位减法指令SBB(SuBtractionwithBorrow)。SBBdst,src;(dst)(dst)(src)(CF),影响状态标志位带使用场合:借位减指令主要用于多字节的减法。SBBBX,1000SBBCX,DXSBBAL,DATA1SISBBDISPBP,BLSBBBYTEPTRSI+6,97,20,减1指令DEC(DECrementby1)。DECdst;(dst)(dst)1DEC指令将目的操作数减1,结果送回目的操作数。指令对状态标志位SF、ZF、AF、PF和OF有影响,但不影响进位标志CF。操作数可以是寄存器或存储器(立即数和段寄存器不可)。其类型是字节操作或字操作均可。在循环程序中常常利用DEC指令来修改循环次数。,指令举例DECBLDECCXDECBYTEPTRBXDECWORDPTRBPDI,指令使用举例MOVAX,0FFFFHCYC:DECAXJNZCYCHLT,21,求补指令NEG(NEGate)。NEGdst;(dst)0(dst)NEG指令的操作是用“0”减去目的操作数,结果送回原来的目的操作数。求补指令对状态标志位有影响。操作数可以是reg或mem。可以对8位数或16位数求补。使用场合:利用NEG指令可以得到负数的绝对值。例如:NEGBLNEGAXNEGBYTEPTRBPSINEGWORDPTRDI+20,22,例4.4内存数据段存放了200个带符号数,首地址为TAB1,要求将各数取绝对值后存入以TAB2为首址的内存区。由于200个带符号数中可能既有正数,又有负数,因此先要判断正负。如为正数,可以原封不动地传送到另一内存区;如为负数,则需先求补即可得到负数的绝对值,然后再传送。程序如下:画出流程图,23,05h,F1h,tab1,tab2,DS,eg:以tab1为首地址存放了200个带符号数,要求将各数求绝对值后存入以tab2为首地址的内存区。,求绝对值,24,LEASI,TAB1;(SI)源地址指针LEADI,TAB2;(DI)目标地址指针MOVCX,200;(CX)循环次数CHECK:MOVAL,SI;取一个带符号数到ALORAL,AL;AL内容不变,但使之影响标志JNSNEXT;若(SF)=0,则转NEXTNEGAL;否则求补NEXT:MOVDI,AL;传送到目标地址INCSI;源地址加1INCDI;目标地址加1DECCX;循环次数减1JNZCHECK;如不等于零,则转CHECKHLT;停止,25,比较指令CMP(CoMPare)。指令格式及操作:CMPdst,src;(dst)(src)CMPREG/Mem,Imm/REG/Mem比较指令与减法指令SUB的区别:CMP指令将目的操作数减源操作数,但结果不送回目的操作数。执行比较指令以后,被比较的两个操作数内容均保持不变,而比较结果反映在状态标志位上。,26,对操作数要求:CMP指令的目的操作数可以是寄存器或存储器,源操作数可以是立即数、寄存器或存储器,但不能同时为存储器。可以进行字节字比较。例如:CMPAL,0AH;寄存器与立即数比较CMPCX,DI;寄存器与寄存器比较CMPAX,AREA1;寄存器与存储器比较CMPBX+5,SI;存储器与寄存器比较比较指令的执行结果将影响状态标志位。例如,若两个被比较的内容相等,则(ZF)=1。又如,假设被比较的两个无符号数中,前者小于后者(即不够减),则(CF)=1,等等。比较指令常常与条件转移指令结合起来使用,完成各种条件判断和相应的程序转移。,27,例4.5在数据段从MYDATA开始的存储单元中分别存放了两个8位无符号数,试比较它们的大小,并将大者传送到MAX单元。程序如下:LEABX,MYDATA;MYDATA偏移地址送BXMOVAL,BX;第一个无符号数送ALINCBX;BX指向第二个无符号数CMPAL,BX;两个数比较JNCDONE;如CF=0,则转DONEMOVAL,BX;否则,第二个无符号数送ALDONE:MOVMAX,AL;较大的无符号数送MAX单元HLT;停止,28,例、加减运算对状态位影响,movax,7348h;AX7348Haddal,27h;AL48H27H6FH,AX736FH;OF0,SF0,ZF0,PF1,CF0addax,3fffh;AX736FH3FFFHB36EH;OF1,SF1,ZF0,PF0,CF0subah,0f0h;AHB3HF0HC3H,AXC36EH;OF0,SF1,ZF0,PF1,CF1movwordptr200h,0ef00h;200HEF00H,标志不变sub200h,ax;200HEF00HC36EH2B92H;OF0,SF0,ZF0,PF0,CF0subsi,si;SI0;OF0,SF0,ZF1,PF1,CF0,29,(3)乘法指令,AL,源操作数,AX,源操作数,:不确定,:影响。,30,无符号数乘法指令MUL(MULtiplicationunsigned)。指令格式及操作:MULsrc;(AX)(AL)(src)(字节乘法);(DX:AX)(AX)(src)(字乘法)例、MULAL;AL乘以AL,结果在AX中MULBX;AX乘以BX,结果在DX:AX中MULBYTEPTRDI+6;AL乘以存储器(8位),结果在AX中MULWORDPTRALPHA;AX乘以存储器(16位),结果在;DX:AX中,31,如果运算结果的高半部分(在AH或DX中)为零,则状态标志位(CF)=(OF)=0,否则(CF)=(OF)=1。因此,状态标志位(CF)=(OF)=1,表示AH或DX中包含着乘积的有效数字。例如:MOVAL,14H;(AL)=14HMOVCL,05H;(CL)=05HMULCL;(AX)=0064H,(CF)=(OF)=0本例中结果的高半部分(AH)=0,因此,状态标志位(CF)=(OF)=0。AAM;乘法的ASCII码调整指令,只能在MUL指令后。调整算法:AH=AL/10AL=ALMOD10,32,带符号数的乘法IMUL(IntegerMULtiplication)。指令格式如下:IMULsrc;(AX)(AL)(src)(字节乘法);(DX:AX)(AX)(src)(字乘法)IMUL指令对状态标志位的影响以及操作过程同MUL指令。但IMUL指令进行带符号数乘法,指令将两个操作数均按带符号数处理。这是它与MUL指令的区别所在。数值范围不同:8位和16位带符号数的取值范围分别是128+127和32768+32767。如果乘积的高半部分仅仅是低半部分符号位的扩展(当乘积为正值时,其符号位为零),则状态标志位(CF)=(OF)=0;否则,高半部分包含乘积的有效数字而不只是符号的扩展(当乘积是负值时,其符号位为1,则AH或DX的高半部分为8位全1或16位全1),则(CF)=(OF)=1。,33,例如:MOVAX,04E8H;(AX)=04E8HMOVBX,4E20H;(BX)=4E20HIMULBX;(DX:AX)=(AX)(BX),以上指令的执行结果为:(DX)=017FH,(AX)=4D00H,且(CF)=(OF)=1。实际上以上指令完成带符号数+1256和+20000的乘法运算,得到乘积为+25120000。由于此时DX中结果的高半部分包含着乘积的有效数字,故状态标志位(CF)=(OF)=1。,34,例:计算两个非压缩十进制数95,编写程序段。解:AAM指令用来调整两个非压缩十进制数相乘的结果,调整后得到的非压缩十进制数其高位放在AH中,低位放在AL中。MOVAL,09MOVBL,05MULBL;(AX)=002DHAAM执行该指令段后:AH=04H,AL=05H调整算法:AH=AL/10AL=ALMOD10;(取余数),35,DIV源:无符号数除法8位除法:AX/源的商在AL中,AX/源的余数在AH中16位除法:(DX,AX)/源的商在AX中,余数在DXIDIV源(IntegerDivision):有符号数除法AAD(ASCIIAdjustforDivision):调整非压缩十进制数,调整被除数,调整算法:AL=AH*10+ALAH=0,(4)除法指令,36,无法确定,无法确定,37,8086/8088CPU执行除法时规定:除数只能是被出数的一半字长。当被除数为16位时,除数应为8为;当被除数为32位时,除数应为16为,38,无符号数除法指令DIV(DIVisionunsigned)。DIVsrc;(AL)(AX)/(src)的商(字节除法);(AH)(AX)/(src)的余数;(AX)(DX:AX)/(src)的商(字除法);(DX)(DX:AX)/(src)的余数执行DIV指令时,如果除数为0,或字节除法时AL寄存器中的商大于FFH,或字除法时AX寄存器中的商大于FFFFH,则CPU立即自动产生一个类型号为0的内部中断。有关中断的概念将在本书第7章中详细讨论。DIV指令使状态标志位SF、ZF、AF、PF、CF和OF的值不确定。,39,隐含:在DIV指令中,一个操作数(被除数)隐含在累加器AX(字节除)或DX:AX(字除法)中,另一个操作数src(除数)必须是寄存器或存储器操作数。两个操作数被作为无符号数对待。例如:DIVBL;AX除以BLDIVCX;DX:AX除以CXDIVBYTEPTRDATA;AX除以存储器(8位)DIVWORDPTRDI+BX;DX:AX除以存储器(16位),40,下面几条指令将DX:AX中的一个32位无符号数除以CX中的一个16位无符号数。MOVAX,0F05H;(AX)=0F05HMOVDX,068AH;(DX)=068AHMOVCX,08E9H;(CX)=08E9HDIVCX;商(AX)=BBE1H,余数(DX)=073CH执行结果为:068A0F05H08E9H=BBE1H073CH。除法指令规定了必须用一个16位数除以一个8位数,或用一个32位数除以一个16位数,而不允许两个字长相等的操作数相除。如果被除数和除数的字长相等,如何处理?(对符号数和有符号数处理有所不同),41,带符号数除法指令IDIV(IntegerDIVision)。IDIVsrc;(AL)(AX)/(src)的商(字节除法);(AH)(AX)/(src)的余数;(AX)(DX:AX)/(src)的商(字除法);(DX)(DX:AX)/(src)的余数数值范围及中断的产生:执行IDIV指令时,如除数为0,或字节除法时AL寄存器中的商超出128+127的范围,或字除法时AX寄存器中的商超出32768+32767的范围,则自动产生一个类型为0的中断。如果被除数和除数字长相等,则在用IDIV指令进行带符号数除法之前,必须先用符号扩展指令CBW或CWD将被除数的符号位扩展,使之成为16位数或32位数。关于CBW和CWD指令,本节后面将进行介绍。,42,(5)符号扩展指令。对于无符号数,扩展字长比较简单,只需添上足够个数的零即可。例如,以下两条指令将AL中的一个位无符号数扩展成为16位,存放在AX中。MOVAL,0FBH;(AL)=11111011BXORAH,AH;(AH)=00000000B但对于带符号数,扩展字长时正数与负数的处理方法不同。正数的符号位为零,而负数的符号位为,因此,扩展字长时,应分别在高位添上相应的符号位,这样才能保证原数据的大小和符号不变。符号扩展指令就是用来对带符号数字长的扩展。,43,字节扩展指令CBW(ConvertBytetoWord)。CBW;如果(AL)9时,调整指令需做加60H处理。,72+91=163,加法运算后,当CF=1(有进位产生)时,调整指令应做加60H处理。,49,(1)十进制加法的调整指令。根据BCD码的种类,对BCD码加法进行十进制调整的指令有两条,即AAA和DAA。非压缩型BCD码加法调整指令AAA(ASCIIAdjustforAddition)。指令格式如下:AAA压缩型BCD码加法调整指令DAA(DecimalAdjustforAddition)。指令格式如下:DAA,50,AAA指令的操作为:如果(AL)0FH9或(AF)1则(AL)(AL)06H(AH)(AH)1(AF)1(CF)(AF)(AL)(AL)0FH)否则(AL)(AL)0FH)DAA指令的操作为:如果(AL)0FH9,(AF)1则(AL)(AL)06H(AF)1如果(AL)9FH或(CF)1则(AL)(AL)60H(CF)1,与AAA指令不同,DAA只对AL中的内容进行调整,任何时候都不会改变AH的内容。,51,例要求计算两个十进制数之和,78?。可用以下指令实现:MOVAX,0007H;(AL)=07H,(AH)=00HMOVBL,08H;(BL)=08HADDAL,BL;(AL)=0FHAAA;(AL)=05H,(AH)=01H;(CF)=(AF)=1MOVAX,0007H;(AL)=07H,(AH)=00HMOVBL,08H;(BL)=08HADDAL,BL;(AL)=0FHDAA;(AL)=15H,(AH)=00H;(CF)=0,(AF)=1,52,例4.6计算4609+3875=?本例要求实现十进制多位数的加法。假设被加数的每一位数都以ASCII码形式存放在内存中,低位在前,高位在后。另外留出个存储单元,以便存放相加所得的结果,如图4.19所示。程序的流程图见图4.20。,53,图4.19例4.4数据存放情况,图4.20例4.4的程序流程图,54,程序如下:LEASI,STRING1;(SI)被加数地址指针LEABX,STRING2;(BX)加数地址指针LEADI,SUM;(DI)结果地址指针MOVCX,4;(CX)循环次数CLC;清进位标志CFNEXT:MOVAL,SI;取一个字节被加数ADCAL,BX;与加数相加AAA;ASCII调整MOVDI,AL;送存INCSI;SI加1INCBX;BX加1INCDI;DI加1DECCX;循环次数减1JNZNEXT;如不为零,转NEXTHLT;停止,55,(2)十进制减法的调整指令。AAS和DAS。非压缩型BCD码减法调整指令AAS;该指令隐含寄存器操作数为AL和AH。调整两个非压缩十进制数相加的结果,它不能单独使用,总是跟在减法指令后,且总是对AL寄存器操作。结果是一个非压缩十进制数,仍放在AL中,如果向高位有进位AF=1,则进到AH中。压缩型BCD码减法调整指令DAS;用于对两个压缩十进制数的相减结果进行调整,也总是跟在减法指令后。指令隐含寄存器操作数AL。,56,AAS指令的操作为:如果(AL)0FH9或(AF)1则(AL)(AL)06H(AH)(AH)1(AF)1(CF)(AF)(AL)(AL)0FH)否则(AL)(AL)0FH)DAS指令的操作为:如果(AL)0FH9,(AF)1则(AL)(AL)06H(AF)1如果(AL)9FH或(CF)1则(AL)(AL)60H(CF)1,与DAA指令类似,DAS指令也只对AL寄存器中的内容进行调整,而不改变AH的内容。DAS指令也将影响状态标志位SF、ZF、AF、PF和CF,但不影响OF。,57,例如,想要进行两位十进制数的减法运算:134=?,MOVAX,0103H;(AH)=01H,(AL)=03HMOVBL,04H;(BL)=04HSUBAL,BL;(AL)=03H04H=FFHAAS;(AL)=09H,(AH)=0,例如,要求完成两个2位的十进制数的减法运算:8338=?MOVAL,83H;(AL)=83HMOVBL,38H;(BL)=38HSUBAL,BL;(AL)=4BHDAS;(AL)=45H,58,(3)十进制乘除法的调整指令。对于十进制数的乘除法运算,8086/8088指令系统只提供了非压缩型BCD码的调整指令,而没有提供压缩型BCD码的调整指令。因此,8086/8088CPU不能直接进行压缩型BCD码的乘除法运算。非压缩型BCD码的乘除法与加减法不同:加减法可以直接用ASCII码参加运算,而不管其高位上有无数字,只要在加减指令后
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职业病培训大纲
- 少儿无人机课件
- 智慧生态农业谷项目解决方案
- 非煤矿山安全生产知识题库-单选题
- 浓密机培训课件
- 无痛胃肠镜检查及护理
- 煤矿职工培训
- 营业厅服务礼仪培训
- 重度胎膜早剥护理
- 计划调度具备哪些能力培训
- 2025年临床医师定期考核必考复习题库及答案(900题)
- 医保药械管理制度内容
- 新闻、记者采编人员岗位职业技能资格基础知识考试题及答案
- 宪法学与行政法考核试卷
- 山西民间美术(山西林业职业技术学院)知到智慧树答案
- 健身房物业保洁及安保服务实施方案
- 检察机关保密知识培训
- 3D打印技术与应用知到智慧树期末考试答案题库2024年秋西北工业大学
- 《常州红梅公园》课件
- 软件正版化工作培训
- Dahua大华7系报警柱快速操作手册
评论
0/150
提交评论