没有幻灯片标题 - 上海电力学院.ppt
1,3.3.2算术运算指令,涉及两种类型数据无符号数和有符号数。对加减法指令,无符号和有符号数可采用同一套指令,但应注意参加的操作数必须都是无符号数或都是有符号数。需使用不同的标志位CF,OF来检查无符号数和有符号数的运算结果是否溢出。这类指令一般都影响标志寄存器FLAGS。,2,表4-2算术运算类指令表,3,两个8位数相加时有4种情况,①无符号数和有符号数均不溢出二进制相加无符号数加有符号数加0000100088000111103030001001103838结果38CF0OF0,无符号数范围0255带符号数范围-128127,4,②无符号数溢出无符号数有符号数000010008811111101253-31000001012615结果5CF1OF0③有符号数溢出000010008801111101125(125)10000101133133结果-123CF0OF1(补码表示),,5,④无符号数和有符号数均溢出无符号数有符号数10001000136-12011110111247(-9)101111111383-129结果127CF1OF1上面四种情况说明,CF标志可用来表示无符号数的溢出,OF标志可用来表示有符号数的溢出。有符号数的溢出是一种出错状态,在运算过程中应当避免。,6,所有的算术运算指令,都会影响FLAGS标志寄存器的6个状态标志CF/OF/ZF/SF/AF/PF3个控制标志IF/DF/TF不受影响。总的讲,有这样一些规则当无符号数运算产生溢出即最高位向前有进位或借位时,CF1,否则为0;当有符号数运算产生溢出时,OF1即OFCF⊕CF-1,否则为0;当运算结果为0时,ZF1,否则为0;当运算结果为负数时,SF1,否则为0;当运算一半位置有进位或借位时,AF1,否则为0;当运算结果中有偶数个1时,PF1,否则为0。,7,共有5条1不带进位的加法指令ADD格式ADDacc,dataADDmem/reg,dataADDmem/reg1,mem/reg2注1.源和目的操作数不能同时为存储器操作数2.不能把段寄存器作为操作数例ADDAL,30HADDAX,[BX20H]ADDCX,SIADD[DI],200HADD指令对标志位(指6个状态标志)都有影响。,1.加法指令,8,2带进位位的加法指令ADC,ADC指令在形式上和功能上都有与ADD类似,只是相加时还要包括进位标志CF的内容。例如ADCAL,68H;AL←AL68HCFADCAX,CX;AX←AXCXCFADCBX,[DI];BX←BX[DI1][DI]CF,9,例有两个4字节的无符号数相加2C56F8AC309E47BE设被加数、加数分别存放在BUFFER1及BUFFER2开始的两个存储区内,结果放回BUFFER1存储区,如下页图所示。因CPU只能进行8位或16位的加法运算,为此可将加法分4次进行。,ADC指令主要用于多字节加法运算中,10,,,,56H,2CH,,,BEH,47H,BUFFER1,BUFFER2,ACH,F8H,9EH,30H,,,,被加数,加数,数据段,多字节加法示意图,,,,,,,,...,,...,11,程序段如下MOVCX,4;置循环次数MOVSI,0;置SI初值为零CLC;清进位标志CFLLMOVAL,BUFFER2[SI]ADCBUFFER1[SI],AL;带进位加INCSI;SI1DECCX;CX-1JNZLL;若CX0,则转LL思考若最高位有进位,如何改,12,ADD/ADC指令对条件标志位CF/OF/ZF/SF的影响,CF位表示无符号数相加的溢出。OF位表示带符号数相加的溢出。,13,格式INCreg/mem功能类似于C语言中的操作对指定的操作数加1例INCALINCSIINCBYTEPTR[BX4]注意本指令不影响CF标志,但对AF/OF/PF/SF/ZF会产生影响。,3加1指令INC(单操作数指令),14,1不考虑借位的减法指令SUB格式SUBdest,src操作dest←dest-src注1.源和目的操作数不能同时为存储器操作数2.不能把段寄存器作为操作数指令例子SUBAL,60HSUB[BX20H],DXSUBAX,CX,2.减法指令,15,SBB指令主要用于多字节的减法。格式SBBdest,src操作dest←dest-src-CF指令例子SBBAX,CXSBBWORDPTR[SI],2080HSBB[SI],DX,2考虑借位的减法指令SBB,16,例x、y、z均为32位数,分别存放在地址为X,X2;Y,Y2;Z,Z2的存储单元中,用指令序列实现wxy24-z,结果放在W,W2单元中。MOVAX,XMOVDX,X2ADDAX,YADCDX,Y2;xyADDAX,24ADCDX,0;xy24SUBAX,ZSBBDX,Z2;xy24-zMOVW,AXMOVW2,DX;结果存入W,W2单元,17,作用类似于C语言中的”--”操作符。格式DECopr操作opr←opr-1指令例子DECCLDECBYTEPTR[DI2]DECSI,3减1指令DEC,注该指令与INC一样,它不影响CF标志,但对AF/OF/PF/SF/ZF会产生影响。,18,格式NEGopr操作opr←0-opr对一个操作数取补码相当于用0减去此操作数,故利用NEG指令可得到负数的绝对值。例若AL0FCH,则执行NEGAL后,AL04H,CF1本例中,0FCH为-4的补码,执行求补指令后,即得到4-4的绝对值。,4求补指令NEG,19,SUB/SBB指令对标志位CF/OF/ZF/SF的影响,CF1表示无符号数减法溢出。OF1表示带符号数减法溢出。NEG指令对CF/OF的影响CF操作数为0时,求补的结果使CF0,否则CF1。OF字节运算对-128求补或字运算对-32768求补时OF1,否则OF0。,20,格式CMPdest,src操作dest←dest-src(而SUBdest,src;dest←dest-src)CMP也是执行两个操作数相减,但结果不送目标操作数,其结果只反映在标志位上。指令例子CMPAL,0AHCMPCX,SICMPDI,[BX03],5比较指令CMP,,,21,根据标志位来判断比较的结果,1根据ZF判断两个数是否相等。若ZF1,则两数相等。2若ZF0,则两个数不相等,则分两种情况考虑①比较的是两个无符号数若CF0,则dest>src;若CF1,则dest<src。②比较的是两个有符号数若OF⊕SF0,则dest>src;若OF⊕SF1,则dest<src。,22,比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。举例比较AL、BL、CL中带符号数的大小,将最小数放在AL中。程序CMPAL,BL;AL和BL比较JNGBBB;若AL≤BL,则转XCHGAL,BL;若AL>BL,则交换BBBCMPAL,CL;AL和CL比较JNGCCC;若AL≤CL,则转XCHGAL,CL;若AL>CL,则交换CCCHLT,思考程序的结果AL、BL、CL中数据的大小顺序,23,进行乘法时8位8位→16位乘积即ALmem8/reg8→AX16位16位→32位乘积即AXmem16/reg16→DXAX1无符号数的乘法指令MULmem/reg格式MULsrc操作字节操作数AXALsrc字操作数DX,AXAXsrc指令例子MULBL;ALBL,乘积在AX中MULCX;AXCX,乘积在DX,AX中MULBYTEPTR[BX],3.乘法指令,24,格式与MUL指令类似,只是要求两操作数均为有符号数。指令例子IMULBL;AX←ALBLIMULWORDPTR[SI];DX,AX←AX[SI1][SI],2有符号数乘法指令IMUL,注意MUL/IMUL指令中●ALAX为隐含的乘数寄存器;●AXDX,AX为隐含的乘积寄存器;●SRC不能为立即数;●除CF和OF外,对其它标志位无定义。,25,MUL/IMUL乘法指令对CF/OF的影响,例ALA5H-5B,BL11H1IMULBL;AXALBL;A511-5B11-060BF9F5;AXF9F5HCFOF12MULBL;AXALBL;A5110AF5;AX0AF5HCFOF1,26,4.除法指令,进行除法时16位/8位→8位商及8位余数32位/16位→16位商及16位余数对被除数、商及余数存放有如下规定被除数商余数字节除法AXALAH字除法DXAXAXDX,,,27,格式DIVsrc操作字节操作ALAX/src的商AHAX/src的余数字操作AXDX,AX/src的商DXDX,AX/src的余数指令例子DIVCLDIVWORDPTR[BX]注若除数为零或AL中商大于FFH或AX中商大于FFFFH,则CPU产生一个类型0的内部中断。,1无符号数除法指令DIV,28,2有符号数除法指令IDIV,格式IDIVsrc操作与DIV类似。商及余数均为有符号数,且余数符号总是与被除数符号相同。CBW与CWD两指令主要用于被除数扩展注意对于DIV/IDIV指令AXDX,AX为隐含的被除数寄存器。ALAX为隐含的商寄存器。AHDX为隐含的余数寄存器。src不能为立即数。对所有FLAGS的状态标志位均无定义。,29,运算要求被除数字长是除数字长的两倍,若不满足则需对被除数进行扩展,否则产生错误。8位16位16位32位ALAX(AHAL)AXDXAX对无符号数除法扩展,只需将AH或DX清零即可。对有符号数而言,则是符号位的扩展。可使用符号扩展指令CBW和CWD,关于除法操作中的字长扩展问题,30,例写出两带符号数34H25H的程序段。,MOVAL,34HMOVBL,25HCBW;AL的符号扩展到AHIDIVBL;0034H25H,结果为;AH0FH,AL01H,31,*5.BCD码运算的十进制调整指令,专用于对BCD码运算的结果进行调整包括AAA、DAA、AAS、DAS、AAM、AAD均为隐含寻址,隐含的操作数为AL和AH为何要对BCD码的运算结果进行调整BCD码本质上是十进制数,即应遵循逢十进一的规则。而计算机是按二进制(十六进制)进行运算,并未按十进制规则进行运算。,32,1加法的十进制调整指令,1非压缩BCD码加法调整AAA本指令对在AL中的由两个未组合的BCD码相加后的结果进行调正,得到一个正确的未组合的BCD码。注意AAA指令只影响AF和CF,其余标志无定义。AAA指令应紧跟在ADD或ADC指令之后。,33,如果AL的低4位>9∨AF1,则①AL←AL6,AH←AH1,AF←1②AL←AL∧0FH③CF←AF否则AL←AL∧0FH,AAA指令的操作如下,34,调整原理先看一个例子计算8+9000010000000100100010001=11而计算机相加为11,原因在于运算过程中,如遇到低4位往高4位产生进位时(此时AF1)是按逢十六进一的规则,但BCD码要求逢十进一,因此只要产生进位,个位就会少6,这就要进行加6调正。,这个1代表了16,而实际上仅应为10,即多进了6。,,35,实际上当低4位的结果>9即A~F之间时,也应进行加6调正原因是逢十没有进位,故用加6的方法强行产生进位。如对上例的结果进行加6000100011100000110600010111压缩式17∧00001111----------------------0000000100000111非压缩式,调整方法如果AL的低4位>9∨AF1,则①AL←AL6,AH←AH1,AF←1②AL←AL∧0FH③CF←AF否则AL←AL∧0FH,36,例2有两个字符串形式的十进制数,2658和3619,求二者之和。即26583619由题意知,被加数和加数的每一位都以ASCII码(与非压缩BCD码区别)形式存放在内存中。假定二数在内存中均是低位在前,高位在后,另留出5个单元存放相加的结果。内存中数据存放形式见下页图。,37,,,,,36H,32H,,,,,39H,31H,,,STRING1,STRING2,38H,35H,36H,33H,,,,被加数,加数,数据段,,‘8’,‘5’,‘6’,‘2’,‘9’,‘1’,‘6’,‘3’,,,,,SUM,,,结果,...,...,非压缩BCD码3改为0,,,SI,DI,BX,CX,CX,CX,38,程序段为LEASI,STRING1;STRING1偏移地址送SILEADI,STRING2;STRING2偏移地址送DILEABX,SUM;SUM偏移地址送BXMOVCX,4;循环4次CLC;清进位标志AGAINMOVAL,[SI]ADCAL,[DI];带进位加AAA;未压缩BCD码调正MOV[BX],AL;结果存入SUMINCSI;调整指针INCDIINCBXDECCX;循环计数器减1JNZAGAIN;若未处理完,则转AGAIN,39,思考题(1)根据程序写出结果SUM的值。(2)若最高位有进位,程序如何修改(3)从此例不难看出,用AAA指令也可对字符串形式的十进制数加法进行调整,所以它又被称为加法的ASCII调正指令。为什么AAA指令既可对非压缩BCD码加法进行调整,也可对ASCII码形式的十进制数进行调整注意AAA指令的第②步,40,2压缩BCD码加法调整DAA,两个压缩BCD码相加结果在AL中,通过DAA调整得到一个正确的压缩BCD码.指令操作调整方法若AL的低4位>9∨AF1则AL←AL6,AF←1若AL的高4位>9∨CF1则AL←AL60H,CF←1DAA指令影响除OF外所有其它标志。DAA指令应紧跟在ADD或ADC指令之后。,41,例48H74H0100100048MOVAL,48H0111010074MOVBL,74H10111100BCADDAL,BL0110011066DAA100100010122进位进位执行ADD后,ALBCH,高4位低4位均大于9,故DAA指令执行加66H调整,最后结果为AL22H,CF1,AF1,42,1非压缩BCD码减法的十进制调正指令AAS对AL中由两个非压缩的BCD码相减的结果进行调整。调整操作为若AL的低4位>9或AF1,则①AL←AL-6,AH←AH-1,AF←1②AL←AL∧0FH③CF←AF否则AL←AL∧0FH,2减法的十进制调整指令,43,举例16-8MOVAX,0106H0000011006MOVBL,08H-00001000-08SUBAL,BL11111110FEAAS-00000110-0611111000F8∧00001111∧0F0000100008结果为AL08H,AH0,CFAF1,,,44,2压缩BCD码减法的十进制调正指令DAS对AL中由两个压缩BCD码相减的结果进行调整。调整操作为,若AL的低4位>9∨AF1,则AL←AL-6,且AF←1若AL的高4位>9∨CF1,则AL←AL-60H,且CF←1注意AAS、DAS对标志位的影响与AAA、DAA相同。AAS、DAS指令要求紧跟在减法指令SUB或SBB之后。,45,3乘法的十进制调正指令AAM对AX中由两个非压缩BCD码相乘的结果进行调整。调整操作为AL/0AH,AH←商,AL←余数注意隐含的操作寄存器为AL和AH;AAM紧跟在MUL指令之后使用;影响标志位PF、SF、ZF,其它无定义;用AAM可实现≤99的二-十进制转换。,46,例1按十进制乘法计算78程序段如下MOVAL,07H;AL07HMOVCL,08H;CL08HMULCL;AX0038HAAM;AH05H,AL06H所得结果为非压缩的BCD码。例2把3AH转换成等值的十进制数。MOVAL,3AH;58AAM;AH05H,AL08H,47,4除法的十进制调正指令AAD,对非压缩BCD除法运算进行调整。调整操作为AL←AH0AH+ALAH←0注意隐含的操作寄存器为AH,AL;AAD要在DIV指令之前使用;影响标志位PF、SF、ZF,其它无定义;用AAD可实现≤99的十-二进制转换。,48,例1按十进制除法计算557程序段如下MOVAX,0505H;AX55BCDMOVCL,07H;CL7AAD;AX0037HDIVCL;AH6,AL7所得结果为非压缩的BCD码(商7余6)。例2把73转换成等值的二进制数。MOVAX,0703H;AX73BCDAAD;AX0049H,