欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    《汇编语言程序设计》第七章:算术运算指令与程序设计.ppt

    • 资源ID:6527962       资源大小:1.05MB        全文页数:99页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《汇编语言程序设计》第七章:算术运算指令与程序设计.ppt

    汇编语言程序设计-朱耀庭,南开大学 朱耀庭,第7章 算术运算指令与程序设计,本章的主要内容就是介绍汇编语言中的算术运算指令及其程序设计。希望同学们在掌握上述内容的同时关注算术运算指令对标志寄存器的影响,因为标志位将是条件转移指令的判断依据,也是分支程序设计实现分支的依据。,南开大学 朱耀庭,第6章 数据传送与顺序程序设计,7.1 算术运算和逻辑运算对标记寄存器的影响,7.2 算术运算的数据格式,7.3二进制数加减运算,7.4 无符号二进制数乘除运算,7.5 带符号二进制数乘除运算,7.6 非压缩BCD码运算,7.7 压缩型BCD码加减运算,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存器的影响,标志寄存器和其他寄存器不一样,其他寄存器是用来存放数据的,并且整个寄存器具有一个含义,而标志寄存器是按位起作用的,每一位都有专门的含义。详见 4.2.3 节中的 FLAG(FLAG Register)状态标志寄存器。本章主要使用的标志位有:CF,PF,AF,ZF,SF,OF。下面举例说明算术运算和逻辑运算与标志寄存器的关系。,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存器的影响,例7-1用一个简单的加法例子编写程序计算255+1=256来说明算术运算的结果受标志寄存器的影响。源程序(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 BEGIN程序说明:程序执行过程中,AL=0FFH,AH=1H,AL=AL+AH。,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存器的影响,图7-1所示为加法运算结果示意图,从图7-1中可以看到,运算结果并不是预期的256,AL最大可以表示255,超过255时产生溢出,将不能正确显示。AL中显示0,而标志寄存器中,显示有进位标志CY。这一简短的例子说明,加法运算不只是把两个整数简单地相加,结果是否正确还要看标志位。减法、乘法以及除法中都会存在类似的问题。这就需要程序员经常地注意标志寄存器,以确保运算结果的正确性。,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存器的影响,图 7-1 加法运算结果,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存器的影响,例 7-2 检查输入字符的后4位是否全为0。是输出Y,非输出N。设计思路:用INT 21H的1号功能调用输入字符,用TEST指令测试低4位是否为0。源程序(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 BEGIN,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存器的影响,例 7-2 检查输入字符的后4位是否全为0。是输出Y,非输出N。程序说明:可以使用多个数据测试上面的程序。从图7-2所示的示意图中可以看到,JE跳转时ZF=1,即标志寄存器标志位ZF为NZ,而TEST指令的结果会改变ZF的值。,图7-2 TEST指令,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存器的影响,下面举例说明标志寄存器如何受运算指令的影响(1)ZF标志,零标志。例如:MOV AX,1 SUB AX,1;执行后结果为0,ZF=1例如:MOV AX,2 SUB AX,1;执行后结果不为0,ZF=0(2)PF标志,奇偶标志。例如:MOV AL,1000B ADD AL,11B;执行后,结果为00001011B,其中有3个1,奇数,则PF=0 SUB AL,AL;执行后,结果为0,则0个1,偶数,PF=1,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存器的影响,下面举例说明标志寄存器如何受运算指令的影响(3)SF标记,符号标记。例如:MOV AL,10000001B ADD AL,1;执行后,结果为10000010,最高位为1,因此SF=1(4)CF标志,进位标志。例如: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=1,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存器的影响,下面举例说明标志寄存器如何受运算指令的影响(3)SF标记,符号标记。例如:MOV AL,10000001B ADD AL,1;执行后,结果为10000010,最高位为1,因此SF=1(4)CF标志,进位标志。例如: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=1,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存器的影响,下面举例说明标志寄存器如何受运算指令的影响(5)OF标志 溢出标志。对于8位的有符号数,机器能表示的范围是127到127;对于16位有符号数,机器能表示的范围是32768到32767。例如:MOV AL,98 ADD AL,99;执行后,OF=1,CF=0,因为结果为197,未超过255,;没有进位CF=0,但超过了127,溢出了,OF=1,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存器的影响,下面举例说明标志寄存器如何受运算指令的影响(6)AF标志,辅助进位标志。例如:MOV AL,9 ADD AL,8;执行后,低4位会向高4位进位,AF=1 MOV AX,127 ADD AX,1;执行后,低字节会向高字节进位,AF=1由此可见,标志寄存器在算术运算和逻辑运算中受程序指令的影响,可以用来定性记录运算结果的特征。这一点非常重要,它可以供后续指令进行判断和转移。本章还会对各个指令如何影响标志寄存器的哪个标志位进行详细介绍。,南开大学 朱耀庭,7.2 算术运算的数据格式,80X86提供的二进制算术运算指令包括二进制运算和十进制运算指令,能对二进制数(字节或字)直接进行算术运算,并且通过专门的调整指令,可以完成十进制数(BCD码)的算术运算。它提供的加、减、乘、除4种基本的算术运算指令,只能直接对整数进行操作,而不能直接对实数(浮点数)进行运算。本章将详细介绍算术运算指令的格式、功能及用法,并举例说明多字节的无符号二进制数的加、减、乘、除运算,多字节压缩型BCD码的加、减运算,多字节非压缩型BCD码的加、减、乘、除运算的程序设计方法。,南开大学 朱耀庭,7.2 算术运算的数据格式,南开大学 朱耀庭,1.无符号二进制数,无符号二进制数可以是8位或16位8位无符号二进制数的范围为025516位无符号二进制数的范围为065535用于无符号二进制数的加法指令有:ADD,ADC,INC用于无符号二进制数的减法指令有:SUB,SBB,DEC用于无符号二进制数的乘法指令为MUL用于无符号二进制数的除法指令为DIV,南开大学 朱耀庭,2.带符号二进制数,带符号的二进制数(整数)也可以为8位或16位其最高位(最左边的一位)是数的符号位,该位为0表示正数,为1表示负数负数是以二进制的补码形式给出的由于其最高位用来作符号位,所以,8位的带符号二进制数的范围为-128+127;16位的带符号二进制数的范围为-32768+32767带符号的二进制数的乘法指令为IMUL;除法指令为IDIV;而带符号的二进制数的加、减法运算与无符号二进制数的加、减法指令一样,南开大学 朱耀庭,3.压缩型BCD码,压缩型BCD码,也称作压缩型二进制编码的十进制数。详见节二进制编码的十进制数BCD码(Binary-Coded Decimal)。对于一个字节来说,压缩型BCD码数的范围为099压缩型BCD码的加、减分两步来实现:先用一条无符号二进制数的加、减指令对压缩型BCD码进行加、减,在AL中产生一个中间结果(可能为不正确的结果);然后再执行一条加、减法的压缩型BCD码调整指令加法调整指令为DAA;减法调整指令为DAS。调整指令将AL中的中间结果调整为最终正确的压缩型BCD码。压缩型BCD码不能进行乘、除运算,南开大学 朱耀庭,4.非压缩型BCD码,非压缩型BCD码,也称作非压缩型二进制编码的十进制数。详见节二进制编码的十进制数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码后才能够进行相应运算。,南开大学 朱耀庭,7.3 二进制数加减运算,二进制数加法,二进制数减法,7.3.1,二进制加减运算的有效性,南开大学 朱耀庭,7.3.1 二进制数加法,南开大学 朱耀庭,1.ADD指令(字节或字相加),格式:ADD 目的操作数,源操作数功能:将目的操作数加上源操作数,和送至目的操作数。影响状态标志:AF,CF,OF,PF,SF,ZF。目的操作数可以是寄存器和存储器;源操作数可以是寄存器、存储器和立即数,但是两者不能同时是存储器。ADD 寄存器1,寄存器2 例:ADD AX,BX;(AX)+(BX)AX ADD,BX;同上,这里不写出目的操作数,隐含的目的操作数为AX,南开大学 朱耀庭,1.ADD指令(字节或字相加),ADD 寄存器,存储器 例:ADD AX,BX+SI;(AX)+(DS:BX+SI)AXADD 寄存器,立即数 例:ADD AX,12;(AX)+12 AXADD 存储器,寄存器 例:ADD BXSI,AX;(DS:BX+SI)+(AX)DS:BX+SIADD 存储器,立即数例:ADD BXSI,12;(DS:BXSI)+12(BXSI),南开大学 朱耀庭,2.ADC指令(带进位的加法指令),格式:同ADD功能:源操作数加目的操作数再加进位标志CF的和送至目的操作数。即如果进位标志已被置位,则两个操作数相加的结果在存入目的操作数之前再加上1,否则加上0。影响状态标志:AF,CF,OF,DF,SF,ZF。ADD和ADC指令既适用于无符号二进制数加法运算,也适用于带符号二进制数的加法运算。但是,它们的两个操作数必须同时为无符号数或同时为带符号数,并且同时为字节(8位数)或同时为字(16位数)。ADC指令多用于多字节加法运算,需要分步计算时很有用。例如,有两个两字节的数相加,AF8AH+0A90H,先进行低字节相加,然后做高字节相加,并且要加上进位,示意如下:,南开大学 朱耀庭,2.ADC指令(带进位的加法指令),南开大学 朱耀庭,3.INC指令(字节或字加1),格式:INC 目的操作数功能:目的操作数加1后送至目的操作数。INC指令的目的操作数可为字节或字,并被当作一个无符号二进制数,这一点不同于ADD,ADC。该指令常用于调整地址和计数器。影响状态标志:AF,OF,DF,SF,ZF。不影响进位标志CF。目的操作数可以为通用寄存器,也可以为存储器,但不能是立即数。例如:INC CX INC BL INC BYTE PTRBX;数据段中位移量BX的字节加1 INC WORD PTRBX+SI;数据段中位移量为BX+SI处的字加1 INC WORD PTRBP+SI;堆栈段中位移量为BP+SI处的字加1,南开大学 朱耀庭,3.INC指令(字节或字加1),例7-3 一位数加法实例题目:从键盘上输入两个一位数,相加后以十进制输出和设计思路:输入的每一个数为ASCII码,转化为对应的二进制数,相加的和化为ASCII码输出,例7-3 一位数加法实例,程序说明:运行该程序,当出现输入提示符“?”,可输入一个数字,程序显示一个“+”号,再输入一个数字,程序显示“=”号和结果。例如:?8+7=15。其中带下划线的部分,由用户输入。程序中出现的除法运算本章7.4节会有详细介绍。例7-1和例7-3都是典型的顺序程序,或称作直接程序,南开大学 朱耀庭,3.INC指令(字节或字加1),图7-3 二进制加法流程图,演示动画,南开大学 朱耀庭,7.3.2 二进制数减法,南开大学 朱耀庭,1.SUB指令(字节或字相减),格式:SUB 目的操作数,源操作数 其中,目的操作数和源操作数的具体格式同ADD指令。功能:目的操作数减去源操作数,结果送至目的操作数。影响状态标志:AF,CF,OF,PF,SF和ZF。,南开大学 朱耀庭,2.SBB指令(带借位的减法),格式:SBB 目的操作数,源操作数功能:目的操作数减去源操作数,其结果再减去进位标志的内容,将最后的结果送至目的操作数SBB影响状态标志:AF,CF,OF,PF,SF和ZFSUB和SBB指令既适用于无符号二进制数减法运算,也适用于带符号二进制数的减法运算。但是,它们的两个操作数必须同时为无符号数或同时为带符号数,并且同时为字节或字。在进行减法运算时(用SUB或SBB指令),若有借位就置CF为1;否则CF清零。故当执行SBB指令时,若CF已置1(亦即在这以前有借位产生)时,则其差再减1;否则,若CF为0(即没有借位产生)时,则其差就减0。,南开大学 朱耀庭,2.SBB指令(带借位的减法),减法实际上是用加法做的。即先把源操作数(减数)变成其补码,把CF也变成补码(0的补码为0,1的补码为1111 1111(8位时)或1111 1111 1111 1111(16位时),然后再做加法。例如:(DL)=03H,(BL)=64H,CF=1。指令:SBB BL,DL的执行结果是:(BL)=60H,示意如下:,南开大学 朱耀庭,3.DEC指令(字节或字减1),格式:DEC 目的操作数 其中,目的操作数可为字节或字,并被视为无符号二进制数。功能:目的操作数减1送至目的操作数。影响状态标志:AF,OF,PF,SF,ZF,但不影响CF,南开大学 朱耀庭,4.NEG指令(求补),格式:NEG 目的操作数功能:0减去目的操作数后送至目的操作数,使目的操作数符号变反。例如,+1变成-1,-变成+2。影响状态标志:AF,CF,OF,PF,SF和ZF。但要注意:除了操作数为0以外,CF总是1;操作数为0时CF置0。,南开大学 朱耀庭,4.NEG指令(求补),例7-4 一位数减法实例。题目:从键盘上输入两个一位数,相减后以十进制输出和。设计思路:输入的每一个数为ASCII码,转化为对应的二进制数,相减的差化为ASCII码输出,例7-4 一位数减法实例,南开大学 朱耀庭,4.NEG指令(求补),例7-4 一位数减法实例。程序说明:运行该程序,当出现输入提示符“?”,可输入一个数字字符,将其转化成真正的数字BL,显示一个“-”号,再输入一个数字字符,将其转化成真正的数字BH,显示“=”号后,(BL)-(BH)BL,若差小于零,则将其求补并且输出一个“-”号,将差拼成ASCII码后输出。若差为大于等于0的,则直接将差拼成ASCII码后输出即可。例如:?8-3=5?3-8=-5,南开大学 朱耀庭,7.3.3 二进制加减运算的有效性,在7.1节中已经看到,运算结果有时会超出范围,变得无效,如何判断运算的有效性就是本节要介绍的内容。加减指令同时会影响到标志寄存器的进位标志和溢出标志,这两个标志位主要是为算术运算设计的,设计规则如下:(1)当符号位(即最高位)有进位时,进位标志设置成1,否则设置成0。(2)数据位向符号位有进位,但符号位不再产生进位时有溢出,或者符号位产生进位但数据位不向符号位进位时也产生溢出。,南开大学 朱耀庭,7.3.3 二进制加减运算的有效性,下面用实例来总结CF,OF和运算有效性之间的关联规律。1.CF=0,OF=0 符号位无进位CF=0,数据位向符号位无进位OF=0,南开大学 朱耀庭,7.3.3 二进制加减运算的有效性,下面用实例来总结CF,OF和运算有效性之间的关联规律。2.CF=1,OF=0 符号位有进位CF=1,数据位向符号位也有进位OF=0,南开大学 朱耀庭,7.3.3 二进制加减运算的有效性,下面用实例来总结CF,OF和运算有效性之间的关联规律。3.CF=0,OF=1 符号位无进位CF=0,数据位向符号位有进位OF=1,南开大学 朱耀庭,7.3.3 二进制加减运算的有效性,下面用实例来总结CF,OF和运算有效性之间的关联规律。4.CF=1,OF=1 符号位有进位CF=1,并且数据位向符号位无进位OF=1,南开大学 朱耀庭,7.3.3 二进制加减运算的有效性,上述标志位与运算结果的有效性见表7-1,表 7-1,南开大学 朱耀庭,7.4 无符号二进制数乘除运算,南开大学 朱耀庭,1.MUL指令(无符号二进制数乘法),功能:隐含目的操作数,把源操作数和AL(AX)的值相乘保存到AX(DX+AX)中乘法运算和加减法运算不一样,加减运算时和或差最多比两个操作数多1位或少1位(或几位)而乘法运算结果长度可能要增加一倍。两个8位数相乘,乘积可能为16位。如图7-4所示:,南开大学 朱耀庭,1.MUL指令(无符号二进制数乘法),图7-4 乘法运算的长度,南开大学 朱耀庭,1.MUL指令(无符号二进制数乘法),80868088规定:如果源操作数为8位无符号数,则AL中的无符号数与源操作数相乘,乘积送至AX;如果源操作数为16位无符号数,则AX中的无符号数与源操作数相乘,乘积的扩展部分(高16位)送至扩展寄存器DX,低16位送至AX,如图7-5所示:,图7-5 乘法运算,南开大学 朱耀庭,1.MUL指令(无符号二进制数乘法),如果乘积的高一半(即扩展部分)为0,则将CF清零;否则,CF(置1),OF也置1。执行MUL指令后,AF,PF,SF和ZF的内容不定。例如:计算36100,将积送字变量WV,可用下列指令序列实现:MOV AL,36 MOV BL,100 MUL BL;(AL)*(BL)AX MOV WV,AX;将积(AX)WV,南开大学 朱耀庭,1.MUL指令(无符号二进制数乘法),计算32010000,将积的高位字送字变量WH,低位字送字变量WL,可用下列指令序列来实现:MOV AX,320 MOV BX,10000 MUL BX;(AX)*(BX)DX,AX MOV WH,DX;积的高位字(DX)WH MOV WL,AX;积的低位字(AX)WL,南开大学 朱耀庭,1.MUL指令(无符号二进制数乘法),7-5 一位数乘法示例题目:输入两个一位无符号09数字,相乘后,将积“二化十”输出设计思路:首先将输入的ASCII数字字符,转化为对应二进制数,然后相乘,乘积十位与个位分离,然后用ASCII码分别输出,例7-5 一位数乘法示例,程序说明:运行该程序时,首先输入一个09数字字符,程序将其转化成真正的二进制数值。显示*号后再输入一个09数字字符,将其转化成真正的二进制数值,做乘法运算,显示“=”号后,再显示两位十进制数字(结果)。例如,7*8=56,南开大学 朱耀庭,2.DIV指令(无符号字节或字除法),格式:DIV 源操作数功能:将累加器及其扩展寄存器中的双倍长度的无符号被除数除以源操作数中的无符号除数。对于8位除数的除法运算,被除数在AH和AL中;对于16位除数的除法运算,被除数在DX和AX中。运算后将单倍长度的商送回累加器AL或AX,将单倍长度的余数送到扩展寄存器AH或DX。其操作如图7-6所示:,南开大学 朱耀庭,2.DIV指令(无符号字节或字除法),图7-6 除法运算,南开大学 朱耀庭,2.DIV指令(无符号字节或字除法),如果除法指令产生的结果(商的值)超出了保存它的目的寄存器的范围,就如同被0除了一样,置OF为1,产生溢出中断。除法指令DIV规定被除数为双倍除数的长度,是为了乘除连用时比较方便。比如:计算764时,8位数7(00000111B)和8位数6(00000110B)相乘,产生16位的乘积42(即0000 0000 0010 1010B)送至AH和AL(即AX),用AX中的16位数可以直接除以8位数4(0000 0100B)。,南开大学 朱耀庭,2.DIV指令(无符号字节或字除法),但是,8位数除以8位数时,不能简单地将被除数放在AL里,就直接去除以8位除数,因为除法指令将会把AH中无论什么毫无价值的内容都当成是被除数的最高有效8位数。所以在进行除法运算以前,必须先将AH清零。同样,16位数除以16位数时,将被除数送入AX以后,也应注意将DX清零后才能做除法运算。,南开大学 朱耀庭,2.DIV指令(无符号字节或字除法),例如,计算135100,可用以下指令序列来实现:MOV AX,135;被除数135AX MOV BL,100;除数100BL DIV BL;(AX)(BL)商1AL,余数35AH计算125321000,可用下列指令序列实现:MOV AX,12532;被除数12532AX MOV DX,0;0DX MOV BX,1000;除数1000BX DIV BX;DX AX(BX)商12AX,余数532DX,南开大学 朱耀庭,2.DIV指令(无符号字节或字除法),例7-6 一位数除法实例题目:输入两个一位数,作除法,用十进制形式输出商和余数设计思路:输入的两个数先化为二进制数,然后用DIV作除法。结果以ASCII码形式输出,例7-6 一位数除法实例,南开大学 朱耀庭,7.5 带符号二进制数乘除运算,乘、除指令与加、减指令不一样,加、减指令既适用于无符号二进制数的运算,也适用于带符号二进制数的运算,而如果用无符号数的乘法指令MUL来进行带符号二进制数乘法运算就不会得出正确结果。必须为带符号数提供专用的乘法和除法指令。,南开大学 朱耀庭,7.5 带符号二进制数乘除运算,带符号二进制乘法运算指令,带符号二进制除法运算指令,7.5.1,南开大学 朱耀庭,7.5.1 带符号二进制乘法运算指令,乘、除指令与加、减指令不一样,加、减指令既适用于无符号二进制数的运算,也适用于带符号二进制数的运算,而如果用无符号数的乘法指令MUL来进行带符号二进制数乘法运算就不会得出正确结果。必须为带符号数提供专用的乘法和除法指令,南开大学 朱耀庭,7.5.1 带符号二进制乘法运算指令,IMUL指令(带符号位的字节或字相乘)也称作整数乘法指令,此指令除了其操作数为带符号位的二进制数外,其格式、功能完全类似于MUL。对于IMUL指令来说,若结果的高半部分(8位数乘时为AH,16位乘时为DX)不是结果的符号位的扩展(所谓符号位扩展,正数扩展部分全为0,负数扩展部分全为1),则CF和OF置1;否则,CF和OF置0。也就是说,若CF和OF置1,则表示AH或DX中含有结果的有效数字,因此使用IMUL指令计算带符号二进制乘法必须对结果进行有效性判断。执行IMUL指令后,AF,PF,SF和ZF内容不定。,南开大学 朱耀庭,7.5.1 带符号二进制乘法运算指令,例7-7 带符号一位数乘法实例题目:从键盘上输入两个带符号一位数,相乘后以十进制输出积。设计思路:输入的每一个数为ASCII码,转化为对应的二进制数,相乘的积化为ASCII码输出,例7-7 带符号一位数乘法实例,程序说明:本例中并未对结果作出有效性判断是因为带符号一位数乘法不会溢出,结果介于-81到81之间,处于有效范围(-127127)。若多位数乘法就需要对结果作出有效性判断,该问题作为课下练习,南开大学 朱耀庭,7.5.2 带符号二进制除法运算指令,南开大学 朱耀庭,1.IDIV指令(带符号的字节或字除法),IDIV指令除了其操作数为带符号的二进制数不同于DIV指令外,其格式、功能都类似于DIV指令。带符号数的除法指令IDIV规定:余数和被除数的符号相同。这样规定就使得商和余数是唯一的。例如:-26(+)=-3(商),余数为-5,是正确的;-26(+)=-4(商),余数为+2,是错误的。由于除法指令隐含使用字或双字作为被除数,所以在进行除法运算前需要扩展被除数,对于无符号除法,直接把扩展的寄存器置零,而对于有符号除法,需要把符号位扩展,8086/8088提供了专门的符号扩展指令。,南开大学 朱耀庭,2.CBW指令(把字节转化成字),CBW指令功能:将AL的符号扩充到AH对于带符号数,当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。,南开大学 朱耀庭,3.CWD指令(把字转化成双字),CWD指令功能:将AX的符号扩充到DX。16位数除以16位数时,应先将16位的被除数AX,转换成32位放到DX和AX中,即将AX中的符号位扩充到DX中去,这需要用指令CWD。例如:带符号字节变量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,南开大学 朱耀庭,3.CWD指令(把字转化成双字),例7-8 带符号一位数除法实例题目:从键盘上输入两个带符号一位数,相除后以十进制输出商和余数设计思路:输入的每一个数为ASCII码,转化为对应的二进制数,相除的商和余数化为ASCII码输出,例7-8 带符号一位数除法实例,南开大学 朱耀庭,7.6 非压缩BCD码运算,非压缩型BCD码加法运算,非压缩型BCD码减法运算,7.6.1,非压缩型BCD码除法运算,非压缩型BCD码乘法运算,南开大学 朱耀庭,7.6.1 非压缩型BCD码加法运算,南开大学 朱耀庭,1.非压缩型BCD码(ASCII码)的加法调整指令AAA,格式:AAA(无操作数)功能:把ASCII码调整为非压缩型十进制数(BCD码)。逻辑式为:(AL)+6AL,AL&0FHAL 若(AL)&0FH)9或(AF)=1则(AH)+1AH CF=1 AF=1否则,(AL)&0FHAL其中,(AL)&0FHAL的功能是为了将高4位清零,因为直接用ASCII码作运算,高4位有与BCD码无关的数3。符号“&”表示逻辑乘运算。AAA指令除影响AF和CF标志外,其余标志位均未定义,南开大学 朱耀庭,2.多字节非压缩型BCD码(ASCII码)加法运算,例如,计算:用ASCII码作这个加法,数据定义为:A DB 1,5,8 B DB 3,6,9 C DB 4 DUP(?),南开大学 朱耀庭,2.多字节非压缩型BCD码(ASCII码)加法运算,若相加的结果放在C,则具体计算步骤如图7-7所示:,图7-7 多字节加法计算步骤,以上将第一步结果4送至C(个位数字字节)第二步的结果1送至C(十位数字字节)第三步的结果8送至C(百位数字字节)将第三步后的进位1送至C(千位数字字节)最终结果在C4,C3,C2,C1各字节的低4位上,南开大学 朱耀庭,2.多字节非压缩型BCD码(ASCII码)加法运算,例7-9 多字节非压缩型BCD码加法实例题目:计算4321+6597,并将结果显示输出设计思路:用非压缩型BCD码加进行,计算步骤如图7-7所示,例7-9 多字节非压缩型BCD码加法实例,程序说明:第一步相加最低位时,利用循环前的MOV AH,0H和SAHF将CF置零。相加结果产生的进位由LAHF保存在AH中。第二、三、四步时,SAHF为从AH取上次进位,LAHF保存在本次进位到AH。循环后,AND AH,01H为从AH中取最后的进位。,南开大学 朱耀庭,2.多字节非压缩型BCD码(ASCII码)加法运算,例7-10 用改进的方法重写例7.9程序设计思路:与例7-9的区别是输出结果的ASCII数字字符在最后统一转换并输出,例7-10 用改进的方法重写例7.9程序,程序说明:本例中STRING1和STRING2均定义为5个字节,且最后一个字节初值为0。将相加运算用五步实现,这样第4位的进位就不必如例7-9那样单独处理,南开大学 朱耀庭,7.6.2 非压缩型BCD码减法运算,非压缩型BCD码减法调整指令如下:AAS指令(减法的ASCII调整)格式:AAS(无操作数)功能:此指令适用于非压缩型BCD码的减法运算。其格式同AAA指令。逻辑式为:(AL)-6HAL(AL)&0FHAL若(AL)&(0FH)9或(AF)=1则(AH)-1HAH 1AF1AF否则,(AL)&0FHAL与加法运算类似,多字节非压缩型BCD码的减法运算是在带借位减法指令SBB后加上一条调整指令AAS来实现的。AAS指令除影响AF和CF标志外,其余标志位均未定义,南开大学 朱耀庭,7.6.3 非压缩型BCD码乘法运算,南开大学 朱耀庭,1.非压缩型BCD码(ASCII码)乘法调整指令AAM,格式:AAM(无操作数)功能:对两个非压缩型BCD码相乘的结果(在AX中)进行修正,以便得到正确的十进制(BCD码)积。它的用法是在普通的无符号二进制乘法(8位)MUL指令后面写上一条AAM指令。非压缩型BCD码的乘法和加减法不同,加减法可以直接用ASCII码参加运算,而不管它的高位上与数字无关的数,只要在ADC(或SBB)指令后用一条调整指令AAA(或AAS)就能得到正确结果。而乘法运算要求参加运算的两个乘数必须是真正的非压缩型BCD码,即高4位为0,低4位为一个十进制数字。也就是说,如果用ASCII码作为非压缩型BCD码作乘法运算的话,在乘法运算之前,必须将高4位清零。,南开大学 朱耀庭,1.非压缩型BCD码(ASCII码)乘法调整指令AAM,下面举例说明AAM指令是如何实现调整的。例如用下列指令序列实现69=54:MOV AL,06H MOV BL,09H MUL BL AAM执行指令MUL BL结果应为:00000110B*00001001B=0000000000110110B(结果在AX中)。AAM指令的功能是把AX中的二进制结果(十进制应为54)分解成AH中的5(00000101B)和AL中的4(00000100B)。,南开大学 朱耀庭,1.非压缩型BCD码(ASCII码)乘法调整指令AAM,AAM指令的具体操作是把AL的内容除以10,将商送到AH,余数送到AL。8位数乘8位数,其乘积应为16位数,在AX中。为什么AAM指令只将AL中的数除以10呢?这是因为1位十进制数乘1位十进制数,其乘积的最大值9*9=81=01010001B只有7位有效数字,乘积的高8位(AH中)必为0。总之,AAM指令的功能是将AL中二进制乘积分解为两位十进制数字(BCD码),十位数的BCD码送至AH,个位数的BCD码送至AL。其具体操作为将AL的内容除以0AH,商送至AH,余数送至AL。AAM指令用下面的方法设置标志位:CF,OF,AF不定;PF取决于AL寄存器的内容;SF取决于AL寄存器的高位,ZF取决于AL寄存器的内容。,南开大学 朱耀庭,2.多字节非压缩型BCD码的乘法,上面对一位非压缩型BCD码和另一位非压缩型BCD码如何进行乘法运算进行了介绍。现在将进一步介绍多位BCD码与一位BCD码如何实现其乘法。比如,5396,通常的算法为:9乘6得54,写下4同时将5进位;3乘6得18,加进位的5得23,写下3的同时将2进位;5乘6得30,加进位的2得32,写下这个数。写成竖式为:,南开大学 朱耀庭,2.多字节非压缩型BCD码的乘法,假设539是以非压缩型BCD码的形式,分别存入变量a,a2和a1中,数6是以非压缩型BCD码的形式,存放在变量b中。又假设a3,a2,a1和b中的数高4位均已清0,并将a3,a2,a1乘以b所得的乘积存放到c4,c3,c2,c1变量中。即:,南开大学 朱耀庭,2.多字节非压缩型BCD码的乘法,例7-11 多字节非压缩型BCD码乘法实例 题目:用非压缩型BCD码计算:945736设计思路:用本小节中2的方法进行运算,例7-11 多字节非压缩型BCD码乘法实例,南开大学 朱耀庭,十进制数除法调整指令AAD格式:AAD功能:将AX中的两位非压缩型BCD码转换成真正的二进制数,其操作为:(AH)*0AH+(AL)AL,且0AH下面来介绍如何进行被除数为两位,除数为一位的非压缩型BCD码的除法运算。,7.6.4 非压缩型BCD码除法运算,南开大学 朱耀庭,比如,计算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码除法运算,南开大学 朱耀庭,例如,计算436的程序序列为:MOV AX,0403H AAD MOV BL,06H DIV BL,7.6.4 非压缩型BCD码除法运算,南开大学 朱耀庭,7.6.4 非压缩型BCD码除法运算,例7-12 多字节非压缩型BCD码除法实例题目:用非压缩型BCD码计算5978648设计思路:用非压缩型BCD码,从高位到低位依次除以除数,每次循环得到的余数(AH)作为下一次除法的高位。最后将商从高位到低位输出,并输出余数,例7-12 多字节非压缩型BCD码除法实例,程序说明:本例从高位开始除,每次除得的余数在AH中,作为下一次除法的高字节,而低字节通过MOV AL,SI得到,南开大学 朱耀庭,7.7 压缩型BCD码加减运算,8088微处理器只提供了压缩型BCD码的加减运算调整指令而没有提供乘除运算调整指令因此,对于压缩型BCD码来说,只能进行加减运算,不能直接进行乘除运算,南开大学 朱耀庭,7.7 压缩型BCD码加减运算,压缩型BCD码加法运算,压缩型BCD码减法运算,7.7.1,南开大学 朱耀庭,7.7.1 压缩型BCD码加法运算,压缩型BCD码做加法运算时,调整指令应做什么呢?请看下面的例子:(1)34+23=57的操作示意如下:,结果正确,这时调整指令不需要做什么,南开大学 朱耀庭,7.7.1 压缩型BCD码加法运算,压缩型BCD码做加法运算时,调整指令应做什么呢?请看下面的例子:(2)48+29=77的操作示意如下:,结果不正

    注意事项

    本文(《汇编语言程序设计》第七章:算术运算指令与程序设计.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开