资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,算术运算指令共有以下五类:,加法运算指令,减法运算指令,乘法运算指令,除法运算指令,转换指令。,3.3.2,算术运算指令,1,、加法与减法指令,加法指令 (,ADD,、,ADC,、,INC,),(1),不带进位加法指令(,ADD,),格式:,ADD DST, SRC,功能:执行源操作数,SRC,和目的操作数,DST,的相加操作,结果放,在目的操作数中。,说明:,DST,必须为累加器、任一通用寄存器或存储器操作数。,例:,ADD AL,,,30H,ADD SI,,,BX+20H,ADD CX,,,SI,ADD DI,,,200H,ADD,指令对,6,个状态标志均产生影响。,例:已知,(BX)=0D75FH,,指令,ADD BX ,8046H,执行后,状态标志各是多少?,0D75FH = 1101 0111 0101 1111,8046H = 1000 0000 0100 0110,1 1 11 11,0101 0111 1010 0101,结果:,CF=1, ZF=0, PF=1, AF=1, OF=1, SF=0,(2),带进位加法指令(,ADC,),格式:,ADC DST,,,SRC,功能:,ADC,与,ADD,类似,不同的是将进位标志,CF,的值加在和中。,ADD AL,,,50H,ADC AX,,,SI,例,:,有两个,4,字节的无符号数相加:,2C56F8AC+309E47BE=,?,因,CPU,只能进行,8,位或,16,位的加法运算,为此可将两数分成,低字,和,高字,分别相加,。,ADC,指令用于,多字节,加法运算中,56H,2,CH,BEH,47,H,BUFFER1,BUFFER2,ACH,F8H,9EH,30,H,被加数,加数,数据段,多字节加法,示意图,.,.,设被加数、加数分别存放在,BUFFER1,及,BUFFER2,开始的两个存储区内,结果放回,BUFFER1,存储区。,程序段如下:,MOV AX,,,BUFFER2,ADD BUFFER1,,,AX,MOV AX,,,BUFFER2+2,ADC BUFFER1+2,,,AX,56H,2,CH,BEH,47,H,BUFFER1,BUFFER2,ACH,F8H,9EH,30,H,.,.,;,低字相加,;,高字相加,,;,包括低字,;,的进位,ADD,加法指令和,ADC,加法指令原则,1.,源和目的操作数不能同时为存储器操作数,2.,源和目的操作数类型必须一致,即都是字,节或都是字,(3),自增指令(,INC,),格式:,INC DST,功能:将操作数的内容加,1,,再送回该操作数。,例:,INC AL,INC SI,INC BYTE PTRBX+4,注:本指令不影响,CF,标志。,减法指令,不带借位的减法指令,SUB,(,Sub,tract,),带借位的减法指令,SBB,(,S,u,b,tract with,b,orrow,),自减指令,DEC,(,Dec,rement,),取负指令,NEG,(,Neg,ate,),比较指令,CMP,(,C,o,mp,are,),(4),不带借位的减法指令,格式:,SUB DST,,,SRC,功能:将目的操作数减去源操作数,结果放在目的操作,数中,主要完成,2,个字节或,2,个字的相减。,注,:,1.,源和目的操作数不能同时为存储器操作数,2.,立即数不能作为目的操作数,指令例子:,SUB AL,,,60H,SUB BX+20H,,,DX,SUB AX,,,CX,(5),带借位的减法指令,格式:,SBB DST,,,SRC,功能:目的操作数减去源操作数的同时,还要减去,CF,的值。,指令例子:,SBB AX,,,2030H,SBB AX,,,CX,SBB WORD PTRSI,,,2080H,SBB SI,DX,(6),自减指令,格式:,DEC DST,功能:使目的操作数减,1,,再送回到目的操作数中。,指令例子:,DEC CL,DEC BYTE PTRDI+2,DEC SI,(7),取负指令,格式:,NEG DST,功能:对目的操作数求补码,结果送回目的操作数中。,说明:,对,1,个操作数取补码相当于用,0,减去此操作数。,如果操作数的值为,-128,或者,-32768,,那么,执行求补指令后,结果没变化,但,OV=1,。,NEG,指令会影响所有状态标志位。,例:,NEG AL,NEG CX,(8),比较指令,格式:,CMP DST,,,SRC,功能:执行两个数的相减操作,但不送回相减的结果,只是使结果影响标志位,AF,、,CF,、,OF,、,PF,、,SF,和,ZF,。,根据标志位来判断比较的结果,1),根据,ZF,判断两个数是否相等。若,ZF,=1,则两数相等。,2),若两个数不相等,则分两种情况考虑,:,比较的是两个无符号数,若,CF,=0,则,dest,src,;,若,CF,=1,则,dest,src,。,比较的是两个有符号数,若,OFSF,=0,,则,dest,src,;,若,OFSF,=1,,则,dest,src,。,比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。,举例:比较,AL,、,BL,、,CL,中带符号数的大小,将,最小数放在,AL,中。,程序:,CMP AL,BL,;,AL,和,BL,比较,JNG,BBB,;若,ALBL,则转,XCHG AL,BL,;若,AL,BL,则交换,BBB: CMP AL,CL,;,AL,和,CL,比较,JNG,CCC,;若,ALCL,则转,XCHG AL,CL,;若,AL,CL,则交换,CCC: HLT,2,乘法指令与除法指令,进行乘法时:,8,位, 8,位 ,16,位乘积,16,位, 16,位 ,32,位乘积,(1),无符号数的乘法指令,格式:,MUL SRC,功能:将,AL,(,8,位)或,AX,(,16,位)中的数据与源操作数相,乘,结果放在,AX,或,DX,与,AX,两寄存器中。,操作:字节操作数,(AX),(AL),(,src,),字操作数,(DX, AX),(AX),(,src,),MUL BL,;,AL,中的,8,位数和,BL,中的,8,位数相乘,,结果在,AX,中,MUL CX,;,(AX),(,CX),乘积在,DX,AX,中,MUL BYTE PTRBX,(2),有符号数的乘法指令,格式:,IMUL SRC,功能:功能和形式上与,MUL,很类似,只是要求两个乘数必,须均为有符号数。,IMUL BX,;,AX,和,BX,中的两个,16,位有符号数相乘,结果,在,DX,和,AX,中,注意:,MUL/IMUL,指令中,AL(AX),为隐含的乘数寄存器;,AX(DX,AX),为隐含的乘积寄存器;,SRC,不能为立即数;,除,CF,和,OF,外,对,其它,标志位无定义,。,除法指令,进行除法时:,16,位,/8,位 ,8,位商,32,位,/16,位,16,位商,对被除数、商及余数存放有如下规定:,被除数 商余数,字节除法,AX AL AH,字除法,DX:AX AX DX,(,3,)无符号数除法指令,格式:,DIV SRC,功能:把,AX,(或,DX,,,AX,),中的被除数除以,8,位,(或,16,位)源操作数,商数放在,AL(,或,AX),中,,余数放在,AH(,或,DX),中。,DIV CL,;,AX,中的数据除以,CL,中的数据,商,在,AL,中,余数在,AH,中,注:,若除数为零或,AL,中商大于,0FFH,(,或,AX,中商大于,0FFFFH),,,则,CPU,产生一个类型,0,的内部中断。,(4),带符号数除法指令,格式:,IDIV SRC,功能:与,DIV,相似,不同的是将除数,被除数,商和余数都看作是带符号数。,IDIV BX,;将,DX,和,AX,中的,32,位数除以,BX,中的,16,位数,运算,后,商在,AX,中,余数在,DX,中,除法运算时,要求用,16,位数除以,8,位数,或者用,32,位数除以,16,位数,当被除数只有,8,位时,必须将此,8,位数据放在,AL,中,并对高,8,位,AH,进行扩展。同样,当被除数只有,16,位,而除数也为,16,位时,必须将,16,位被除数放在,AX,中,并对高,16,位,DX,进行扩展。,3.,符号扩展指令,(1),字节扩展指令,格式:,CBW,功能:将,AL,寄存器中的符号位扩展到,AH,中。即当,AL,80H,时,执行,CBW,后,,AH=0,;当,AL,80H,时,执行,CBW,后,,AH=FFH,。,(2),字扩展指令,格式:,CWD,功能:用,CWD,指令将,AX,中的被除数扩展成双字。,例,:,写出,34H,25H,的程序段。,MOV AL,,,34H,MOV BL,,,25H,CBW ; AL,的符号扩展到,AH,DIV BL ; 0034H,25H,结果为,; (AH)=0FH, (AL)=01H,4,BCD,码调整指令,1,),加法的十进制调整指令,(,1,),非组合,BCD,码加法调整,AAA,本指令对在,AL,中的由两个非组合的,BCD,码相加后的结果进行调正,得到一个正确的非组合的,BCD,码。,AAA,指令只影响,AF,和,CF,,,其余标志无定义。,AAA,指令应紧跟在,ADD,或,ADC,指令之后。,AAA,指令的操作如下:,如果,AL,的低,4,位,9,AF=1,,,则:,AL,(AL)+6,(AH)(AH)+1,AF1, AL,(AL)0FH), CF,AF,否则,AL(AL)0FH,调整原理:先看一个例子,计算,8,9 0000 1000,见右式,+0000 1001,000,1,0001,11,结果应为,17,,而计算机相加为,11,,,原因在于运算过程中,如遇到低,4,位往高,4,位产生进位时(此时,AF=1,),是按逢十六进一的规则,但,BCD,码要求逢十进一,因此只要产生进位,个位就会少,6,,这就要进行加,6,调正。,这个,1,代表了,16,,而实际上仅应为,10,,即多进了,6,。,实际上当低,4,位的结果,9(,即,A,F,之间,),时,也应进行加,6,调正。,(,原因是逢十没有进位,故用加,6,的方法强行产生进位。,),如对上例的结果进行加,6,:,0001,0001,11,+ 0000 0110,6,0001 0111,17,结果正确。,(,2,),组合,BCD,码加法调整,DAA,两个组合,BCD,码相加结果在,AL,中,通过,DAA,调整得到一个正确的组合,BCD,码。,指令操作,(,调整方法,),:,若,AL,的低,4,位,9,AF=1,则,(AL),(AL)+6,,,AF1,若,AL,的高,4,位,9,CF=1,则,(AL),(AL)+60H,,,CF1,除,OF,外,,DAA,指令影响所有其它标志。,DAA,指令应紧跟在,ADD,或,ADC,指令之后。,例:,48+74=?,0100 1000 48H,MOV AL,,,48H,+ 0111 0100,74H,MOV BL,,,74H 1011 1100 BCH,ADD AL,,,BL,+ 0110 0110,66H,DAA,1,0010 0010,1,22H,(,进位,),(,进位,),执行,ADD,后,,(,AL)=BCH,,,高,4,位低,4,位均大于,9,,故,DAA,指令执行加,66H,调整,最后结果为:,(AL)=22H, CF=1, AF=1,(1),非组合,BCD,码减法的十进制调整指令,AAS,对,AL,中由两个非组合的,BCD,码相减的结果进行调整。调整操作为:,若,AL,的低,4,位,9,或,AF=1,则:,AL(AL)-6,AH(AH)-1,AF1, AL(AL)0FH, CFAF,否则:,AL(AL)0FH,2),减法的十进制调整指令,举例:,16-8=?,MOV AX,0106H 0000 0110 06,MOV BL,08H,- 0000 1000,- 08,SUB AL,BL 1111 1110 FE,AAS,- 0000 0110,- 06,1111 1000 F8,0000 1111,0F,0000 1000 08,结果为:,(AL)=08H,(AH)=0,(,CF,),=,(,AF,),=1,(2),组合,BCD,码减法的十进制调整指令,DAS,对,AL,中由两个组合,BCD,码相减的结果进行调整。调整操作为:,若,AL,的低,4,位,9,AF=1,则:,AL(AL)-6,且,AF1,若,AL,的高,4,位,9,CF=1,则:,AL(AL)-60H,,且,CF1,DAS,对,OF,无定义,但影响其余标志位。,DAS,指令要求跟在减法指令之后。,3),乘法调整指令,AAM,对,AX,中由两个非组合,BCD,码相乘的结果进行调整。调整操作为:,(AL)/0AH, (AH),商,,(AL),余数,隐含的操作寄存器为,AL,和,AH,;,AAM,跟在,MUL,指令之后使用;,影响标志位,PF,、,SF,、,ZF,,,其它,无定义,;,用,AAM,可实现,99,的二,-,十进制转换。,例,1,:按十进制乘法计算,7,8=?,程序段如下:,MOVAL,07H,;,(AL)=07H,MOVCL,08H,;,(CL)=08H,MULCL,;,(AX)=0038H,AAM,;,(AH)=05H,(AL)=06H,所得结果为非组合的,BCD,码。,例,2,:把,3AH,转换成等值的十进制数。,MOV AL,,,3AH,;,58,AAM,;,(AH)=05H,,,(AL)=08H,4),除法调整指令,AAD,对非组合,BCD,除法运算进行调整。调整操作为:,(AL)(AH),0AH,(AL),AH 0,隐含的操作寄存器为,AH,,,AL,;,AAD,要在,DIV,指令,之前,使用;,影响标志位,PF,、,SF,、,ZF,,其它,无定义,;,用,AAD,可实现,99,的十,-,二进制转换。,例,1,:按十进制除法计算,55,7=?,程序段如下:,MOVAX, 0505H,;,(AX)=55,BCD,MOVCL, 07H,;,(CL)= 7,AAD,;,(AX)=0037H,DIVCL,;,(AH)=6, (AL)=7,所得结果为非组合的,BCD,码(商,7,余,6,)。,例,2,:把,73,转换成等值的二进制数。,MOV AX, 0703H,;,(AX)= 73,BCD,AAD,;,(AX)=0049H,
展开阅读全文