1、4.4.2 算术运算指令v加法指令ADD、ADC、INC、AAA、DAAv减法指令SUB、SBB、DEC、AAS、DAS、CMP、NEGv乘法指令MUL、IMUL、AAMv除法指令DIV、IDIV、AAD、CBW、CWDv小结 加法运算指令 2、加法运算指令 加法运算指令加法运算指令1、加指令ADDv形式:ADD 目的操作数,源操作数v功能:目操作数内容源操作数内容目的操作数;执行之后影响所有状态标志SF、ZF、AF、PF、CF、OF。v允许的操作数类型:目的操作数通用寄存器、存储器;源操作数通用寄存器、存储器、立即数。2、带进位的加指令ADCv功能:目操作数内容源操作数内容CF目操作数v其余
2、与ADD指令相同!3、自加1指令INCv形式:INC 操作数 (通用寄存器或存储器)v功能:操作数内容1 操作数;执行之后影响标志位SF、ZF、AF、PF、OF,但不影响CF!最常用的加法用于高字(字节)相加常用于修改地址指针8位数符号数和无符号数的溢出情况1.带符号数和无符号数都不溢出二进制加法 看作无符号数 看作带符号数 0000 1100 13 +13 +0010 1011 +55 +(+55)0011 0111 68 +68 CF0 OF02.无符号数溢出 二进制加法 看作无符号数 看作带符号数 0011 0101 53 +53 +1101 1010 +218 +(-38)1 0000
3、 1111 271 +15 CF=1 OF=0 现为15,结果错3.带符号数溢出 二进制加法 看作无符号数 看作带符号数 0001 0001 17 +17 +0111 0011 +115 +(+115)1000 0100 132 +132 CF0 OF=1 现为-124,结果错。4.带符号数和无符号数都溢出 二进制加法 看作无符号数 看作带符号数 1010 0111 167 (-89)+1001 1101 +157 +(-99)1 0100 0100 324 -188 CF=1 OF=1现为68,结果错。现为68,结果错。减法运算指令 减法运算指令减法运算指令减法运算指令1、减指令SUBv形式
4、:SUB 目操作数,源操作数v功能:目操作数内容源操作数内容目操作数;执行之后影响所有状态标志SF、ZF、AF、PF、CF、OF。v允许的操作数类型:目操作数通用寄存器、存储器;源操作数通用寄存器、存储器、立即数。2、带借位的减指令SBBv功能:目操作数内容源操作数内容CF目操作数v其余与SUB指令相同!3、自减1指令DECv形式:DEC 操作数 (通用寄存器或存储器)v功能:操作数内容1 操作数;执行之后影响标志位SF、ZF、AF、PF、OF,但不影响CF!最常用的减法用于高字(字节)相减常用于修改地址指针 比较指令CMP(Compare two operands)v比较指令通常用于比较两个
5、操作数的大小。由受影响的标志位状态来判断两个操作数比较的结果。不论是无符号数比较还是有符号数比较,若在比较指令后,(ZF)=1,则两者相等,否则不相等。若两者不相等,则可在比较两个数之后,利用其他标志位的状态来确定两者中哪个大。比较指令CMP 比较指令CMP比较指令CMPv使用方法与SUB、SBB相同。v功能:目操作数源操作数,同时影响状态标志SF、ZF、AF、PF、CF、OF。vCMP通常用于比较两个数,其后一般紧跟着条件转移指令以实现不同情况下的分支处理。v例:CMP AL,BL ;ALBL,保持寄存器的值不变 JNZ EQUAL ;若(ZF)0(不等),转EQUAL处 ;(ZF)1(相等
6、)情况下的处理不改变操作数本身的值!取相反数指令NEG取相反数指令NEGv形式:NEG 操作数v功能:0操作数内容操作数;影响所有状态标志SF、ZF、AF、PF、CF、OF v允许的操作数类型:通用寄存器、存储器实质上,NEG指令相当于将目操作数固定为0值的SUB指令;执行结果即取原数的相反数。乘法运算指令2、带符号数乘法 IMUL OPRD;操作同上 IMUL 进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中;进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。源操作数不允许使用立即数。乘法指令运算结果只影响状态标志CF、OF。例:MUL BX;无符号数乘法,B
7、X乘上AX乘法运算指令 乘法运算指令乘法运算指令乘法运算指令无符乘法指令:MUL 通用寄存器或存储器带符乘法指令:IMUL 通用寄存器或存储器乘积低字节AL乘积高字节AH乘积低位字AX乘积高位字DX除法运算指令 除法运算指令除法运算指令 除法指令:DIV 通用寄存器或存储器 除法指令:IDIV 通用寄存器或存储器商AL余数AH商AX余数DX 加法的十进制调整指令1、非压缩BCD码调整指令AAA(无操作数)v何时使用?两个非压缩BCD码相加,想得到非压缩BCD码结果自动调整AL中的和,非压缩BCD码的结果存在AL中,进位反映在AH上两个压缩BCD码相加,希望得到压缩BCD码结果自动调整AL中的和
8、,结果在AL中产生一个压缩BCD码的和 减法的十进制调整指令1、非压缩BCD码调整指令AAS(无操作数)两个非压缩BCD码相减,结果在AL中。要想得到非压缩BCD码的结果,在减法之后用AAS指令进行自动调整,可在AL中得到非压缩BCD码结果。若有借位,AH会自动减1。影响CF、AF。2、压缩BCD码调整指令DAS(无操作数)两个压缩BCD码相减,结果在AL中。要想得到组合BCD码的结果,在减法之后用DAS指令进行自动调整,可在AL中得到压缩BCD码结果。影响SF、ZF、AF、CF、PF。非压缩BCD码的乘法十进制调整指令AAM(ASCII adjust for multiply)非压缩BCD码
9、的乘法十进制调整指令AAMv应用举例:MOV AL,4 MOV CL,9 MUL CL ;04H09H0024HAX AAM ;(AL)103(AH)(AL)mod 106(AL)AX:非压缩BCD码AAM实现了16进制数十进制数的转化!非压缩BCD码的除法十进制调整指令AAD(ASCII adjust for division)非压缩BCD码的除法十进制调整指令AADv应用举例:MOV AX,0306H ;AX中是两个非压缩BCD码 MOV BL,9 AAD ;(AH)10(AL)0024H(AX);(SF)0,(ZF)0,(PF)1 DIV BL ;(AL)4,(AH)0 AAD指令进行的是AAM的逆操作vAAD必须在DIV之前,与其它调整指令不同!v只能进行非压缩BCD码除法调整。