《微型计算机原理及应用:第3章8086指令系统》由会员分享,可在线阅读,更多相关《微型计算机原理及应用:第3章8086指令系统(56页珍藏版)》请在金锄头文库上搜索。
1、11第第3章章8086指令系统指令系统221概述概述Intel8086指令系统共有指令系统共有117条基本指令,按照指令功能,条基本指令,按照指令功能,可分位可分位6类指令:类指令:数据传送类指令。数据传送类指令。算术运算指令算术运算指令。逻辑移位指令。逻辑移位指令。串操作指令。串操作指令。控制转移指令。控制转移指令。处理机控制类指令。处理机控制类指令。3.4通用指令通用指令33l8086的算术运算指令包括二进制运算指令(加法、减法、的算术运算指令包括二进制运算指令(加法、减法、乘法和除法指令)和乘法和除法指令)和BCD码十进制调整指令。码十进制调整指令。l算术运算指令用来执行算术运算,它们中
2、有的是双操作算术运算指令用来执行算术运算,它们中有的是双操作数指令,有的是单操作数指令。数指令,有的是单操作数指令。l双操作数指令是两个操作数中,除了源操作数为立即数双操作数指令是两个操作数中,除了源操作数为立即数的情况外,必需有个操作数在寄存器中。单操作数指令不的情况外,必需有个操作数在寄存器中。单操作数指令不允许使用立即数方式。允许使用立即数方式。l算术指令分为加法指令,减法指令,乘法指令,除法指算术指令分为加法指令,减法指令,乘法指令,除法指令和十进制调整指令。令和十进制调整指令。3.4.2算术运算指令算术运算指令4标志寄存器图示溢出标志位溢出标志位OF用于反映有符号数加减运用于反映有符
3、号数加减运算所得结果是否溢出。如果运算结果超算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称过当前运算位数所能表示的范围,则称为溢出,为溢出,OF的值被置为的值被置为1,否则,否则,OF的值被清为的值被清为0 方向标志方向标志DF位用来决定在位用来决定在“数据串操作数据串操作”指令执行时的步进方向;指令执行时的步进方向;DF=1表示表示由高字节向低字节方向进行由高字节向低字节方向进行称为递称为递减方式减方式 中断允许标志中断允许标志IF位用来决定位用来决定CPU是否响是否响应应CPU外部的可屏蔽中断发出的中外部的可屏蔽中断发出的中断请求。但不管该标志为何值,断请求。但不管该
4、标志为何值,CPU都必须响应都必须响应CPU外部的不可屏外部的不可屏蔽中断请求,以及蔽中断请求,以及CPU内部产生的内部产生的中断请求;中断请求;IF=1表示开中断表示开中断 状态控制标志状态控制标志TF位用来位用来控制控制CPU是正常是正常(TF=0)执行,还是单步执行,还是单步(TF=1)执行执行符号标志符号标志SF用来反映运算用来反映运算结果的符号位,它与运结果的符号位,它与运算结果的最高位相同。算结果的最高位相同。对于有符号数就反映运对于有符号数就反映运算结果的正负号。运算算结果的正负号。运算结果为正数时,结果为正数时,SF的值的值为为0 零标志零标志ZF用来反映运算用来反映运算结果是
5、否为结果是否为0。如果运。如果运算结果为算结果为0,则其值为,则其值为1 在运算过程中,如果发生低在运算过程中,如果发生低4位向高位向高4位的进位或借位位的进位或借位时,辅助进位标志时,辅助进位标志AF的的值将被置为值将被置为1奇偶标志奇偶标志PF用于标志运算用于标志运算结果的低结果的低8位中位中“1”的的个数的奇偶性。如果个数的奇偶性。如果“1”的个数为偶数,则的个数为偶数,则PF的值为的值为1 。只判断。只判断。只判断。只判断ALAL进位标志进位标志CF主要用来反映运主要用来反映运算是否产生进位或借位。算是否产生进位或借位。如果运算结果的最高位产如果运算结果的最高位产生了一个进位或借位,此
6、生了一个进位或借位,此时其值为时其值为1 553.4.2算术运算指令算术运算指令算术运算指令涉及两种类型数据,即无符号数和有符号数算术运算指令涉及两种类型数据,即无符号数和有符号数对加法指令和减法指令对加法指令和减法指令而言,而言,无符号无符号和和有符号数有符号数可采用同可采用同一套指令,其先决条件有两个:一套指令,其先决条件有两个:一是参加的操作数一是参加的操作数必须同为无符号数或同为有符号数必须同为无符号数或同为有符号数二是要采用二是要采用不同标志位不同标志位来检查无符号数和有符号数的来检查无符号数和有符号数的运算结果是否溢出运算结果是否溢出而而乘除运算指令乘除运算指令则需要区分无符号数和
7、有符号数则需要区分无符号数和有符号数66两个两个8位数相加时的位数相加时的4种情况种情况无符号数和有符号数均不溢出无符号数和有符号数均不溢出二进制相加二进制相加 无符号数加无符号数加有符号数加有符号数加 0000 1000 8 +8+0001 1110 +30 +(+30) 0010 0110 38 +38 结果结果+38 CF=0 OF=0运算结果对无符号数还是对有符号数,其真值都是正确的运算结果对无符号数还是对有符号数,其真值都是正确的77无符号数溢出,有符号数无溢出无符号数溢出,有符号数无溢出000010008+8+11111101+253+(-3)100000101261+5结果结果5
8、CF=1 OF=0有符号数溢出,无符号数无溢出有符号数溢出,无符号数无溢出000010008+8+01111101+125+(+125)10000101133+133结果结果-123CF=0OF=1对有符号数,对有符号数,其运算结果的其运算结果的真值是正确的;真值是正确的;对无符号数进对无符号数进行加行加CF修正后修正后也是正确的也是正确的对有符号数有对有符号数有溢出,其运算溢出,其运算结果是错误的;结果是错误的;对无符号数其对无符号数其运算结果的真运算结果的真值是正确的值是正确的88无符号数和有符号数均溢出无符号数和有符号数均溢出10001000136-120+11110111+247+(-
9、9)101111111383-129结果结果127CF=1OF=1对有符号数有对有符号数有溢出,其运算溢出,其运算结果是错误;结果是错误;对无符号数进对无符号数进行加行加CF修正后修正后是正确的是正确的上面四种情况清楚地说明,上面四种情况清楚地说明,CF标志可用来表示标志可用来表示无符号数无符号数的溢出的溢出,OF标志可用来标志可用来表示有符号数的溢出;除此之外,表示有符号数的溢出;除此之外,两种运算可以使用一套方法两种运算可以使用一套方法无符号数的溢出可以通过无符号数的溢出可以通过CF位进行修正位进行修正有符号数的溢出是错误,在运算过程中应避免有符号数的溢出是错误,在运算过程中应避免99l加
10、法指令包括:加法指令包括:ADD(add)加法)加法ADC(addwithcarry)带进位加法)带进位加法INC(increment)加)加1l指令格式及操作如下:指令格式及操作如下:ADD加法指令加法指令指令格式:指令格式:ADDDST,SRC执行的操作:(执行的操作:(DST)(SRC)+(DST)目的操作数:目的操作数:8/16/32位的寄存器位的寄存器/存储器存储器源操作数:与目的操作数同类型的寄存器源操作数:与目的操作数同类型的寄存器/存储器存储器/立即数立即数指令功能:将源操作数与目的操作数相加,结果存放于目指令功能:将源操作数与目的操作数相加,结果存放于目的操作数。要求源操作数
11、和目的操作数同时为带符号的数的操作数。要求源操作数和目的操作数同时为带符号的数或无符号数,且长度相等。或无符号数,且长度相等。1.加法指令加法指令1010下面的指令无法确定操作数的类型,汇编时将报告错误:下面的指令无法确定操作数的类型,汇编时将报告错误: ADDSI, 5 ;两个操作数都没有明确类型;两个操作数都没有明确类型如果目的操作数是如果目的操作数是DS:SI指向的指向的字节字节存储单元存储单元,可以修改如下:可以修改如下: ADDBYTE PTR SI, 5;PTR-数据类型属性运算符,将存储器中的数据指定类数据类型属性运算符,将存储器中的数据指定类;型,本例中将数据指定为字节数据;型
12、,本例中将数据指定为字节数据说明说明:加加法法指指令令执执行行后后,状状态态标标志志CF, OF, ZF, SF, PF, AF按按照照运运算算结结 果被刷新;果被刷新;操操作作数数可可以以是是8位位/16位位/32位位,源源操操作作数数与与目目的的操操作作数数应应该该有有相相 同的类型,不能同时为内存操作数。同的类型,不能同时为内存操作数。1111ADC带进位加法指令带进位加法指令指令格式:指令格式:ADCDST,SRC执行的操作:执行的操作:(DST)(SRC)+(DST)+CF目的操作数目的操作数:8/16/32位的寄存器位的寄存器/存储器存储器源操作数源操作数:与目的操作数同类型的寄存
13、器:与目的操作数同类型的寄存器/存储器存储器/立即数立即数指令功能:将源操作数与目的操作数以及进位标志位指令功能:将源操作数与目的操作数以及进位标志位CF的的值相加,并将结果存放于目的操作数。值相加,并将结果存放于目的操作数。(1)加法指令)加法指令1212主要用于由于数据较大(多字节),需要多次运算的加法主要用于由于数据较大(多字节),需要多次运算的加法运算中。运算中。例例: :有两个有两个4 4字节的无符号数相加字节的无符号数相加: 2D568F8CH+3C9E489BH=2D568F8CH+3C9E489BH=? 设设 被加数被加数存放在存放在BUF1BUF1开始的存储区内开始的存储区内
14、 加数存放在加数存放在BUF2BUF2开始的存储区内开始的存储区内 要求要求和和放回放回BUF1BUF1存储区存储区假设假设CPUCPU进行进行8 8位的加法运算位的加法运算,为此将进行,为此将进行4 4次加法运算次加法运算ADC指令的使用价值指令的使用价值13131414程序段:程序段: MOV CX,4 ;置循环次数;置循环次数 MOV SI,0 ;置;置SI初值为零初值为零 CLC ;清进位标志;清进位标志CFAGAIN:MOV AL,BUF2 SI ADC BUF1SI,AL INC SI DEC CX JNZ AGAIN INT 20H1515INC加加1指令指令指令格式:指令格式:
15、INCOPR执行的操作:执行的操作:(OPR)(OPR)+1指令功能:将指定操作数内容加指令功能:将指定操作数内容加1。注意:这三条指令运算结果将影响状态标志位,但是注意:这三条指令运算结果将影响状态标志位,但是INC指指令不影响标志令不影响标志CF。【例例】INCAL;AL的内容加的内容加1后,送回后,送回ALINCCX;CX的内容加的内容加1后,送回后,送回CXINCBYTEPTRBX+4;PTR-数据类型属性运算符,将存储器中的数据指定类数据类型属性运算符,将存储器中的数据指定类;型,本例中将数据指定为字节数据;型,本例中将数据指定为字节数据1.加法指令加法指令1616【例例】ADDAX
16、,0CFA8H若执行指令前,(若执行指令前,(AX)=5623H,则执行指令后,则执行指令后,(AX)=25CBH,且,且CF=1,OF=0,SF=0,ZF=0,AF=0,PF=1。【例例】若执行指令前,(若执行指令前,(AX)=5A3BH,(,(DX)=809EH,(,(BX)=0BA7FH,(,(CX)=09ADH,分析执行下列指令,分析执行下列指令的结果。的结果。ADDAX,BXADCDX,CX执行第一条指令后,(执行第一条指令后,(AX)=14BAH,CF=1,OF=0,SF=0,ZF=0,AF=1,PF=0;执行第二条指令后,(执行第二条指令后,(DX)=8A4CH,CF=0,OF=
17、0,SF=1,ZF=0,AF=1,PF=1。1717例例X=33445566778899AAH, Y=123456789ABCDEF0H, 计算计算Z=X+Y(对应的数据段已经定义,变量对应的数据段已经定义,变量X,Y,Z用用DQ定义定义)MOV EAX, DWORD PTR X;取;取X的低的低32位,送入位,送入EAXADDEAX, DWORD PTR Y;X,Y的低的低32位相加位相加 ;(;(EAX)=778899AAH+9ABCDEF0H=1245789AH, CF=1MOV DWORD PTR Z, EAX;低;低32位的和送位的和送Z的低的低32位位MOV EAX, DWORD
18、PTR X+4;取;取X的高的高32位,送入位,送入EAXADCEAX, DWORD PTR Y+4 ;X, Y的高的高32位及低位进位相加位及低位进位相加 ;(;(EAX)=33445566H+12345678H+CF=4578ABDFH, CF=0MOV DWORD PTR Z+4, EAX;高;高32位的和送位的和送Z的高的高32位位1818 例例 A,B,C均为均为8位无符号数,求它们的和,送入位无符号数,求它们的和,送入SUM 三个三个8b无符号数的和可能超过无符号数的和可能超过255,将它们的和保留为,将它们的和保留为16b。MOV AL, A;取第一个数;取第一个数MOV AH,
19、 0;高;高8位清零,第一个数位清零,第一个数“零扩展零扩展”为为16位位MOV DL, B;取第二个数;取第二个数MOV DH, 0;把第二个数;把第二个数“零扩展零扩展”为为16位位ADDAX, DX;加第二个数;加第二个数MOV DL, C;取第三个数,高;取第三个数,高8位已经为位已经为0ADDAX, DX;加第三个数;加第三个数MOV SUM, AX;保存三个数的和;保存三个数的和1919这个问题的另一种方法:这个问题的另一种方法:MOV AL, A;取第一个数;取第一个数MOV AH, 0;高;高8位清零,准备存放和的高位清零,准备存放和的高8位位ADDAL, B;加第二个数;加第
20、二个数ADCAH, 0;如果有进位,存入;如果有进位,存入AHADDAL, C;加第三个数;加第三个数ADCAH, 0;如果有进位,加入;如果有进位,加入AHMOV SUM, AX;保存三个数的和;保存三个数的和2020这个问题的第三种方法:这个问题的第三种方法:.386MOVZXAX, A;取第一个数;取第一个数,扩展,扩展0传送传送MOVZXBX, B;取第二个数;取第二个数ADDAX, BX;加第二个数;加第二个数MOVZXBX, C;取第三个数;取第三个数ADDAX, BX;加第三个数;加第三个数 MOVSUM, AX;保存三个数的和;保存三个数的和2121例例 P,Q,R均为均为8位
21、有符号数,求它们的和,送入位有符号数,求它们的和,送入TOTAL 将三个将三个8b有符号数的和保留为有符号数的和保留为16b。MOV AL, P;取第一个数;取第一个数CBW;扩展为;扩展为16位位MOV DX, AX;第一个数转存入;第一个数转存入DXMOV AL, Q;取第二个数;取第二个数CBW;扩展为;扩展为16位位ADDDX, AX;加第二个数;加第二个数MOV AL, R;取第三个数;取第三个数CBW;扩展为;扩展为16位位ADDDX, AX;加第三个数;加第三个数MOV TOTAL, DX ;保存三个数的和;保存三个数的和2222本题另一种方法本题另一种方法.386 MOVSX
22、AX, P;取第一个数;取第一个数 MOVSX BX, Q;取第二个数;取第二个数 ADDAX, BX;P,Q相加相加 MOVSX BX, R;取第三个数,;取第三个数,扩展符号传送扩展符号传送 ADDAX, BX;与第三个数相加;与第三个数相加 MOVTOTAL, AX ;保存三个数的和;保存三个数的和23238086/8088共有共有7条减法指令,只介绍条减法指令,只介绍5条条减法指令包括:减法指令包括:SUB(subtract)减法)减法SBB(subtractwithborrow)带借位减法、)带借位减法、DEC(decrement)减)减1NEG(negate)求补)求补CMP(co
23、mpare)比较。)比较。指令格式及操作如下:指令格式及操作如下:2.减法指令减法指令2424SUB减法指令减法指令指令格式为:指令格式为:SUBDST,SRC执行的操作:(执行的操作:(DST)(SRC)-(DST)指令功能:将目的操作数减去源操作数,结果存放于目的指令功能:将目的操作数减去源操作数,结果存放于目的操作数。操作数。目的操作数目的操作数:8/16/32位的寄存器位的寄存器/存储器存储器源操作数源操作数:与目的操作数同类型的寄存器:与目的操作数同类型的寄存器/存储器存储器/立即数立即数对标志位的影响、对操作数的要求与对标志位的影响、对操作数的要求与ADD指令相同。指令相同。【例例
24、】SUBAX,BX若执行指令前,(若执行指令前,(AX)=9543H,(,(BX)=28A7H则执行指令后,(则执行指令后,(AX)=6C9CH,(,(BX)=28A7H,CF=0,OF=1,SF=0,ZF=0,AF=1,PF=1。2.减法指令减法指令2525SBB带借位减法指令带借位减法指令指令格式为:指令格式为:SBBDST,SRC执行的操作:(执行的操作:(DST)(SRC)-(DST)-CF指令功能:将目的操作数减去源操作数,再减去借位指令功能:将目的操作数减去源操作数,再减去借位CF的值,结果存放于目的操作数。的值,结果存放于目的操作数。目的操作数目的操作数:8/16/32位的寄存器
25、位的寄存器/存储器存储器源操作数源操作数:与目的操作数同类型的寄存器:与目的操作数同类型的寄存器/存储器存储器/立即数立即数说明说明:该指令对标志位的影响、对操作数的要求与该指令对标志位的影响、对操作数的要求与ADD指令相指令相同;同;主要用于对一个数据分段相减时高位的减法运算主要用于对一个数据分段相减时高位的减法运算2626【例例】现有两个双精度数现有两个双精度数00127546H和和00109428H,其中,其中被减数被减数00127546H存放在存放在DX,AX寄存器,寄存器,DX中存放高位中存放高位字;减数字;减数00109428H存放在存放在CX,BX寄存器,寄存器,CX中存放高中存
26、放高位字。执行双精度减法指令为:位字。执行双精度减法指令为:SUBAX,BXSBBDX,CX则第一条执行指令后,(则第一条执行指令后,(AX)=E11EH,(,(BX)=9428H,CF=1,OF=1,SF=1,ZF=0,AF=1,PF=1(正数减去(正数减去负数,和为负数,产生溢出,在多精度运算中,不是最后负数,和为负数,产生溢出,在多精度运算中,不是最后结果);第二条执行指令后,(结果);第二条执行指令后,(DX)=0001H,(CX)=0010H,CF=0,OF=0,SF=0,ZF=0,AF=0,PF=0(正数减去正数,和为正数,不产生溢出,在多精度(正数减去正数,和为正数,不产生溢出,
27、在多精度运算中,这是最后结果)。运算中,这是最后结果)。2727DEC减减1指令指令指令格式为:指令格式为:DECOPR执行的操作:(执行的操作:(OPR)(OPR)-1指令功能:对指定操作数减指令功能:对指定操作数减1。DEC指令不影响进位标志。指令不影响进位标志。目的操作数目的操作数:8/16/32位的寄存器位的寄存器/存储器存储器【例例】DECCX;CX的内容减的内容减1后,送回后,送回CXDECDWORDPTRDI;DS:DIDS:DI1,32位运算位运算说明说明:减量指令执行后,减量指令执行后,CPU的状态标志的状态标志OF,ZF,SF,PF,AF按照按照运算结果被刷新,但是运算结果
28、被刷新,但是CF标志不受影响;标志不受影响;减量指令常常用来修改计数器和存储器指针的值;减量指令常常用来修改计数器和存储器指针的值;2828NEG求补指令求补指令指令格式为:指令格式为:NEGOPR执行的操作:(执行的操作:(OPR)0-(OPR)指令功能:对指定操作数求补运算指令功能:对指定操作数求补运算(由于有符号数均使用补由于有符号数均使用补码表示,所以该指令的操作等效于:码表示,所以该指令的操作等效于:目的操作数目的操作数目的操作数目的操作数求补求补)。亦亦即即把把操操作作数数按按位位求求反反后后末末位位加加1,因因而而执执行行的的操操作作也也可表示为:(可表示为:(OPR)0FFFF
29、H-(OPR)+1。目的操作数目的操作数:8/16/32位的寄存器位的寄存器/存储器存储器【例例】NEGDX若执行指令前(若执行指令前(DX)=9A80H,则执行指令后,则执行指令后(DX)=6580H,CF=1,OF=0,SF=0,ZF=0,AF=0,PF=0。2929CMP比较指令比较指令指令格式为:指令格式为:CMPOPR1,OPR2执行的操作:(执行的操作:(OPR1)-(OPR2)指令功能:将目的操作数减去源操作数,结果不予保存。只指令功能:将目的操作数减去源操作数,结果不予保存。只是根据结果的状态设置状态标志位,设置状态标志位与是根据结果的状态设置状态标志位,设置状态标志位与SUB
30、指令含义相同。指令含义相同。【例例】CMPAL,0;AL和和0比较比较JGEnext;若;若AL=0则转到则转到next位置执行位置执行3030若两个所比较的数若两个所比较的数相等相等,则则ZF=1,否则否则ZF=0;这样就可以:这样就可以:根据根据ZF就可判断两个数是否相等就可判断两个数是否相等根据标志位判断操作数的比较结果根据标志位判断操作数的比较结果3131两数不相等两数不相等若两个数若两个数不相等不相等,分两种情况考虑分两种情况考虑:比较的是两个比较的是两个无符号数无符号数若若CF=0,则被减数大则被减数大,因大数减小数无须借位因大数减小数无须借位若若CF=1,则被减数小则被减数小32
31、32比较的是两个比较的是两个有符号数有符号数若若两两个个数数都都是是正正数数或或负负数数时时,相相减减不不溢溢出出(即即OF=0),可可用用SF来判断来判断,若若SF=0,表示表示被减数大被减数大,SF=1则则被减数小被减数小若若比比较较的的数数中中有有一一个个为为正正,另另一一个个为为负负,此此时时有有可可能能出出现现溢出,不能单看溢出,不能单看SF状态状态,还需考虑还需考虑OF的状态的状态,判别条件:判别条件:OF=0时时,若若SF=0被减数大被减数大;若;若SF=1减数大减数大OF=1时时,若若SF=1被减数大被减数大;若;若SF=0减数大减数大 3333故对有符号数进行比较时,也可归纳
32、为:故对有符号数进行比较时,也可归纳为:OFSF=0时(或时(或SF=OF),),被减数大被减数大OFSF=1时(或时(或SFOF),),减数大减数大3434比较的是两个有符号数例比较的是两个有符号数例比较比较54与与24的大小的大小解:解:54-24=54+(-24)-24补补=11101000,54补补=0011011000110110+11101000100011110OF=0,SF=0,则被减数,则被减数减数,即减数,即5424例:比较例:比较120与与-74的大小的大小 解:解:120-(-74)=124+74 01111000 01001010 011000010 OF=1,SF=
33、1,则被减数,则被减数减数,即减数,即120 -743535比较的是两个有符号数例比较的是两个有符号数例比较比较24与与54的大小的大小解:解:24-54=24+(-54)0001100024的补码的补码+11001010-54的补码的补码11100010OF=0,SF=1,则被减数,则被减数减数,即减数,即2454例:比较例:比较-24与与120的大小的大小 解:解:-24-120=-24补补+ -120补补 11101000 -24补补 + 10001000 -120补补 101110000 OF=1,SF=0,则被减数,则被减数减数,即减数,即-24 BL,则交换则交换BBB:CMPAL
34、,CL ;AL和和CL比较比较JNGCCC;若;若ALCL,则转则转XCHGAL,CL;若;若ALCL,则交换则交换CCC:INT20H;返回;返回DOS38383. 3. 十进制数运算十进制数运算1 . 1 . 压缩压缩BCDBCD数运算数运算2 . 2 . 非压缩非压缩BCDBCD数运算数运算BCD码是一种用二进制编码的十进制数,又称为二十进制数。8086/8088中BCD码分为两种形式:一种是用四位二进制数表示一位十进制数,称为压缩的BCD码;另一种是用八位二进制数表示一位十进制数,称为非压缩的BCD码,它的低四位是BCD码,高四位没有意义。由于由于BCD码是四位二进制编码,四位二进制数
35、共有码是四位二进制编码,四位二进制数共有16个编码,个编码,BCD码只用其中的码只用其中的10个,其余没用的编个,其余没用的编码称为无效码。码称为无效码。BCD码运算结果进入或跳过无效码区时,都会出现错误。为了得到正确结果,必须进行调为了得到正确结果,必须进行调整。整。8086/8088针对压缩针对压缩BCD码和非压缩码和非压缩BCD码,分码,分别设有两组十进制调整指令,其调整方法略有不同。别设有两组十进制调整指令,其调整方法略有不同。3939 每一个每一个4位组中,如果本组数字相加的和不超过位组中,如果本组数字相加的和不超过9,结果正确。,结果正确。 如果本组的和有进位(超过如果本组的和有进
36、位(超过15),或者虽然没有进位,但是),或者虽然没有进位,但是 出现了非法的组合(本组和小于出现了非法的组合(本组和小于16,大于,大于9),得到的结果是),得到的结果是 错误的。错误的。用二进制加法指令将两个压缩用二进制加法指令将两个压缩BCD数相加:数相加:1 . 1 . 压缩压缩BCDBCD数运算数运算4040对相加后的结果作调整:对相加后的结果作调整:在在80X86微处理器上,上述调整由微处理器上,上述调整由“十进制调整指令十进制调整指令”实现。实现。 如果如果4位组的和有进位位组的和有进位, 或者出现了非法组合或者出现了非法组合, 将本组数字加将本组数字加6调整调整4141格式格式
37、:DAA功能功能:对:对AL中的加法结果进行中的加法结果进行BCD运算调整运算调整例例:89+57MOV AL, 89H ;BCD数数89装入装入AL,使用,使用16进制数格式进制数格式ADDAL, 57H ;按照二进制格式相加;按照二进制格式相加,(AL)= 0E0H,AF=1DAA ;进行;进行BCD加法调整,(加法调整,(AL)= 46H,CF=1说明说明:调整之前先进行二进制加法,和必须在调整之前先进行二进制加法,和必须在AL中。中。(1)DAA(Decimal Adjust after Addition)十进制加法调整)十进制加法调整4242if (AL低低4位位9 或或 AF=1)
38、thenAL=AL+06H ;AF=1 ;endifif (AL高高4位位9 或或 CF=1)thenAL=AL+60H ;CF=1 ;endifDAA调整算法:调整算法:4343格式格式:DAS功能功能:对:对AL中的减法结果进行中的减法结果进行BCD运算调整运算调整例例:8357MOV AL, 83H ;BCD数数83装入装入AL,使用,使用16进制数格式进制数格式SUBAL, 57H ;按照二进制格式相减;按照二进制格式相减,(AL)=2CH, AF=1DAS ;进行;进行BCD减法调整减法调整,(AL)=26H, CF=0说明说明:调整之前先进行二进制减法,差在:调整之前先进行二进制减
39、法,差在AL中。中。 (2)DAS(Decimal Adjust after Subtraction)十进制减法调整)十进制减法调整4444if (AL低低4位位9 或或 AF=1)then AL=AL06H ;AF=1 ;endifif (AL高高4位位9 或或 CF=1)thenAL=AL60H ;CF=1 ; endifDAS调整算法:调整算法:4545两个数的加法要分两个数的加法要分4次进行。次进行。 最低最低2位数的加法(位数的加法(78+66)用)用ADD指令相加,指令相加,DAA指令调整。指令调整。 其余三次加法用其余三次加法用ADC指令相加,指令相加,DAA指令调整。指令调整。
40、上面的上面的4次运算可以用循环实现。运算前通过指令次运算可以用循环实现。运算前通过指令“ADD AL, 0”把把CF清零,清零,4次加法统一使用次加法统一使用ADC指令实现。指令实现。DATASEGMENTADD12345678HBDD33445566HXDD?DATAENDS例例 用用BCD数进行运算:数进行运算:12345678+334455664646DD(definedoubleword)DD伪指令用来定义双字,对其后的每个数据分配伪指令用来定义双字,对其后的每个数据分配4个个字节(字节(2个字)。该伪指令同样将数据转换为十六进制,个字)。该伪指令同样将数据转换为十六进制,并根据低地址
41、存储低字节,高地址存储高字节的规则来存并根据低地址存储低字节,高地址存储高字节的规则来存放数据。如下例放数据。如下例DATA15的存储情况是:的存储情况是:00A8:0F2H,00A9H:57H,00AAH:2AH,00ABH:5CH。用用DD存入地址时,第一个字为偏移地址,第二个字存入地址时,第一个字为偏移地址,第二个字为段地址。为段地址。DQ(definequadword)DQ伪指令用来定义伪指令用来定义4字,即字,即64位字长的数据,位字长的数据,DQ之之后的每个数据占用后的每个数据占用8个字节(个字节(4个字)。个字)。4747ORG00A0H;指定起始地址指定起始地址DATA13DD
42、1023;十进制数十进制数DATA14DD10001001011001011100B;二进制数二进制数DATA15DD5C2A57F2H;十六进制数十六进制数DATA16DD23H,34789H,65533;各种数据各种数据4848CODESEGMENTASSUME DS: DATA, CS: CODESTART:MOVAX, DATAMOVDS, AXMOVDI, 0;设置指针初值;设置指针初值MOVCX, 4;循环次数;循环次数ADDAL, 0;CF清零清零NEXT:MOV AL, BYTE PTR ADI;取出;取出A的两位的两位BCD数数ADCAL, BYTE PTR BDI;与;与B
43、的对应两位进行加法的对应两位进行加法DAA;BCD数加法调整数加法调整MOVBYTE PTR XDI,AL;保存结果;保存结果INC DI;修改指针;修改指针LOOP NEXT;计数和循环控制;计数和循环控制MOVAX, 4C00HINT21HCODEENDSENDSTART 4949 程序运行后,(程序运行后,(X)=45791244H,结果正确。,结果正确。 如果把如果把“INC DI”指令改为指令改为“ADD DI, 1”,运行后,运行后 (X)= 45781144H,结果错误。,结果错误。 用用TD单步执行程序,发现单步执行程序,发现78H+66H和和56H+55H均产生了进位均产生了
44、进位 (CF=1),执行),执行“ADD DI, 1”指令后,指令后,CF均被清零,低位的均被清零,低位的 进位没有传递到高位,导致了错误的发生。进位没有传递到高位,导致了错误的发生。 “INC DI”指令不影响指令不影响CF,程序能够正常运行,这一点在设计,程序能够正常运行,这一点在设计指令系统时已经作了充分的考虑。指令系统时已经作了充分的考虑。 从本例可以看到,使用从本例可以看到,使用CF传递进位时,要细心地选择所使用传递进位时,要细心地选择所使用 的指令。汇编语言程序员,应该十分注意标志位的状态。的指令。汇编语言程序员,应该十分注意标志位的状态。 5050(1) AAA(ASCII Ad
45、just after Addition)非压缩十进制加法调整)非压缩十进制加法调整格式格式:AAA功能功能:对:对AL中的加法结果进行非压缩中的加法结果进行非压缩BCD数运算调整数运算调整例例:9+8 MOV AL, 9 ;非压缩;非压缩BCD数数9装入装入AL,使用,使用ASCII格式格式 ADD AL, 8 ;按照二进制格式相加,(;按照二进制格式相加,(AL)= 71H,AF = 1 AAA ;非压缩;非压缩BCD加法调整,(加法调整,(AL)= 07H,CF = 1说明说明:调整之前先进行二进制加法,和必须在:调整之前先进行二进制加法,和必须在AL中中;低低4位的进位用两种方式同时表达
46、:位的进位用两种方式同时表达:CF=1,AH=AH+1。2 . 2 . 非压缩非压缩BCDBCD数运算数运算5151if (AL低低4位位9 或或 AF=1)thenAL=AL+06H ;AH=AH+1;AF=1 ;CF=1;else AF=0 ;CF=0 ;endifAL=AL AND 0FH;AL高高4位清零位清零AAA调整算法:调整算法:5252格式格式:AAS功能功能:对:对AL中的减法结果进行非压缩中的减法结果进行非压缩BCD数运算调整数运算调整例例:168 MOV AL, 6 ;非压缩;非压缩BCD数数6装入装入AL,使用,使用ASCII格式格式 SUB AL, 8 ;按照二进制格
47、式相减,;按照二进制格式相减,(AL) = 0FEH,AF=1 AAS ;进行非压缩;进行非压缩BCD加法调整,加法调整,(AL) = 08H,CF=1说明说明:调整之前先进行二进制减法,差在:调整之前先进行二进制减法,差在AL中。中。低低4位的借位用两种方式同时表达:位的借位用两种方式同时表达:CF=1,AH=AH1。(2) AAS(ASCII Adjust after Subtraction)非压缩十进制减法调整非压缩十进制减法调整5353例例:168MOVAX,0106H;AX非压缩非压缩BCD数数16MOVBL,08H;BL非压缩非压缩BCD数数8SUBAL,BL;AL(AL)-(BL
48、)AAS;BCD码减法调整,码减法调整,AL=85454if (AL低低4位位9 或或 AF=1)thenAL=AL06H ;AH=AH1;AF=1 ;CF=1;else AF=0 ;CF=0 ;endifAL=AL AND 0FH;AL高高4位清零位清零AAS调整算法:调整算法:5555格式格式:AAM功能功能:对:对AX中的乘法结果进行非压缩中的乘法结果进行非压缩BCD数运算调整数运算调整调整算法调整算法:AH=AX/10, AL=AX mod 10例例:67 MOV AL, 6 ;非压缩;非压缩BCD数数6装入装入AL,高,高4位必须为位必须为0 MOV BL, 7 ;非压缩;非压缩BC
49、D数数7装入装入BL,高,高4位必须为位必须为0 MUL BL;按照二进制格式相乘,(;按照二进制格式相乘,(AX)= 002AH AAM;非压缩;非压缩BCD乘法调整,乘法调整,(AH) = 04H,(AL) = 02H说明说明:先进行二进制无符号乘法:先进行二进制无符号乘法, 积在积在AX中中(积积81,因此因此AH=0) 然后用然后用AAM指令调整。指令调整。(3)AAM(ASCII Adjust after Multiplication)非压缩十进制乘法调整非压缩十进制乘法调整5656格式格式:AAD功能功能:将:将AH和和AL中的两位中的两位BCD数调整为等值的数调整为等值的16位二
50、进制数位二进制数调整算法调整算法:AX=AH10+ AL例例: 587 MOV AX, 0508H ;非压缩;非压缩BCD数数58装入装入AX,高,高4位必须为位必须为0 AAD ;把非压缩;把非压缩BCD数数58调整为二进制数调整为二进制数,(AX)= 003AH MOV BL, 7 DIV BL ;按照二进制格式相除;按照二进制格式相除; (AL) = 08H(商商), (AH) = 02H(余数)(余数)说明说明:先进行非压缩:先进行非压缩BCD数调整,然后用二进制无符号数除法指数调整,然后用二进制无符号数除法指 令相除,商在令相除,商在AL中,余数在中,余数在AH中。中。(4)AAD(ASCII Adjust before Division)非压缩十进制除法调整)非压缩十进制除法调整