1、任务3 8086指令系统,3.3.3算术运算类指令 8086的算术运算类指令包括加、减、乘、除4种基本运算指令,以及进行BCD码十进制数运算的指令。 算术运算指令涉及无符号数和带符号数两种类型的数据。加减运算采取同一套指令,乘除运算有各自不同的指令。加减法运算在执行过程中有可能产生溢出,对于无符号数,如果加法运算最高位向前产生进位,减法运算最高位向前有借位,则表示出现溢出,用CF标志位可检测无符号数是否溢出。对于带符号数,采用补码运算,符号位参加运算,溢出则表示运算结果发生错误,用OF标志位可检测带符号数是否溢出。,下一页,返回,上一页,任务3 8086指令系统,算术运算指令会影响标志位,其规
2、则如下。 运算结果向前产生进位或借位时,CF=1 最高位向前进位和次高位向前进位不同时,0F=1 若运算结果为0,ZF =1 若运算结果最高位为1,SF=1 若运算结果中有偶数个1,PF=1 算术运算指令有20条,分为5种类型,可对4种类型的数据进行运算,即无符号二进制数、带符号二进制数、无符号压缩型BCD码和无符号非压缩型BCD码。二进制数可以是8位或16位,十进制数以字节为单位参加运算。对于单操作数指令不允许使用立即数;对于双操作数指令至少有一个操作数在寄存器中,另一个操作数可以使用任意寻址方式;立即数不能作为目的操作数。运算结果影响状态标志位。,下一页,返回,上一页,任务3 8086指令
3、系统,加法指令 1)加法指令ADD 格式:ADD DST, SRC 功能:DST (DST)+(SRC)。 说明: 源/目的操作数地址如图3-19所示,其中目的操作数不能使用立即数,两存储器单元之间不能直接进行加法运算,允许段跨越;源/目的操作数位数必须相同,可以是8位或者16位。 ADD指令不区分两个加数是无符号数还是带符号数,运算结果的二进制形式相同,影响状态标志位。举例如下。,下一页,返回,上一页,图3-19加法运算源/目的操作数地址,返回,任务3 8086指令系统,ADD AL,25H ;AL寄存器指明操作是字节操作 ADD AL, BX ;AL寄存器指明操作是字节操作 ADD WOR
4、D PTR BX ,12H ;WORD PTR指明内存操作数为字操作数 又如指令ADD AX,BX,设执行前(AX) = 1234H, ( BX)=0F7C9H,则执行后(AX)=09FDH,OF=0,SF=0,ZF=0,AF=0,PF=0,CF=1。 2)带进位加法指令ADC 格式:ADC DST,SRC 功能: DST (DST)+(SRC)。 说明:进位位CF的值加到两数和的最低位,其他与ADD指令相同。,下一页,返回,上一页,任务3 8086指令系统,例3-2试编写程序,计算双字4A750000H +78912365H之和。 解:双字操作,由寄存器DX和AX组成32位累加器,先用ADD
5、指令进行低字运算,再用ADC指令进行高字运算。其程序如下。 MOV AX,OOOOH MOV DX,4A75H ADD AX ,2365 H ADC DX,7891H 3)加1指令INC 格式:INC DST 功能:DST (DST)+1。,下一页,返回,上一页,任务3 8086指令系统,说明:操作数可以是除立即数之外的其他寻址方式,可以是字节,也可以是字,不区分无符号数还是带符号数允许段跨越;影响除CF之外的其他状态标志位。 2.减法指令 1)减法指令SUB 格式:SUB DST,SRC 功能:DST (DST)-(SRC)。 说明: 源/目的操作数地址如图3-19所示,目的操作数不能使用立
6、即数,两存储器单元不能直接进行减法运算,允许段跨越;源/目的操作数位数必须相同,可以是8位,也可以是16位。,下一页,返回,上一页,任务3 8086指令系统, SUB指令不区分操作数是无符号数还是带符号数,运算结果的二进制形式相同,影响状态标志位。举例如下。 SUB AX,BX 设执行前(AX) =578FH, ( DS) = 1000H, ( BX) -2000H, ( 12000H) -7890H,则执行后(AX)=ODEFFH,OF=0,SF=1,ZF=0,AF=0,PF=1,CF=1。 2)带借位减法指令SBB 格式:SBB DST,SRC 功能:DST (DST)-(SRC)-CF。
7、 说明:被减数减去减数,再减进位位CF的值,其他与减法指令SUB相同。,下一页,返回,上一页,任务3 8086指令系统,3)减1指令DEC 格式:DEC DST 功能:DST (DST)-1。 说明:同INC指令。例如,指令DEC CX。 4)求补指令NEG 格式:NEG DST 功能:DSTO-(DST)。 说明:操作数同INC指令,影响所有状态标志位,操作数为零时CF=1,其他情况下CF=0。例如,指令NEG AX,设执行前(AX) = OFFFFH,则执行后(AX) =OOOIH,OF=O,SF=0,ZF=0,AF=1,PF=0,CF=1。,下一页,返回,上一页,任务3 8086指令系统
8、,5)比较指令CMP 格式:CMP DST, SRC 功能:(DST)-(SRC)置状态标志位。 说明:进行减法运算,不送结果,仅置状态标志位。 3.乘法指令 1)无符号数乘法指令MUL 格式:MUL SRC 功能:AX (AL) x (SRC) ;字节操作DX,AX (AX)x(SRC) ;字操作,下一页,返回,上一页,任务3 8086指令系统,说明: 源/目的操作数均为无符号数。 目的操作数必须是累加器AX或AL;源操作数可以是除立即数之外的其他寻址方式,允许段跨越。 除OF和CF之外的状态标志无定义;执行MUL指令后,若乘积的高字/高字节为0,则OF=CF=O;否则,OF=CF=1。 例
9、3-3将ADDR1和ADDR2两个字节单元的无符号数相乘,乘积存放在ADDR3字单元中。 解:使用无符号指令,程序如下。 MOV AL,ADDR1 MUL ADDR2 MOV ADDR3,AX,下一页,返回,上一页,任务3 8086指令系统,2)带符号数乘法指令IMUL 格式:IMUL SRC 功能:操作数为带符号数,其他与MUL相同。 说明: 源/目的操作数均为带符号数。 同MUL指令。 除OF和CF之外的标志无定义;执行IMUL指令后,若乘积的高字/高字节是符号扩展位时,则OF=CF=O;否则,OF=CF=1。 4.除法指令 1)无符号数除法指令DIV 格式:DIV SRC 功能:AL (
10、AX) /(SRC)的商AH 余数;AX (DX,AX)/(SRC)的商DX 余数。,下一页,返回,上一页,任务3 8086指令系统,说明: 进行字节运算时,16位的被除数存放在AX中,进行字运算时32位的被除数存放在DX,AX中;若被除数的长度不是除数的2倍,被除数高位补0;除数可以是除立即数之外的其他寻址方式,允许段跨越。 所有状态标志位无定义。 2)带符号数除法指令IDIV 格式:IDIV SRC 功能:操作数是带符号数,其他与DIV相同。 说明:被除数的长度不是除数的2倍时,被除数高位符号扩展,其他与DIV指令相同。,下一页,返回,上一页,任务3 8086指令系统,例3一4设(AX)
11、=0400H, ( BL) =OB4H,执行指令DIV BL和IDIV BL。 解:执行指令DIV BL。 由于(AX)和(BL)为无符号数,因此指令DIV BL执行后,结果如下。 (AL)=OS H AL商 (AH)=7CH AH 余数 执行指令IDIV BL。 由于(AX)和(BL)为带符号的补码数,因此指令IDIV BL执行后,结果如下。 (AL)=0 F3 H=-13D AL 商 (AH)=24H =36D AH 余数 在进行除法运算时,若商溢出,直接转入0型中断处理。 3 ) CBW符号位扩展指令,下一页,返回,上一页,任务3 8086指令系统,格式:CBW字节转换为字; CWD字转
12、换为双字。 功能:字节扩展AH(AL)的符号位;字扩展DX(AX)的符号位。 说明:源/目操作数地址隐含为AH与AL,DX与AX,不影响状态标志位。 5.十进制调整指令 BCD码数据按一般算术运算指令操作后,必须用调整指令对其进行修正,该类指令共有6条。 1)非压缩BCD码加法调整指令AAA 格式:AAA 功能:AL把AL中的和调整成非压缩BCD码格式AH (AH)+调整产生的进位值。,下一页,返回,上一页,任务3 8086指令系统,说明:两加数为非压缩BCD码,在执行指令ADD ,ADC ,INC之后结果在寄存器AL中; 影响状态标志CF和AF,其余标志位无定义。举例如下。 ADD AL,B
13、L AAA 2)压缩BCD码加法调整指令DAA 格式:DAA 功能:AL把AL中的和调整成压缩BCD码格式。 说明:两加数为压缩BCD码,在执行指令ADD ,ADC , INC之后结果在寄存器AL中;状态标志OF无定义,影响其余状态标志位。举例如下。 ADD AL,BL DAA,下一页,返回,上一页,任务3 8086指令系统,3)非压缩BCD码减法调整指令AAS 格式:AAS 功能:AL把AL中的差调整成非压缩BCD码格式;AH (AH)调整产生的借位。 说明:两操作数为非压缩BCD码,执行指令SUB,SBB,DEC之后结果在寄存器AL中;影响状态标志CF和AF,其余标志位无定义。 4)压缩B
14、CD码减法调整指令DAS 格式:DAS 功能:(AL) 把AL中的差调整成压缩BCD码格式。 说明:两操作数为压缩BCD码,执行指令SUB,SBB,DEC之后结果在寄存器AL中;状态标志OF无定义,影响其余标志位。,下一页,返回,上一页,任务3 8086指令系统,5)非压缩BCD码乘法调整指令AAM 格式:AAM 功能:AX把AL中的乘积调整成非压缩BCD码格式。 说明:两乘数为非压缩BCD码,执行指令MUL之后结果在寄存器AL中;调整后十位数在AH中,个位数在AL中;影响状态标志SF,ZF和PF,其余标志位无定义。举例如下。 MUL AL,BL AAM 6)非压缩BCD码除法调整指令AAD
15、格式:AAD 功能:AL 10 x (AHD+(AL) AH 0 说明:,下一页,返回,上一页,任务3 8086指令系统,在指令DIV之前使用,被除数是两位非压缩BCD码,存放在AX中,AH中存放十位数字,AL中存放个位数字,且高4位均为0;除数是一位非压缩的BCD码,高4位为。;调整结果在AL中,AH中清0;执行其后的DIV指令后,AL中为一位非压缩BCD码的商,AH中为一位BCD码的余数。 影响状态标志SF,ZF和PF,其余OF,CF和AF标志位无定义。 3.3.4控制转移类指令 一般情况下,程序是按指令顺序地逐条执行的,但实际上经常需要改变程序的执行流程。控制转移类指令用来改变程序执行的
16、方向,即修改IP和CS的值。,下一页,返回,上一页,任务3 8086指令系统,按转移位置可将转移指令分为段内转移和段间转移。若指令给出改变IP中内容的信息,转移的目标位置和转移指令在同一个代码段,则称为段内转移;若指令给出改变IP中内容的信息,又给出改变CS中内容的信息,转移的目标位置和转移指令不在同一个代码段,则称为段间转移。 根据转移指令的功能,可分为无条件转移指令、条件转移指令、循环控制指令、子程序调用和返回指令等。 1.无条件转移指令 无条件转移(JMP)指令中作为转移目的地址的操作数,在汇编语言格式中可直接使用符号地址。在汇编之后可得到相应的段地址及偏移量。 JMP指令控制处理机转移
17、到指定的位置去执行程序,指令中必须给出转移位置的目标地址,通常有如下5种形式。,下一页,返回,上一页,任务3 8086指令系统,(1) JMP SHORT opr表示段内直接短转移指令。 (2) JMP NEAR PTR opr表示段内直接近转移指令。 (3) JMP WORD PTR opr表示段内间接转移指令。 (4) JMP FAR PTR opr表示段间直接转移指令。 (5) JMP DWORD PTR opr表示段间间接转移指令。 opr为转移目标地址,可直接使用符号地址(标号)。 属性运算符SHORT指示汇编程序将符号地址汇编成8位偏移量,指令执行时,转移的目标地址为当前的IP值与
18、指令中给定的8位偏移量之和。 属性运算符NEAR PTR指示汇编程序将符号地址汇编成16位偏移量,指令执行时,转移的目标地址为当前的IP值与指令中给定的16位偏移量之和。,下一页,返回,上一页,任务3 8086指令系统,偏移地址紧跟在指令操作码之后,由汇编程序计算得出。 有效地址EA的值是由叩:的寻址方式来决定的。若是寄存器寻址,指令中直接给出寄存器号,寄存器中的内容送到IP中;若是存储器寻址,按存储器寻址方式计算出有效地址和物理地址,用这个物理地址去读取内存中的数据送给IP指针。 例3-5执行段内间接转移指令:JMP WORD PTR BX . 分析:若给定(IP)=0012H, ( BX)
19、 -O100H, ( DS) =2000H, (20100H) -80H, (20101H)=OOH,目标地址为存储器寻址。 有效地址计算:EA=(BX) -O100H。物理地址计算:PA = DS x lOH + EA = 20100H。所以,指令执行后(IP) -0080Ho 如果是段间直接转移,则执行操作:IPopr的偏移地址;CS opr所在段的段地址。,下一页,返回,上一页,任务3 8086指令系统,如果是段间间接转移,则执行操作:IP (EA) ;CS (EA +2) . EA的值是由opr的寻址方式来决定的,按寻址方式计算出有效地址和物理地址,用物理地址去读取内存中连续的两个字数据,其中低位字数据送给IP,高位字数据送给CS. 例3-6执行段I司I司接转移指令:JMP DWORD PTRBX+20H。 分析:若给定(CS) =3000H, ( IP) =0012H, ( BX)=O100H, ( DS) =2000H, (20120H)=A0 H,(20121 H)=00 H,(20122 H)=00 H,(20123 H)=50H。 有效地址计算:EA=(BX) +20H =0120H。物理地址计算:PA = DS x lOH + EA=20120 H。指令执行后:(IP)=00A0H, (CS)=5000H.,下一页,返回,上一页,