资源预览内容
第1页 / 共99页
第2页 / 共99页
第3页 / 共99页
第4页 / 共99页
第5页 / 共99页
第6页 / 共99页
第7页 / 共99页
第8页 / 共99页
第9页 / 共99页
第10页 / 共99页
亲,该文档总共99页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
-朱耀庭汇编语言程序设计汇编语言程序设计-朱耀庭朱耀庭 www.tup.com.cn第第7章章 算术运算指令与程序设计算术运算指令与程序设计v本本章章的的主主要要内内容容就就是是介介绍绍汇汇编编语语言言中中的的算算术术运运算算指指令令及及其程序设计。其程序设计。v希希望望同同学学们们在在掌掌握握上上述述内内容容的的同同时时关关注注算算术术运运算算指指令令对对标标志志寄寄存存器器的的影影响响,因因为为标标志志位位将将是是条条件件转转移移指指令令的的判判断依据,也是分支程序设计实现分支的依据。断依据,也是分支程序设计实现分支的依据。www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭第第6章章 数据传送与顺序程序设计数据传送与顺序程序设计7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响7.2 算术运算的数据格式算术运算的数据格式7.3二进制数加减运算二进制数加减运算7.4 无符号二进制数乘除运算无符号二进制数乘除运算7.5 带符号二进制数乘除运算带符号二进制数乘除运算7.6 非压缩非压缩BCD码运算码运算7.7 压缩型压缩型BCD码加减运算码加减运算 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响v标志寄存器和其他寄存器不一样,其他寄存器是用来存放标志寄存器和其他寄存器不一样,其他寄存器是用来存放数据的,并且整个寄存器具有一个含义,而标志寄存器是数据的,并且整个寄存器具有一个含义,而标志寄存器是按位起作用的,每一位都有专门的含义。详见按位起作用的,每一位都有专门的含义。详见 4.2.3 节中节中的的 FLAG(FLAG Register)状态标志寄存器。状态标志寄存器。v本章主要使用的标志位有:本章主要使用的标志位有:CF, PF, AF, ZF, SF, OF。v下面举例说明算术运算和逻辑运算与标志寄存器的关系。下面举例说明算术运算和逻辑运算与标志寄存器的关系。 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响v例例7-1用一个简单的加法例子编写程序计算用一个简单的加法例子编写程序计算255+1=256来来说明算术运算的结果受标志寄存器的影响。说明算术运算的结果受标志寄存器的影响。v源程序(源程序(Ex7-1.asm)如下:)如下: CODE SEGMENT ASSUME CS:CODE,SS:CODE BEGIN: MOV AL,255 MOV AH,1 ADD AL,AH MOV AH,4CH INT 21H CODE ENDS END BEGINv程序说明:程序执行过程中,程序说明:程序执行过程中,AL=0FFH,AH=1H,AL=AL+AH。 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响v图图7-1所示为加法运算结果示意图,从图所示为加法运算结果示意图,从图7-1中可以看到,中可以看到,运算结果并不是预期的运算结果并不是预期的256,AL最大可以表示最大可以表示255,超过,超过255时产生溢出,将不能正确显示。时产生溢出,将不能正确显示。AL中显示中显示0,而标志,而标志寄存器中,显示有进位标志寄存器中,显示有进位标志CY。v这一简短的例子说明,加法运算不只是把两个整数简单地这一简短的例子说明,加法运算不只是把两个整数简单地相加,结果是否正确还要看标志位。减法、乘法以及除法相加,结果是否正确还要看标志位。减法、乘法以及除法中都会存在类似的问题。这就需要程序员经常地注意标志中都会存在类似的问题。这就需要程序员经常地注意标志寄存器,以确保运算结果的正确性。寄存器,以确保运算结果的正确性。 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响图图 7-1 加法运算结果加法运算结果 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响v例例 7-2 检查输入字符的后检查输入字符的后4位是否全为位是否全为0。是是输出输出Y,非非输出输出N。v设计思路:用设计思路:用INT 21H的的1号功能调用输入字符,用号功能调用输入字符,用TEST指令测试低指令测试低4位是否为位是否为0。v源程序(源程序(Ex7-2.asm)如下:)如下: CODE SEGMENT ASSUME CS:CODE BEGIN: MOV AH,1 INT 21H TEST AL,0FH JE L MOV AH,2 MOV DL,N INT 21H JMP EXIT L: MOV AH,2 MOV DL,Y INT 21H EXIT: MOV AH,4CH INT 21H CODE ENDS END BEGINwww.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响v例例 7-2 检查输入字符的后检查输入字符的后4位是否全为位是否全为0。是是输出输出Y,非非输出输出N。v程序说明:可以使用多个数据测试上面的程序。从图程序说明:可以使用多个数据测试上面的程序。从图7-2所示的示意图所示的示意图中可以看到,中可以看到,JE跳转时跳转时ZF=1,即标志寄存器标志位,即标志寄存器标志位ZF为为NZ,而,而TEST指令的结果会改变指令的结果会改变ZF的值。的值。图图7-2 TEST指令指令 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响v下面举例说明标志寄存器如何受运算指令的影响下面举例说明标志寄存器如何受运算指令的影响 (1) ZF标志,零标志。标志,零标志。v例如:例如: MOV AX,1 SUB AX,1;执行后结果为执行后结果为0,ZF=1v例如:例如: MOV AX,2 SUB AX,1 ;执行后结果不为;执行后结果不为0,ZF=0v(2) PF标志,奇偶标志。标志,奇偶标志。v例如:例如: MOV AL,1000B ADD AL,11B;执行后,结果为执行后,结果为00001011B,其中有,其中有3个个1,奇数,则,奇数,则PF=0 SUB AL,AL;执行后,结果为执行后,结果为0,则,则0个个1,偶数,偶数,PF=1www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响v下面举例说明标志寄存器如何受运算指令的影响下面举例说明标志寄存器如何受运算指令的影响 (3) SF标记,符号标记。标记,符号标记。v例如:例如: MOV AL,10000001B ADD AL,1;执行后,结果为执行后,结果为10000010,最高位为,最高位为1,因此,因此SF=1(4) CF标志,进位标志。标志,进位标志。v例如:例如: MOV AL,98H ADD AL,AL;执行到这里,执行到这里,AL=30H,CF=1,实际结果应为,实际结果应为130H SUB AL,AL;执行到这里,执行到这里,AL=0H,CF=0,没有借位,没有借位 MOV AL,97H SUB AL,98H;做减法,要向高位借位,用做减法,要向高位借位,用CF来记录这个位,来记录这个位,CF=1www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响v下面举例说明标志寄存器如何受运算指令的影响下面举例说明标志寄存器如何受运算指令的影响 (3) SF标记,符号标记。标记,符号标记。v例如:例如: MOV AL,10000001B ADD AL,1;执行后,结果为执行后,结果为10000010,最高位为,最高位为1,因此,因此SF=1(4) CF标志,进位标志。标志,进位标志。v例如:例如: MOV AL,98H ADD AL,AL;执行到这里,执行到这里,AL=30H,CF=1,实际结果应为,实际结果应为130H SUB AL,AL;执行到这里,执行到这里,AL=0H,CF=0,没有借位,没有借位 MOV AL,97H SUB AL,98H;做减法,要向高位借位,用做减法,要向高位借位,用CF来记录这个位,来记录这个位,CF=1www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响v下面举例说明标志寄存器如何受运算指令的影响下面举例说明标志寄存器如何受运算指令的影响 v(5) OF标志标志 溢出标志。溢出标志。v对于对于8位的有符号数,机器能表示的范围是位的有符号数,机器能表示的范围是127到到127;对于对于16位有符号数,机器能表示的范围是位有符号数,机器能表示的范围是32768到到32767。v例如:例如: MOV AL,98 ADD AL,99 ;执行后,执行后,OF=1,CF=0,因为结果为,因为结果为197,未超过,未超过255, ;没有进位没有进位CF=0,但超过了,但超过了127,溢出了,溢出了,OF=1www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.1 算术运算和逻辑运算对标记寄存器的影响算术运算和逻辑运算对标记寄存器的影响v下面举例说明标志寄存器如何受运算指令的影响下面举例说明标志寄存器如何受运算指令的影响 v(6) AF标志,辅助进位标志。标志,辅助进位标志。v例如:例如: MOV AL,9 ADD AL,8;执行后,低执行后,低4位会向高位会向高4位进位,位进位,AF=1 MOV AX,127 ADD AX,1;执行后,低字节会向高字节进位,;执行后,低字节会向高字节进位,AF=1v由此可见,标志寄存器在算术运算和逻辑运算中受程序指由此可见,标志寄存器在算术运算和逻辑运算中受程序指令的影响,可以用来定性记录运算结果的特征。这一点非令的影响,可以用来定性记录运算结果的特征。这一点非常重要,它可以供后续指令进行判断和转移。常重要,它可以供后续指令进行判断和转移。v本章还会对各个指令如何影响标志寄存器的哪个标志位进本章还会对各个指令如何影响标志寄存器的哪个标志位进行详细介绍。行详细介绍。 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.2 算术运算的数据格式算术运算的数据格式v80X86提供的二进制算术运算指令包括二进制运算和十进提供的二进制算术运算指令包括二进制运算和十进制运算指令,能对二进制数制运算指令,能对二进制数(字节或字字节或字)直接进行算术运算,直接进行算术运算,并且通过专门的调整指令,可以完成十进制数并且通过专门的调整指令,可以完成十进制数(BCD码码)的的算术运算。算术运算。v它提供的加、减、乘、除它提供的加、减、乘、除4种基本的算术运算指令,只能种基本的算术运算指令,只能直接对整数进行操作,而不能直接对实数直接对整数进行操作,而不能直接对实数 (浮点数浮点数)进行运进行运算。算。v本章将详细介绍算术运算指令的格式、功能及用法,并举本章将详细介绍算术运算指令的格式、功能及用法,并举例说明多字节的无符号二进制数的加、减、乘、除运算,例说明多字节的无符号二进制数的加、减、乘、除运算,多字节压缩型多字节压缩型BCD码的加、减运算,多字节非压缩型码的加、减运算,多字节非压缩型BCD码的加、减、乘、除运算的程序设计方法。码的加、减、乘、除运算的程序设计方法。 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.2 算术运算的数据格式算术运算的数据格式 无符号二进制数无符号二进制数 1带符号二进制数带符号二进制数 2压缩型压缩型BCD码码 3非压缩型非压缩型BCD码码 4www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. 无符号二进制数无符号二进制数 v无符号二进制数可以是无符号二进制数可以是8位或位或16位位v8位无符号二进制数的范围为位无符号二进制数的范围为0255v16位无符号二进制数的范围为位无符号二进制数的范围为065535v用于无符号二进制数的加法指令有:用于无符号二进制数的加法指令有:ADD,ADC,INCv用于无符号二进制数的减法指令有:用于无符号二进制数的减法指令有:SUB,SBB,DECv用于无符号二进制数的乘法指令为用于无符号二进制数的乘法指令为MULv用于无符号二进制数的除法指令为用于无符号二进制数的除法指令为DIV www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. 带符号二进制数带符号二进制数 v带符号的二进制数带符号的二进制数(整数整数)也可以为也可以为8位或位或16位位v其最高位其最高位(最左边的一位最左边的一位)是数的符号位,该位为是数的符号位,该位为0表示正数,表示正数,为为1表示负数表示负数v负数是以二进制的补码形式给出的负数是以二进制的补码形式给出的v由于其最高位用来作符号位,所以,由于其最高位用来作符号位,所以,8位的带符号二进制位的带符号二进制数的范围为数的范围为-128+127;16位的带符号二进制数的范围为位的带符号二进制数的范围为-32768+32767v带符号的二进制数的乘法指令为带符号的二进制数的乘法指令为IMUL;除法指令为;除法指令为IDIV;而带符号的二进制数的加、减法运算与无符号二进制数的而带符号的二进制数的加、减法运算与无符号二进制数的加、减法指令一样加、减法指令一样 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭3. 压缩型压缩型BCD码码 v压缩型压缩型BCD码,也称作压缩型二进制编码的十进制数。详码,也称作压缩型二进制编码的十进制数。详见见1.3.5节二进制编码的十进制数节二进制编码的十进制数BCD码码(Binary-Coded Decimal)。v对于一个字节来说,压缩型对于一个字节来说,压缩型BCD码数的范围为码数的范围为099v压缩型压缩型BCD码的加、减分两步来实现:先用一条无符号二码的加、减分两步来实现:先用一条无符号二进制数的加、减指令对压缩型进制数的加、减指令对压缩型BCD码进行加、减,在码进行加、减,在AL中产生一个中间结果中产生一个中间结果(可能为不正确的结果可能为不正确的结果);然后再执行;然后再执行一条加、减法的压缩型一条加、减法的压缩型BCD码调整指令码调整指令v加法调整指令为加法调整指令为DAA;减法调整指令为;减法调整指令为DAS。调整指令将。调整指令将AL中的中间结果调整为最终正确的压缩型中的中间结果调整为最终正确的压缩型BCD码。压缩码。压缩型型BCD码不能进行乘、除运算码不能进行乘、除运算www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭4. 非压缩型非压缩型BCD码码v非压缩型非压缩型BCD码,也称作非压缩型二进制编码的十进制数。详见码,也称作非压缩型二进制编码的十进制数。详见1.3.5节二进制编码的十进制数节二进制编码的十进制数BCD码码(Binary-Coded Decimal)。非压缩。非压缩型型BCD码一个字节只能存放一位非压缩型码一个字节只能存放一位非压缩型BCD码,即用码,即用00H09H表表示示09。非压缩型。非压缩型BCD码十进制数的加、减、乘运算都是先用无符号码十进制数的加、减、乘运算都是先用无符号二进制数的加、减、乘运算指令在二进制数的加、减、乘运算指令在AL中产生一个中间结果,然后,再中产生一个中间结果,然后,再执行一条调整指令,以便将执行一条调整指令,以便将AL中可能错误的中间结果调整成最终正确中可能错误的中间结果调整成最终正确的非压缩型的非压缩型BCD码。其加法的调整指令为码。其加法的调整指令为AAA;减法的调整指令为;减法的调整指令为AAS;乘法的调整指令为;乘法的调整指令为AAM。而非压缩型。而非压缩型BCD码十进制数的除法码十进制数的除法运算与加、减、乘不同,除法不是先计算后校正,而是先校正后做除运算与加、减、乘不同,除法不是先计算后校正,而是先校正后做除法。除法调整指令为法。除法调整指令为AAD。非压缩型。非压缩型BCD码在进行加、减时,可以直码在进行加、减时,可以直接用接用09数字的数字的ASCII码参加运算,而不必将高码参加运算,而不必将高4位清零,这也是将非位清零,这也是将非压缩型压缩型BCD码的调整指令称为码的调整指令称为ASCII码调整指令的缘故。而乘、除运码调整指令的缘故。而乘、除运算之前则必须将算之前则必须将ASCII码高码高4位清零,即必须转换为真正的非压缩型位清零,即必须转换为真正的非压缩型BCD码后才能够进行相应运算。码后才能够进行相应运算。 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.3 二进制数加减运算二进制数加减运算二进制数加法二进制数加法 二进制数减法二进制数减法 7.3.17.3.27.3.3二进制加减运算的有效性二进制加减运算的有效性 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.3.1 二进制数加法二进制数加法ADD指令指令(字节或字相加字节或字相加) 1ADC指令指令(带进位的加法指令带进位的加法指令) 2INC指令指令(字节或字加字节或字加1) 3www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. ADD指令指令(字节或字相加字节或字相加) v格式:格式:ADD 目的操作数,源操作数目的操作数,源操作数v功能:将目的操作数加上源操作数,和送至目的操作数。功能:将目的操作数加上源操作数,和送至目的操作数。v影响状态标志:影响状态标志:AF,CF,OF,PF,SF,ZF。v目的操作数可以是寄存器和存储器;源操作数可以是寄存目的操作数可以是寄存器和存储器;源操作数可以是寄存器、存储器和立即数,但是两者不能同时是存储器。器、存储器和立即数,但是两者不能同时是存储器。vADD 寄存器寄存器1,寄存器,寄存器2v 例:例:ADD AX,BX ;(AX)+(BX)AX ADD ,BX ;同上,这里不写出目的操作数,隐含的目的操作数为同上,这里不写出目的操作数,隐含的目的操作数为AX www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. ADD指令指令(字节或字相加字节或字相加) vADD 寄存器,存储器寄存器,存储器v 例:例:ADD AX,BX+SI;(AX)+(DS:BX+SI)AXvADD 寄存器,立即数寄存器,立即数v 例:例:ADD AX,12;(;(AX)+12 AXvADD 存储器,寄存器存储器,寄存器 v 例:例:ADD BXSI,AX;(DS:BX+SI)+(AX)DS: BX+SIvADD 存储器,立即数存储器,立即数v例:例:ADD BXSI,12;(DS:BXSI)+12 (BXSI)www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. ADC指令指令(带进位的加法指令带进位的加法指令) v格式:同格式:同ADDv功能:源操作数加目的操作数再加进位标志功能:源操作数加目的操作数再加进位标志CF的和送至目的和送至目的操作数。即如果进位标志已被置位,则两个操作数相加的操作数。即如果进位标志已被置位,则两个操作数相加的结果在存入目的操作数之前再加上的结果在存入目的操作数之前再加上1,否则加上,否则加上0。v影响状态标志:影响状态标志:AF,CF,OF,DF,SF,ZF。vADD和和ADC指令既适用于无符号二进制数加法运算,也适指令既适用于无符号二进制数加法运算,也适用于带符号二进制数的加法运算。但是,它们的两个操作用于带符号二进制数的加法运算。但是,它们的两个操作数必须同时为无符号数或同时为带符号数,并且同时为字数必须同时为无符号数或同时为带符号数,并且同时为字节节(8位数位数)或同时为字或同时为字(16位数位数)。ADC指令多用于多字节加指令多用于多字节加法运算,需要分步计算时很有用。例如,有两个两字节的法运算,需要分步计算时很有用。例如,有两个两字节的数相加,数相加,AF8AH+0A90H,先进行低字节相加,然后做高,先进行低字节相加,然后做高字节相加,并且要加上进位,示意如下:字节相加,并且要加上进位,示意如下: www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. ADC指令指令(带进位的加法指令带进位的加法指令) www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭3. INC指令指令(字节或字加字节或字加1)v格式:格式:INC 目的操作数目的操作数v功能:目的操作数加功能:目的操作数加1后送至目的操作数。后送至目的操作数。INC指令的目的指令的目的操作数可为字节或字,并被当作一个无符号二进制数,这操作数可为字节或字,并被当作一个无符号二进制数,这一点不同于一点不同于ADD,ADC。该指令常用于调整地址和计数器。该指令常用于调整地址和计数器。v影响状态标志:影响状态标志:AF,OF,DF,SF,ZF。不影响进位标。不影响进位标志志CF。v目的操作数可以为通用寄存器,也可以为存储器,但不能目的操作数可以为通用寄存器,也可以为存储器,但不能是立即数。是立即数。v例如:例如: INC CX INC BL INC BYTE PTRBX ;数据段中位移量;数据段中位移量BX的字节加的字节加1 INC WORD PTRBX+SI ;数据段中位移量为;数据段中位移量为BX+SI处的字加处的字加1 INC WORD PTRBP+SI ;堆栈段中位移量为;堆栈段中位移量为BP+SI处的字加处的字加1www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭3. INC指令指令(字节或字加字节或字加1)v例例7-3 一位数加法实例一位数加法实例v题目:从键盘上输入两个一位数,相加后以十进制输出和题目:从键盘上输入两个一位数,相加后以十进制输出和v设计思路:输入的每一个数为设计思路:输入的每一个数为ASCII码,转化为对应的二码,转化为对应的二进制数,相加的和化为进制数,相加的和化为ASCII码输出码输出 例例7-3 一位数加法实例一位数加法实例 v程序说明:运行该程序程序说明:运行该程序,当,当出现输入提示符出现输入提示符“?”,可输可输入一个数字入一个数字,程序显示一个程序显示一个“+”号号,再输入一个数字再输入一个数字,程序显示程序显示“=”号和结果。例如:号和结果。例如:?8+7=15。其中带下划。其中带下划线的部分,由用户输入。程序中出现的除法运算本章线的部分,由用户输入。程序中出现的除法运算本章7.4节节会有详细介绍。会有详细介绍。 例例7-1和例和例7-3都是典型的顺序程序,或称作直接程序都是典型的顺序程序,或称作直接程序 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭3. INC指令指令(字节或字加字节或字加1) 屏幕输出?提示符输入第一个数字BL屏幕输出 +输入第二个数字DH+计算,输出结果高位计算,输出结果低位屏幕输出 =十位个位图图7-3 二进制加法流程图二进制加法流程图演示动画演示动画www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.3.2 二进制数减法二进制数减法SUB指令指令(字节或字相减字节或字相减) 1SBB指令指令(带借位的减法带借位的减法) 2DEC指令指令(字节或字减字节或字减1) 3NEG指令指令(求补求补) 4www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. SUB指令指令(字节或字相减字节或字相减) v格式:格式:SUB 目的操作数,源操作数目的操作数,源操作数 其中,目的操作数和源操作数的具体格式同其中,目的操作数和源操作数的具体格式同ADD指令。指令。v功能:目的操作数减去源操作数,结果送至目的操作数。功能:目的操作数减去源操作数,结果送至目的操作数。v影响状态标志:影响状态标志:AF,CF,OF,PF,SF和和ZF。www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. SBB指令指令(带借位的减法借位的减法) v格式:格式:SBB 目的操作数,源操作数目的操作数,源操作数v功能:目的操作数减去源操作数,其结果再减去进位标志功能:目的操作数减去源操作数,其结果再减去进位标志的内容,将最后的结果送至目的操作数的内容,将最后的结果送至目的操作数vSBB影响状态标志:影响状态标志:AF,CF,OF,PF,SF和和ZFvSUB和和SBB指令既适用于无符号二进制数减法运算,也适指令既适用于无符号二进制数减法运算,也适用于带符号二进制数的减法运算。但是,它们的两个操作用于带符号二进制数的减法运算。但是,它们的两个操作数必须同时为无符号数或同时为带符号数,并且同时为字数必须同时为无符号数或同时为带符号数,并且同时为字节或字。节或字。v在进行减法运算时在进行减法运算时(用用SUB或或SBB指令指令),若有借位就置,若有借位就置CF为为1;否则;否则CF清零。故当执行清零。故当执行SBB指令时,若指令时,若CF已置已置1(亦亦即在这以前有借位产生即在这以前有借位产生)时,则其差再减时,则其差再减1;否则,若;否则,若CF为为0(即没有借位产生即没有借位产生)时,则其差就减时,则其差就减0。 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. SBB指令指令(带借位的减法借位的减法)v减法实际上是用加法做的。即先把源操作数减法实际上是用加法做的。即先把源操作数(减数减数)变成其变成其补码,把补码,把CF也变成补码也变成补码(0的补码为的补码为0,1的补码为的补码为1111 1111(8位时位时)或或1111 1111 1111 1111(16位时位时),然后再做加法。,然后再做加法。v例如:例如:(DL)=03H,(BL)=64H,CF=1。v指令:指令:SBB BL,DL的执行结果是:的执行结果是:(BL)=60H,示意,示意如下如下 :www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭3. DEC指令指令(字节或字减字节或字减1) v格式:格式:DEC 目的操作数目的操作数 其中,目的操作数可为字节或字,并被视为无符号二进制其中,目的操作数可为字节或字,并被视为无符号二进制数。数。v功能:目的操作数减功能:目的操作数减1送至目的操作数。送至目的操作数。v影响状态标志:影响状态标志:AF, OF, PF, SF, ZF,但不影响,但不影响CF www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭4. NEG指令指令(求补求补) v格式:格式:NEG 目的操作数目的操作数v功能:功能:0减去目的操作数后送至目的操作数,使目的操作减去目的操作数后送至目的操作数,使目的操作数符号变反。例如,数符号变反。例如,+1变成变成-1,-变成变成+2。v影响状态标志:影响状态标志:AF, CF, OF, PF, SF和和ZF。但要注。但要注意:除了操作数为意:除了操作数为0以外,以外,CF总是总是1;操作数为;操作数为0时时CF置置0。 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭4. NEG指令指令(求补求补)v例例7-4 一位数减法实例。一位数减法实例。v题目:从键盘上输入两个一位数,相减后以十进制输出和。题目:从键盘上输入两个一位数,相减后以十进制输出和。v设计思路:输入的每一个数为设计思路:输入的每一个数为ASCII码,转化为对应的二码,转化为对应的二进制数,相减的差化为进制数,相减的差化为ASCII码输出码输出 例例7-4 一位数减法实例一位数减法实例 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭4. NEG指令指令(求补求补)v例例7-4 一位数减法实例。一位数减法实例。v程序说明:运行该程序,当出现输入提示符程序说明:运行该程序,当出现输入提示符“?”,可输,可输入一个数字字符,将其转化成真正的数字入一个数字字符,将其转化成真正的数字BL,显示一,显示一个个“-”号,再输入一个数字字符,将其转化成真正的数字号,再输入一个数字字符,将其转化成真正的数字BH,显示,显示“=”号后,号后,(BL)-(BH) BL,若差小于零,若差小于零,则将其求补并且输出一个则将其求补并且输出一个“-”号,将差拼成号,将差拼成ASCII码后输码后输出。若差为大于等于出。若差为大于等于0的,则直接将差拼成的,则直接将差拼成ASCII码后输码后输出即可。例如:出即可。例如: ?8-3=5 ?3-8=-5www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.3.3 二进制加减运算的有效性二进制加减运算的有效性v在在7.1节中已经看到,运算结果有时会超出范围,变得无节中已经看到,运算结果有时会超出范围,变得无效,如何判断运算的有效性就是本节要介绍的内容。加减效,如何判断运算的有效性就是本节要介绍的内容。加减指令同时会影响到标志寄存器的进位标志和溢出标志,这指令同时会影响到标志寄存器的进位标志和溢出标志,这两个标志位主要是为算术运算设计的,设计规则如下:两个标志位主要是为算术运算设计的,设计规则如下: (1) 当符号位(即最高位)有进位时,进位标志设置成当符号位(即最高位)有进位时,进位标志设置成1,否则设置成否则设置成0。 (2) 数据位向符号位有进位,但符号位不再产生进位时有数据位向符号位有进位,但符号位不再产生进位时有溢出,或者符号位产生进位但数据位不向符号位进位时也溢出,或者符号位产生进位但数据位不向符号位进位时也产生溢出。产生溢出。 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.3.3 二进制加减运算的有效性二进制加减运算的有效性v下面用实例来总结下面用实例来总结CF, OF和运算有效性之间的关联规律。和运算有效性之间的关联规律。 1.CF=0,OF=0 符号位无进位符号位无进位CF=0,数据位向符号位无进位,数据位向符号位无进位OF=0 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.3.3 二进制加减运算的有效性二进制加减运算的有效性v下面用实例来总结下面用实例来总结CF, OF和运算有效性之间的关联规律。和运算有效性之间的关联规律。 2.CF=1,OF=0 符号位有进位符号位有进位CF=1,数据位向符号位也有进位,数据位向符号位也有进位OF=0 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.3.3 二进制加减运算的有效性二进制加减运算的有效性v下面用实例来总结下面用实例来总结CF, OF和运算有效性之间的关联规律。和运算有效性之间的关联规律。 3.CF=0,OF=1 符号位无进位符号位无进位CF=0,数据位向符号位有进位,数据位向符号位有进位OF=1 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.3.3 二进制加减运算的有效性二进制加减运算的有效性v下面用实例来总结下面用实例来总结CF, OF和运算有效性之间的关联规律。和运算有效性之间的关联规律。 4.CF=1,OF=1 符号位有进位符号位有进位CF=1,并且数据位向符号位无进位,并且数据位向符号位无进位OF=1 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.3.3 二进制加减运算的有效性二进制加减运算的有效性v上述标志位与运算结果的有效性见表上述标志位与运算结果的有效性见表7-1 表表 7-1CF标志OF标志无符号数有符号数00有效有效10无效有效10有效无效11无效无效www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.4 无符号二进制数乘除运算无符号二进制数乘除运算MUL指令指令(无符号二进制数乘法无符号二进制数乘法) 1DIV指令指令(无符号字节或字除法无符号字节或字除法) 2www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. MUL指令指令(无符号二进制数乘法无符号二进制数乘法) v功能:隐含目的操作数,把源操作数和功能:隐含目的操作数,把源操作数和AL(AX)的值相)的值相乘保存到乘保存到AX(DX+AX)中)中v乘法运算和加减法运算不一样,加减运算时和或差最多比乘法运算和加减法运算不一样,加减运算时和或差最多比两个操作数多两个操作数多1位或少位或少1位位(或几位或几位)v而乘法运算结果长度可能要增加一倍。两个而乘法运算结果长度可能要增加一倍。两个8位数相乘,位数相乘,乘积可能为乘积可能为16位。如图位。如图7-4所示:所示: www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. MUL指令指令(无符号二进制数乘法无符号二进制数乘法) 图图7-4 乘法运算的长度乘法运算的长度www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. MUL指令指令(无符号二进制数乘法无符号二进制数乘法) v80868088规规定定:如如果果源源操操作作数数为为8位位无无符符号号数数,则则AL中中的的无无符符号号数数与与源源操操作作数数相相乘乘,乘乘积积送送至至AX;如如果果源源操操作作数数为为16位位无无符符号号数数,则则AX中中的的无无符符号号数数与与源源操操作作数数相相乘乘,乘乘积积的的扩扩展展部部分分(高高16位位)送送至至扩扩展展寄寄存存器器DX,低低16位送至位送至AX,如图,如图7-5所示:所示: AL 源操作数 AH AL (a)8位乘法 AX 源操作数 DX AX (b)16位乘法 图图7-5 乘法运算乘法运算www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. MUL指令指令(无符号二进制数乘法无符号二进制数乘法) v如果乘积的高一半如果乘积的高一半(即扩展部分即扩展部分)为为0,则将,则将CF清零;否则,清零;否则,CF(置置1),OF也置也置1。执行。执行MUL指令后,指令后,AF,PF,SF和和ZF的内容不定。的内容不定。v例如:例如:v计算计算36100,将积送字变量,将积送字变量WV,可用下列指令序列实现:,可用下列指令序列实现: MOV AL,36 MOV BL,100 MUL BL ;(AL)*(BL) AX MOV WV,AX ;将积将积(AX) WV www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. MUL指令指令(无符号二进制数乘法无符号二进制数乘法) v计算计算32010000,将积的高位字送字变量,将积的高位字送字变量WH,低位字送,低位字送字变量字变量WL,可用下列指令序列来实现:,可用下列指令序列来实现:MOV AX,320 MOV BX,10000 MUL BX ;(AX)*(BX) DX,AX MOV WH,DX ;积的高位字积的高位字(DX) WH MOV WL,AX ;积的低位字积的低位字(AX) WLwww.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. MUL指令指令(无符号二进制数乘法无符号二进制数乘法) v7-5 一位数乘法示例一位数乘法示例v题目:输入两个一位无符号题目:输入两个一位无符号09数字,相乘后,将积数字,相乘后,将积“二二化十化十”输出输出v设计思路:首先将输入的设计思路:首先将输入的ASCII数字字符,转化为对应二数字字符,转化为对应二进制数,然后相乘,乘积十位与个位分离,然后用进制数,然后相乘,乘积十位与个位分离,然后用ASCII码分别输出码分别输出例例7-5 一位数乘法示例一位数乘法示例 v程序说明:运行该程序时,首先输入一个程序说明:运行该程序时,首先输入一个09数字字符,程序将其转数字字符,程序将其转化成真正的二进制数值。显示化成真正的二进制数值。显示*号后再输入一个号后再输入一个09数字字符,数字字符,将其转化成真正的二进制数值,做乘法运算,显示将其转化成真正的二进制数值,做乘法运算,显示“=”号后,再显号后,再显示两位十进制数字示两位十进制数字(结果结果)。例如,。例如,7*8=56 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. DIV指令指令(无符号字节或字除法无符号字节或字除法) v格式:格式:DIV 源操作数源操作数v功能:将累加器及其扩展寄存器中的双倍长度的无符号被功能:将累加器及其扩展寄存器中的双倍长度的无符号被除数除以源操作数中的无符号除数。对于除数除以源操作数中的无符号除数。对于8位除数的除法位除数的除法运算,被除数在运算,被除数在AH和和AL中;对于中;对于16位除数的除法运算,位除数的除法运算,被除数在被除数在DX和和AX中。运算后将单倍长度的商送回累加器中。运算后将单倍长度的商送回累加器AL或或AX,将单倍长度的余数送到扩展寄存器,将单倍长度的余数送到扩展寄存器AH或或DX。其操作如图其操作如图7-6所示所示: www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. DIV指令指令(无符号字节或字除法无符号字节或字除法)图图7-6 除法运算除法运算AL 商 AH AL 8位 除数 AH 余数 被除数 AX 商 DX AX 16位 除数DX 余数 被除数 (a)8位除法 (b)16位除法www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. DIV指令指令(无符号字节或字除法无符号字节或字除法) v如果除法指令产生的结果如果除法指令产生的结果(商的值商的值)超出了保存它的目的寄超出了保存它的目的寄存器的范围,就如同被存器的范围,就如同被0除了一样,置除了一样,置OF为为1,产生溢出,产生溢出中断。中断。v 除法指令除法指令DIV规定被除数为双倍除数的长度,是为了乘除规定被除数为双倍除数的长度,是为了乘除连用时比较方便。比如:计算连用时比较方便。比如:计算764时,时,8位数位数7(00000111B)和和8位数位数6(00000110B)相乘,产生相乘,产生16位的位的乘积乘积42(即即0000 0000 0010 1010B)送至送至AH和和AL(即即AX),用用AX中的中的16位数可以直接除以位数可以直接除以8位数位数4(0000 0100B)。www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. DIV指令指令(无符号字节或字除法无符号字节或字除法) v但是,但是,8位数除以位数除以8位数时,不能简单地将被除数放在位数时,不能简单地将被除数放在AL里,就直接去除以里,就直接去除以8位除数,因为除法指令将会把位除数,因为除法指令将会把AH中无中无论什么毫无价值的内容都当成是被除数的最高有效论什么毫无价值的内容都当成是被除数的最高有效8位数。位数。所以在进行除法运算以前,必须先将所以在进行除法运算以前,必须先将AH清零。清零。v同样,同样,16位数除以位数除以16位数时,将被除数送入位数时,将被除数送入AX以后,也以后,也应注意将应注意将DX清零后才能做除法运算。清零后才能做除法运算。 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. DIV指令指令(无符号字节或字除法无符号字节或字除法) v例如,计算例如,计算135100,可用以下指令序列来实现:,可用以下指令序列来实现: MOV AX,135 ;被除数被除数135AX MOV BL,100 ;除数除数100BL DIV BL ;(AX)(BL)商商1AL,余数,余数35AHv计算计算125321000,可用下列指令序列实现:,可用下列指令序列实现: MOV AX,12532 ;被除数被除数12532AX MOV DX,0 ;0DX MOV BX,1000 ;除数除数1000BX DIV BX ;DX AX(BX)商商12AX,余数余数532DX www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. DIV指令指令(无符号字节或字除法无符号字节或字除法)v例例7-6 一位数除法实例一位数除法实例v题目:输入两个一位数,作除法,用十进制形式输出商和题目:输入两个一位数,作除法,用十进制形式输出商和余数余数v设计思路:输入的两个数先化为二进制数,然后用设计思路:输入的两个数先化为二进制数,然后用DIV作作除法。结果以除法。结果以ASCII码形式输出码形式输出 例例7-6 一位数除法实例一位数除法实例 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.5 带符号二进制数乘除运算带符号二进制数乘除运算v乘、除指令与加、减指令不一样,加、减指令既适用于无乘、除指令与加、减指令不一样,加、减指令既适用于无符号二进制数的运算,也适用于带符号二进制数的运算,符号二进制数的运算,也适用于带符号二进制数的运算,v而如果用无符号数的乘法指令而如果用无符号数的乘法指令MUL来进行带符号二进制数来进行带符号二进制数乘法运算就不会得出正确结果。乘法运算就不会得出正确结果。v必须为带符号数提供专用的乘法和除法指令。必须为带符号数提供专用的乘法和除法指令。 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.5 带符号二进制数乘除运算带符号二进制数乘除运算 带符号二进制乘法运算指令带符号二进制乘法运算指令 带符号二进制除法运算指令带符号二进制除法运算指令 7.5.17.5.2www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.5.1 带符号二进制乘法运算指令带符号二进制乘法运算指令 v乘、除指令与加、减指令不一样,加、减指令既适用于无乘、除指令与加、减指令不一样,加、减指令既适用于无符号二进制数的运算,也适用于带符号二进制数的运算,符号二进制数的运算,也适用于带符号二进制数的运算,v而如果用无符号数的乘法指令而如果用无符号数的乘法指令MUL来进行带符号二进制数来进行带符号二进制数乘法运算就不会得出正确结果。乘法运算就不会得出正确结果。v必须为带符号数提供专用的乘法和除法指令必须为带符号数提供专用的乘法和除法指令 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.5.1 带符号二进制乘法运算指令带符号二进制乘法运算指令 vIMUL指令指令(带符号位的字节或字相乘带符号位的字节或字相乘)也称作整数乘法指令,也称作整数乘法指令,此指令除了其操作数为带符号位的二进制数外,其格式、此指令除了其操作数为带符号位的二进制数外,其格式、功能完全类似于功能完全类似于MUL。v对于对于IMUL指令来说,若结果的高半部分指令来说,若结果的高半部分(8位数乘时为位数乘时为AH,16位乘时为位乘时为DX)不是结果的符号位的扩展不是结果的符号位的扩展(所谓符号位扩所谓符号位扩展,正数扩展部分全为展,正数扩展部分全为0,负数扩展部分全为,负数扩展部分全为1),则,则CF和和OF置置1;否则,;否则,CF和和OF置置0。也就是说,若。也就是说,若CF和和OF置置1,则表示,则表示AH或或DX中含有结果的有效数字,因此使用中含有结果的有效数字,因此使用IMUL指令计算带符号二进制乘法必须对结果进行有效性指令计算带符号二进制乘法必须对结果进行有效性判断。执行判断。执行IMUL指令后,指令后,AF,PF,SF和和ZF内容不定。内容不定。www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.5.1 带符号二进制乘法运算指令带符号二进制乘法运算指令v例例7-7 带符号一位数乘法实例带符号一位数乘法实例v题目:从键盘上输入两个带符号一位数,相乘后以十进制题目:从键盘上输入两个带符号一位数,相乘后以十进制输出积。输出积。v设计思路:输入的每一个数为设计思路:输入的每一个数为ASCII码,转化为对应的二码,转化为对应的二进制数,相乘的积化为进制数,相乘的积化为ASCII码输出码输出 例例7-7 带符号一位数乘法实例带符号一位数乘法实例 v程序说明:本例中并未对结果作出有效性判断是因为带符程序说明:本例中并未对结果作出有效性判断是因为带符号一位数乘法不会溢出,结果介于号一位数乘法不会溢出,结果介于-81到到81之间,处于有之间,处于有效范围(效范围(-127127)。若多位数乘法就需要对结果作出有)。若多位数乘法就需要对结果作出有效性判断,该问题作为课下练习效性判断,该问题作为课下练习 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.5.2 带符号二进制除法运算指令带符号二进制除法运算指令 IDIV指令指令(带符号的字节或字除法带符号的字节或字除法)1 CBW指令指令(把字节转化成字把字节转化成字) 2CWD指令指令(把字转化成双字把字转化成双字)3www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. IDIV指令指令(带符号的字节或字除法带符号的字节或字除法) vIDIV指令除了其操作数为带符号的二进制数不同于指令除了其操作数为带符号的二进制数不同于DIV指指令外,其格式、功能都类似于令外,其格式、功能都类似于DIV指令。带符号数的除法指令。带符号数的除法指令指令IDIV规定:余数和被除数的符号相同。这样规定就使规定:余数和被除数的符号相同。这样规定就使得商和余数是唯一的。得商和余数是唯一的。v例如:例如: -26(+)= -3(商商),余数为,余数为-5,是正确的;,是正确的; -26(+)= -4(商商),余数为,余数为+2,是错误的。,是错误的。v由于除法指令隐含使用字或双字作为被除数,所以在进行由于除法指令隐含使用字或双字作为被除数,所以在进行除法运算前需要扩展被除数,对于无符号除法,直接把扩除法运算前需要扩展被除数,对于无符号除法,直接把扩展的寄存器置零,而对于有符号除法,需要把符号位扩展,展的寄存器置零,而对于有符号除法,需要把符号位扩展,8086/8088提供了专门的符号扩展指令。提供了专门的符号扩展指令。www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. CBW指令指令(把字节转化成字把字节转化成字) vCBW指令功能:将指令功能:将AL的符号扩充到的符号扩充到AHv对于带符号数,当对于带符号数,当8位数除以位数除以8位数时,将位数时,将8位被除数送入位被除数送入AL后,应将后,应将AL的符号位扩充到的符号位扩充到AH(8位位)。比如,。比如,8位的位的-3为:为:1111 1101(在在AL中中),转换成,转换成16位为:位为:1111 1111 1111 1101(在在AX中中),AL中的符号位为中的符号位为1,扩充到,扩充到AH 8位位全全1。而。而8位的位的+3为:为:0000 0011(在在AL中中),转换成,转换成16位:位:0000 0000 0000 0011(在在AX中中)。AL中的符号位为中的符号位为0,扩,扩充到充到AH8位全位全0。将。将8位带符号数扩充成位带符号数扩充成16位数需要用指位数需要用指令令CBW。www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭 3. CWD指令指令(把字转化成双字把字转化成双字) vCWD指令功能:将指令功能:将AX的符号扩充到的符号扩充到DX。 16位数除以位数除以16位数时,应先将位数时,应先将16位的被除数位的被除数AX,转换成,转换成32位放到位放到DX和和AX中,即将中,即将AX中的符号位扩充到中的符号位扩充到DX中去,这需要用指令中去,这需要用指令CWD。v例如:例如: 带符号字节变量带符号字节变量A除以带符号字节变量除以带符号字节变量B时,需用下列指令序列实现:时,需用下列指令序列实现: MOV AL,A ;被除数被除数(A) AL CBW ;把字节把字节AL转换成字转换成字AX IDIV B ;(AX)(B)商商AL,余数,余数AH 带符号字变量带符号字变量W除以带符号字变量除以带符号字变量V时,需用下列指令实现:时,需用下列指令实现: MOV AX,W ;被除数被除数(W) AX CWD ;将将AX字转换成双字字转换成双字DX,AX IDIV V ;(DX),(AX)(V)商商AX,余数,余数DX www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭3. CWD指令指令(把字转化成双字把字转化成双字)v例例7-8 带符号一位数除法实例带符号一位数除法实例v题目:从键盘上输入两个带符号一位数,相除后以十进制题目:从键盘上输入两个带符号一位数,相除后以十进制输出商和余数输出商和余数v设计思路:输入的每一个数为设计思路:输入的每一个数为ASCII码,转化为对应的二码,转化为对应的二进制数,相除的商和余数化为进制数,相除的商和余数化为ASCII码输出码输出 例例7-8 带符号一位数除法实例带符号一位数除法实例www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.6 非压缩非压缩BCD码运算码运算 非压缩型非压缩型BCD码加法运算码加法运算 非压缩型非压缩型BCD码减法运算码减法运算 7.6.17.6.27.6.4非压缩型非压缩型BCD码除法运算码除法运算 7.6.3非压缩型非压缩型BCD码乘法运算码乘法运算 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.6.1 非压缩型非压缩型BCD码加法运算码加法运算非压缩型非压缩型BCD码码(ASCII码码)的加法调整指令的加法调整指令AAA 1多字节非压缩型多字节非压缩型BCD码码(ASCII码码)加法运算加法运算 2www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. 非压缩型非压缩型BCD码码(ASCII码码)的加法调整指令的加法调整指令AAA v格式:格式:AAA(无操作数无操作数)v功能:把功能:把ASCII码调整为非压缩型十进制数(码调整为非压缩型十进制数(BCD码)。码)。 v逻辑式为:逻辑式为: (AL)+6AL,AL&0FHAL 若若(AL)&0FH)9或或(AF)=1则则 (AH)+1AH CF=1 AF=1v否则,否则,(AL)&0FHALv其中,其中,(AL)&0FHAL的功能是为了将高的功能是为了将高4位清零,因为位清零,因为直接用直接用ASCII码作运算,高码作运算,高4位有与位有与BCD码无关的数码无关的数3。符。符号号“&”表示逻辑乘运算。表示逻辑乘运算。vAAA指令除影响指令除影响AF和和CF标志外,其余标志位均未定义标志外,其余标志位均未定义 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. 多字节非压缩型多字节非压缩型BCD码码(ASCII码码)加法运算加法运算 v例如,计算:例如,计算:v用用ASCII码作这个加法,数据定义为:码作这个加法,数据定义为: A DB 1,5,8 B DB 3,6,9 C DB 4 DUP(?) www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. 多字节非压缩型多字节非压缩型BCD码码(ASCII码码)加法运算加法运算 v若相加的结果放在若相加的结果放在C,则具体计算步骤如图,则具体计算步骤如图7-7所示所示: 图图7-7 多字节加法计算步骤多字节加法计算步骤v以上将第一步结果以上将第一步结果4送至送至C(个位数字字节个位数字字节)v第二步的结果第二步的结果1送至送至C(十位数字字节十位数字字节)v第三步的结果第三步的结果8送至送至C(百位数字字节百位数字字节)v将第三步后的进位将第三步后的进位1送至送至C(千位数字字节千位数字字节)v最终结果在最终结果在C4,C3,C2,C1各字节的低各字节的低4位上位上 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. 多字节非压缩型多字节非压缩型BCD码码(ASCII码码)加法运算加法运算v例例7-9 多字节非压缩型多字节非压缩型BCD码加法实例码加法实例v题目:计算题目:计算4321+6597,并将结果显示输出,并将结果显示输出v设计思路:用非压缩型设计思路:用非压缩型BCD码加进行,计算步骤如图码加进行,计算步骤如图7-7所示所示 例例7-9 多字节非压缩型多字节非压缩型BCD码加法实例码加法实例 v程序说明:程序说明: 第一步相加最低位时,利用循环前的第一步相加最低位时,利用循环前的MOV AH,0H和和SAHF将将CF置零。置零。相加结果产生的进位由相加结果产生的进位由LAHF保存在保存在AH中。中。 第二、三、四步时,第二、三、四步时,SAHF为从为从AH取上次进位,取上次进位,LAHF保存在本次进保存在本次进位到位到AH。 循环后,循环后,AND AH,01H为从为从AH中取最后的进位。中取最后的进位。www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. 多字节非压缩型多字节非压缩型BCD码码(ASCII码码)加法运算加法运算v例例7-10 用改进的方法重写例用改进的方法重写例7.9程序程序v设计思路:与例设计思路:与例7-9的区别是输出结果的的区别是输出结果的ASCII数字字符在数字字符在最后统一转换并输出最后统一转换并输出 例例7-10 用改进的方法重写例用改进的方法重写例7.9程序程序v程序说明:本例中程序说明:本例中STRING1和和STRING2均定义为均定义为5个字节,个字节,且最后一个字节初值为且最后一个字节初值为0。将相加运算用五步实现,这样。将相加运算用五步实现,这样第第4位的进位就不必如例位的进位就不必如例7-9那样单独处理那样单独处理 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.6.2 非压缩型非压缩型BCD码减法运算码减法运算v非压缩型非压缩型BCD码减法调整指令如下:码减法调整指令如下:vAAS指令指令(减法的减法的ASCII调整调整)v格式:格式:AAS(无操作数)(无操作数)v功能:此指令适用于非压缩型功能:此指令适用于非压缩型BCD码的减法运算。其格式同码的减法运算。其格式同AAA指指令。令。v逻辑式为:逻辑式为: (AL)-6HAL(AL)&0FHAL若若(AL)&(0FH)9或或(AF)=1则则 (AH)-1HAH 1AF1AFv否则,否则,(AL)&0FHALv与加法运算类似,多字节非压缩型与加法运算类似,多字节非压缩型BCD码的减法运算是在带借位减法码的减法运算是在带借位减法指令指令SBB后加上一条调整指令后加上一条调整指令AAS来实现的。来实现的。AAS指令除影响指令除影响AF和和CF标志外,其余标志位均未定义标志外,其余标志位均未定义 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.6.3 非压缩型非压缩型BCD码乘法运算码乘法运算非压缩型非压缩型BCD码码(ASCII码码)乘法调整指令乘法调整指令AAM 1多字节非压缩型多字节非压缩型BCD码的乘法码的乘法 2www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. 非压缩型非压缩型BCD码码(ASCII码码)乘法调整指令乘法调整指令AAMv格式:格式:AAM(无操作数)(无操作数)v功能:对两个非压缩型功能:对两个非压缩型BCD码相乘的结果码相乘的结果(在在AX中中)进行进行修正,以便得到正确的十进制修正,以便得到正确的十进制(BCD码码)积。它的用法是在积。它的用法是在普通的无符号二进制乘法普通的无符号二进制乘法(8位位)MUL指令后面写上一条指令后面写上一条AAM指令。指令。v非压缩型非压缩型BCD码的乘法和加减法不同,加减法可以直接用码的乘法和加减法不同,加减法可以直接用ASCII码参加运算,而不管它的高位上与数字无关的数,码参加运算,而不管它的高位上与数字无关的数,只要在只要在ADC(或或SBB)指令后用一条调整指令指令后用一条调整指令AAA(或或AAS)就能得到正确结果。而乘法运算要求参加运算的两个乘数就能得到正确结果。而乘法运算要求参加运算的两个乘数必须是真正的非压缩型必须是真正的非压缩型BCD码,即高码,即高4位为位为0,低,低4位为一位为一个十进制数字。也就是说,如果用个十进制数字。也就是说,如果用ASCII码作为非压缩型码作为非压缩型BCD码作乘法运算的话,在乘法运算之前,必须将高码作乘法运算的话,在乘法运算之前,必须将高4位位清零。清零。www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. 非压缩型非压缩型BCD码码(ASCII码码)乘法调整指令乘法调整指令AAMv下面举例说明下面举例说明AAM指令是如何实现调整的。例如用下列指令是如何实现调整的。例如用下列指令序列实现指令序列实现69=54: MOV AL,06H MOV BL,09H MUL BL AAMv执行指令执行指令MUL BL结果应为:结果应为: 00000110B*00001001B=0000000000110110B(结果在结果在AX中中)。vAAM指令的功能是把指令的功能是把AX中的二进制结果中的二进制结果(十进制应为十进制应为54)分解成分解成AH中的中的5(00000101B)和和AL中的中的4(00000100B)。www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭1. 非压缩型非压缩型BCD码码(ASCII码码)乘法调整指令乘法调整指令AAMvAAM指令的具体操作是把指令的具体操作是把AL的内容除以的内容除以10,将商送到,将商送到AH,余数送到,余数送到AL。8位数乘位数乘8位数,其乘积应为位数,其乘积应为16位数,位数,在在AX中。为什么中。为什么AAM指令只将指令只将AL中的数除以中的数除以10呢呢?这是这是因为因为1位十进制数乘位十进制数乘1位十进制数,其乘积的最大值位十进制数,其乘积的最大值9*9=81=01010001B只有只有7位有效数字,乘积的高位有效数字,乘积的高8位位(AH中中)必为必为0。v总之,总之,AAM指令的功能是将指令的功能是将AL中二进制乘积分解为两位中二进制乘积分解为两位十进制数字十进制数字(BCD码码),十位数的,十位数的BCD码送至码送至AH,个位数,个位数的的BCD码送至码送至AL。其具体操作为将。其具体操作为将AL的内容除以的内容除以0AH,商送至商送至AH,余数送至,余数送至AL。vAAM指令用下面的方法设置标志位:指令用下面的方法设置标志位:CF,OF,AF不定;不定;PF取决于取决于AL寄存器的内容;寄存器的内容;SF取决于取决于AL寄存器的高位,寄存器的高位,ZF取决于取决于AL寄存器的内容。寄存器的内容。www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. 多字节非压缩型多字节非压缩型BCD码的乘法码的乘法 v上面对一位非压缩型上面对一位非压缩型BCD码和另一位非压缩型码和另一位非压缩型BCD码如码如何进行乘法运算进行了介绍。现在将进一步介绍多位何进行乘法运算进行了介绍。现在将进一步介绍多位BCD码与一位码与一位BCD码如何实现其乘法。比如,码如何实现其乘法。比如,5396,通,通常的算法为:常的算法为:9乘乘6得得54,写下,写下4同时将同时将5进位;进位;3乘乘6得得18,加进位的,加进位的5得得23,写下,写下3的同时将的同时将2进位;进位;5乘乘6得得30,加,加进位的进位的2得得32,写下这个数。写成竖式为:,写下这个数。写成竖式为: www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. 多字节非压缩型多字节非压缩型BCD码的乘法码的乘法 v 假设假设539是以非压缩型是以非压缩型BCD码的形式,分别存入变量码的形式,分别存入变量a,a2和和a1中,数中,数6是以非压缩型是以非压缩型BCD码的形式,存放在变量码的形式,存放在变量b中。又假设中。又假设a3,a2,a1和和b中的数高中的数高4位均已清位均已清0,并将,并将a3,a2,a1乘以乘以b所得的乘积存放到所得的乘积存放到c4,c3,c2,c1变变量中。即:量中。即: www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭2. 多字节非压缩型多字节非压缩型BCD码的乘法码的乘法v例例7-11 多字节非压缩型多字节非压缩型BCD码乘法实例码乘法实例 v题目:用非压缩型题目:用非压缩型BCD码计算:码计算:945736v设计思路:用本小节设计思路:用本小节7.6.3中中2的方法进行运算的方法进行运算 例例7-11 多字节非压缩型多字节非压缩型BCD码乘法实例码乘法实例www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭v十进制数除法调整指令十进制数除法调整指令AADv格式:格式:vAADv功能:将功能:将AX中的两位非压缩型中的两位非压缩型BCD码转换成真正的二进码转换成真正的二进制数,其操作为:制数,其操作为: (AH)*0AH+(AL) AL,且,且0AHv下面来介绍如何进行被除数为两位,除数为一位的非压缩下面来介绍如何进行被除数为两位,除数为一位的非压缩型型BCD码的除法运算。码的除法运算。7.6.4 非压缩型非压缩型BCD码除法运算码除法运算www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭v比比如如,计计算算43除除以以6,假假设设43是是在在AX中中(00000100B在在AH中中,00000011B在在AL中中),而而6(00000110B)是是在在BL中中。除除数数6是是一一位位数数,它它的的非非压压缩缩型型BCD码码(高高4位位为为0)正正好好与与其其二二进进制制表表示示形形式式相相同同,因因此此,不不需需要要调调整整。而而AX中中的的43(00000100 00000011)和和 二二 进进 制制 的的 43(00000000 00101011)根根本本不不是是一一回回事事。所所以以需需要要将将被被除除数数43转转换换成成二二进进制制表表示示形形式式。要要完完成成这这一一点点,只只需需将将AH的的内内容容乘乘以以10,再再与与AL的的内内容容相相加加,在在AL中中便便得得到到二二进进制制的的43(00101011),再再将将AH清清零零,这这正正是是AAD指指令令的的功功能能。这这样样,AX中中便便是是真真正正的的二二进进制制的的43了了。然然后后,用用AX(43)除除以以BL(6)就就会会在在AL中中得得到到二二进进制制表表示示的的商商7,在在AH中中得得到二进制表示的余数到二进制表示的余数1。7.6.4 非压缩型非压缩型BCD码除法运算码除法运算www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭v例如,计算例如,计算436的程序序列为:的程序序列为: MOV AX, 0403H AAD MOV BL, 06H DIV BL7.6.4 非压缩型非压缩型BCD码除法运算码除法运算www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.6.4 非压缩型非压缩型BCD码除法运算码除法运算v例例7-12 多字节非压缩型多字节非压缩型BCD码除法实例码除法实例v题目:用非压缩型题目:用非压缩型BCD码计算码计算5978648v设计思路:用非压缩型设计思路:用非压缩型BCD码,从高位到低位依次除以除码,从高位到低位依次除以除数,每次循环得到的余数数,每次循环得到的余数(AH)作为下一次除法的高位。最作为下一次除法的高位。最后将商从高位到低位输出,并输出余数后将商从高位到低位输出,并输出余数 例例7-12 多字节非压缩型多字节非压缩型BCD码除法实例码除法实例v程序说明:本例从高位开始除,每次除得的余数在程序说明:本例从高位开始除,每次除得的余数在AH中,中,作为下一次除法的高字节,而低字节通过作为下一次除法的高字节,而低字节通过MOV AL,SI得得到到 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.7 压缩型压缩型BCD码加减运算码加减运算v8088微处理器只提供了压缩型微处理器只提供了压缩型BCD码的加减运算调整指令码的加减运算调整指令v而没有提供乘除运算调整指令而没有提供乘除运算调整指令v因此,对于压缩型因此,对于压缩型BCD码来说,只能进行加减运算,不能码来说,只能进行加减运算,不能直接进行乘除运算直接进行乘除运算 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.7 压缩型压缩型BCD码加减运算码加减运算压缩型压缩型BCD码加法运算码加法运算 压缩型压缩型BCD码减法运算码减法运算 7.7.17.7.2www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.7.1 压缩型压缩型BCD码加法运算码加法运算 v压缩型压缩型BCD码做加法运算时,调整指令应做什么呢?请看码做加法运算时,调整指令应做什么呢?请看下面的例子:下面的例子:(1) 34+23=57的操作示意如下:的操作示意如下: v结果正确,这时调整指令不需要做什么结果正确,这时调整指令不需要做什么 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.7.1 压缩型压缩型BCD码加法运算码加法运算 v压缩型压缩型BCD码做加法运算时,调整指令应做什么呢?请看码做加法运算时,调整指令应做什么呢?请看下面的例子:下面的例子:(2) 48+29=77的操作示意如下的操作示意如下 : v结果不正确,因为用结果不正确,因为用ADC指令进行加法运算时,低指令进行加法运算时,低4位向位向高高4位有一个进位,这个进位是按十六进制进行的,即低位有一个进位,这个进位是按十六进制进行的,即低4位逢十六才进一,而十进制数加法应是逢十进一位逢十六才进一,而十进制数加法应是逢十进一 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.7.1 压缩型压缩型BCD码加法运算码加法运算 (2) 48+29=77的操作示意如下的操作示意如下 : 因此,比正确结果少因此,比正确结果少6,进行调整时,应在低,进行调整时,应在低4位上加上位上加上6。即:即: v加法运算后,低加法运算后,低4位向高位向高4位有进位时位有进位时(即即AF=1时时),调整指,调整指令应做加令应做加06H www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.7.1 压缩型压缩型BCD码加法运算码加法运算 (3) 57+46=103 v加法运算后,低加法运算后,低4位位9时,调整指令需做加时,调整指令需做加06H;高;高4位位9时,调整指令需做加时,调整指令需做加60H www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.7.1 压缩型压缩型BCD码加法运算码加法运算 (3) 57+46=103 v加法运算后,低加法运算后,低4位位9时,调整指令需做加时,调整指令需做加06H;高;高4位位9时,调整指令需做加时,调整指令需做加60H www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.7.1 压缩型压缩型BCD码加法运算码加法运算 (4) 72+91=163 v加法运算后,当加法运算后,当CF=1(有进位产生有进位产生)时,调整指令应做加时,调整指令应做加60H www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭v1.DAA指令指令(压缩型型BCD码的加法的加法调整整)v格式:格式:DAA(无操作数无操作数)v功能:把功能:把AL中的值调整成压缩型中的值调整成压缩型BCD码。码。 v逻辑式为逻辑式为: (AL)+06HAL若若(AL)&0FH)9或或(AF)=1则则 (AF)=1 (AL)+60HAL若若(AL)9FH或或(CF)=1则则 (CF)=1v此指令影响状态标志:此指令影响状态标志:AF,CF,PF,SF,ZF;但不影;但不影响响OF 7.7.1 压缩型压缩型BCD码加法运算码加法运算www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.7.1 压缩型压缩型BCD码加法运算码加法运算v例例7-13 多字多字节压缩型型BCD码加法加法实例例v题目:目:计算:算:72574834+91462923v设计思路:将思路:将这两个十两个十进制数以制数以压缩型型BCD码的形式存的形式存储,并且低位,并且低位放在低地址字放在低地址字节里,一个字里,一个字节存放两位存放两位BCD码。将第一个加数存放在。将第一个加数存放在以以变量名量名A为起始地址的存起始地址的存储区里,将第二个加数存放在区里,将第二个加数存放在变量名量名B为起始地址的存起始地址的存储区里。在数据段定区里。在数据段定义数据如下:数据如下: A DB 34H,48H,57H,72H,00H B DB 23H,29H,46H,91H,00Hv计算算过程从低位字程从低位字节开始开始对应字字节相加,先用一条相加,先用一条ADC指令,再用指令,再用DAA指令指令进行行调整。由于用的是整。由于用的是ADC指令,故必指令,故必须事先将事先将CF清零才清零才能保能保证第一个字第一个字节相加的和是正确的。假相加的和是正确的。假设将相加的将相加的结果存放在果存放在A原原来的位置,由于来的位置,由于结果可能比原来的加数多果可能比原来的加数多1位,故多分配一个字位,故多分配一个字节,初初值为0 例例7-13 多字节压缩型多字节压缩型BCD码加法实例码加法实例 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭7.7.1 压缩型压缩型BCD码加法运算码加法运算v例例7-13 多字多字节压缩型型BCD码加法加法实例例v题目:目:计算:算:72574834+91462923v程序说明:此程序将结果存放在第一个加数原来的位置,程序说明:此程序将结果存放在第一个加数原来的位置,结果没有显示输出。结果没有显示输出。BCD码的显示输出需要用到逻辑指令码的显示输出需要用到逻辑指令,这将在第,这将在第8章专门介绍章专门介绍 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭v1.DAS指令指令(减法的十减法的十进制制调整整)v格式:格式:DAS(无操作数)(无操作数)v功能:此指令适用于功能:此指令适用于压缩型型BCD码的减法运算。其格式同的减法运算。其格式同AAA指令。指令。v逻辑式式为: (AL)6HAL若若(AL)&0FH)9或或(AF)=1则 1AF (AL)60HAL若若(AL)9FH 或或(CF)=1 则 1CFv与多字与多字节压缩型型BCD码加法运算加法运算类似,多字似,多字节压缩型型BCD码减法运减法运算是在算是在带借位减借位减SBB指令后加上一条指令后加上一条调整指令整指令DAS来来实现的的 7.7.2 压缩型压缩型BCD码减法运算码减法运算 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭v综上所述,十进制数的算术运算中值得注意的是:综上所述,十进制数的算术运算中值得注意的是: 除法调整指令用于除法指令之前,而加、减、乘的调整指令是放在相除法调整指令用于除法指令之前,而加、减、乘的调整指令是放在相应运算指令之后。也就是说,加、减、乘调整是纠正错误的结果使之应运算指令之后。也就是说,加、减、乘调整是纠正错误的结果使之成为正确的结果,而除法调整则是要避免产生错误的结果。成为正确的结果,而除法调整则是要避免产生错误的结果。 乘、除只有非压缩型乘、除只有非压缩型BCD码运算指令,而没有压缩型码运算指令,而没有压缩型BCD码运算指令。码运算指令。要求被乘数和乘数、被除数和除数在参加运算之前必须将高要求被乘数和乘数、被除数和除数在参加运算之前必须将高4位清零,位清零,使之成为真正的使之成为真正的BCD码。而加、减法并不要求将高码。而加、减法并不要求将高4位清零,也就是位清零,也就是说,非压缩型说,非压缩型BCD码的加、减运算可以直接用码的加、减运算可以直接用ASCII码参加运算,调码参加运算,调整指令能将错误的结果修正成正确的。整指令能将错误的结果修正成正确的。 多位数的被乘数可以乘一位数,而且很容易将乘法运算推广到多位数多位数的被乘数可以乘一位数,而且很容易将乘法运算推广到多位数乘多位数。多位数的被除数也可以用一位数去除。但是,除法却不能乘多位数。多位数的被除数也可以用一位数去除。但是,除法却不能推广到多位数除以多位数推广到多位数除以多位数 7.7.2 压缩型压缩型BCD码减法运算码减法运算 www.tup.com.cn南开大学南开大学 朱耀庭朱耀庭-朱耀庭南开大学南开大学 朱耀庭朱耀庭
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号