1、,算术运算指令, 1. 加法指令,(1)不带进位加法指令ADD,指令格式: ADD DST,SRC;执行操作: DST(SRC)(DST),注意: (1)目的操作数不能为立即数。 (2)不允许两个操作数都为存储器操作数。 (3)段寄存器不能参与加法操作。 (4)指令执行结果影响CF、OF、PF、SF、ZF和AF标志位。OF位可以用来表示带符号数的运算是否溢出,而CF位则可用来表示无符号的运算是否有进位。,例:ADD AX,BXADD AL,2000HADD BX,ALADD BL,6HADD BYTE PTR SI,5HADC AX,BXADC AL,2000HADC BX,ALADC BL,
2、6HADC WORD PTR DI,89H,例:有两个4字节的无符号数相加:2C 56 F8 AC + 30 9E 47 BE = ?设被加数、加数分别存放在BUFFER1及BUFFER2开始的两个存储区内,结果放回BUFFER1存储区,如下页图所示。因CPU只能进行8位或16位的加法运算,为此可将加法分4次进行。,程序段如下:MOV CX,4 ;置循环次数MOV SI,0 ;置SI初值为零CLC ;清进位标志CF LL: MOV AL,BUFFER2SI ADC BUFFER1SI,AL ;带进位加INC SI ;(SI)+1DEC CX ;(CX)-1JNZ LL ;若(CX)0,则转LL
3、思考:若最高位有进位,如何改?, 1. 加法指令,(3),指令格式: INC OPR执行操作: OPR(OPR)1,加1指令INC,例:INC AXINC BYTE PTRBX,例:INC AL 前:AL=7FH,AF=0,CF=1,OF=0,SF=1,PF=0,ZF=1 后:AL=80H, AF=1,CF=1,OF=1,SF=1,PF=0,ZF=0,使用INC指令应注意: (1)目的操作数不能为立即数和段寄存器。 (2)目的操作数为存储器操作数时,应指明按字类型还是字节类型操作。 (3)本指令影响标志OF、PF、SF、ZF和AF,但不影响CF标志位。, 2. 减法指令,(4),求补指令NEG
4、,指令格式: NEG OPR执行操作: OPR 0 (OPR),(1)目的操作数可以是通用寄存器寻址或存储器寻址方式,若是存储器操作数,应指明按字类型还是字节类型操作。 (2)指令执行结果影响标志AF、OF、PF、SF、ZF和CF。仅当目的操作数为零时,CF=0;否则CF=1。 (3)对一个操作数求补相当于用0减去此操作数,故利用NEG指令可得到负数的绝对值。例:若(AL)=0FCH,则执行 NEG AL 后, (AL)=04H,CF=1本例中,0FCH为-4的补码,执行求补指令后,即得到4(-4的绝对值)。,例:在内存中有从BUF开始的10个无符号字数据,求出最大值存放到MAX单元中。, 3
5、.,(1)无符号数乘法指令MUL,乘法指令,指令格式: MUL SRC 指令操作:AX(AL)*(SRC);字节操作数DX,AX (AX)*(SRC);字操作数,例:MUL BL前:AL=00000011B,BL=00000010B后:AH=00000000B,AL=00000110B,OF=CF=0,源操作数可以采用寄存器寻址或存储器寻址方式,若是存储器操作数,应指明按字类型还是字节类型操作。,MUL WORD PTR SI,1) 乘法指令中源操作数不能为立即数; 2) AL(AX)为隐含的乘数寄存器; 3) AX(DX,AX)为隐含的乘积寄存器。 4) MUL指令,影响CF和OF标志位;当
6、结果的高一半等于0时(即AH或DX的内容),CF、OF都为0,否则CF、OF都为1; 5)IMUL指令,同样影响CF和OF标志位;当结果的高一半是低一半的符号扩展时,CF、OF都为0,否则CF、OF都为1;,除法指令, 4.,(1)无符号数除法指令DIV,指令格式: DIV SRC 指令操作:字节除法: AL(商)、AH(余数)(AX)/(SRC)字除法: AX(商)、DX(余数)(DX,AX)/(SRC) 源操作数可以采用寄存器或存储器操作数寻址方式。,DIV CLDIV WORD PTRBX,(3)字节转换为字指令CBW,指令功能:将源操作数由字节转换为字 指令格式:CBWCBW指令默认(
7、AL)为源操作数,若(AL)的最高有效位为0,则执行CBW后,(AH)=00H,若(AL)最高有效位为1,则执行CBW后,(AH)=0FFH。,例: 写出两带符号数34H25H的程序段。,MOV AL,34HMOV BL,25HCBW ; AL的符号扩展到AHIDIV BL ; 0034H25H,结果为 ; (AH)=0FH, (AL)=01H,ASCII的加法调整指令AAA ASCII的减法调整指令AAS 十进制的加法调整指令DAA 十进制的减法调整指令DAS 乘法的ASCII调整指令AAM 除法的ASCII调整指令AAD,十进制调整指令, 5.,8086提供了6种调整指令,注意:加法、减法
8、和乘法的调整指令都是紧跟在算术指令之后,将二进制的运算结果调整为十进制数。而除法的调整指令必须放在除法指令之前进行,以防止除法出现错误的结果。,例如:计算(X*YZ)/X,其中X、Y、Z均为16位带符号数,分别存入存储单元BUFF1、BUFF2、BUFF3中。MOV AX,BUFF1 ;将BUFF1存入默认被乘数寄存器AX IMUL BUFF2 ;带符号乘法运算,结果在(DX,AX) MOV CX,AX ;中间结果转移,让出AX寄存器 MOV BX,DX ;中间结果转移,让出DX寄存器 MOV AX,BUFF3 ; CWD ;将Z转换为双字放入(DX,AX) ADD CX,AX ; ADC BX,DX ;双字加法运算 MOV AX,CX ; MOV DX,BX ;将被除数存入默认寄存器(DX,AX) IDIV BUFF1 ;带符号除法运算,结果商(AX)余数(DX),