《汇编语言程序设计》第七章:算术运算指令与程序设计.ppt
《《汇编语言程序设计》第七章:算术运算指令与程序设计.ppt》由会员分享,可在线阅读,更多相关《《汇编语言程序设计》第七章:算术运算指令与程序设计.ppt(99页珍藏版)》请在三一办公上搜索。
1、汇编语言程序设计-朱耀庭,南开大学 朱耀庭,第7章 算术运算指令与程序设计,本章的主要内容就是介绍汇编语言中的算术运算指令及其程序设计。希望同学们在掌握上述内容的同时关注算术运算指令对标志寄存器的影响,因为标志位将是条件转移指令的判断依据,也是分支程序设计实现分支的依据。,南开大学 朱耀庭,第6章 数据传送与顺序程序设计,7.1 算术运算和逻辑运算对标记寄存器的影响,7.2 算术运算的数据格式,7.3二进制数加减运算,7.4 无符号二进制数乘除运算,7.5 带符号二进制数乘除运算,7.6 非压缩BCD码运算,7.7 压缩型BCD码加减运算,南开大学 朱耀庭,7.1 算术运算和逻辑运算对标记寄存
2、器的影响,标志寄存器和其他寄存器不一样,其他寄存器是用来存放数据的,并且整个寄存器具有一个含义,而标志寄存器是按位起作用的,每一位都有专门的含义。详见 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:CO
3、DE 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。这一简短的例子说明,加法运算不只是把两个整数简单地相加,结果是否正确还要看标志位。减法、乘法以及除法中都会存在类
4、似的问题。这就需要程序员经常地注意标志寄存器,以确保运算结果的正确性。,南开大学 朱耀庭,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 JM
5、P 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标志,零标
6、志。例如: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)
7、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,
8、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,但
9、超过了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提供的二进制
10、算术运算指令包括二进制运算和十进制运算指令,能对二进制数(字节或字)直接进行算术运算,并且通过专门的调整指令,可以完成十进制数(BCD码)的算术运算。它提供的加、减、乘、除4种基本的算术运算指令,只能直接对整数进行操作,而不能直接对实数(浮点数)进行运算。本章将详细介绍算术运算指令的格式、功能及用法,并举例说明多字节的无符号二进制数的加、减、乘、除运算,多字节压缩型BCD码的加、减运算,多字节非压缩型BCD码的加、减、乘、除运算的程序设计方法。,南开大学 朱耀庭,7.2 算术运算的数据格式,南开大学 朱耀庭,1.无符号二进制数,无符号二进制数可以是8位或16位8位无符号二进制数的范围为0255
11、16位无符号二进制数的范围为065535用于无符号二进制数的加法指令有:ADD,ADC,INC用于无符号二进制数的减法指令有:SUB,SBB,DEC用于无符号二进制数的乘法指令为MUL用于无符号二进制数的除法指令为DIV,南开大学 朱耀庭,2.带符号二进制数,带符号的二进制数(整数)也可以为8位或16位其最高位(最左边的一位)是数的符号位,该位为0表示正数,为1表示负数负数是以二进制的补码形式给出的由于其最高位用来作符号位,所以,8位的带符号二进制数的范围为-128+127;16位的带符号二进制数的范围为-32768+32767带符号的二进制数的乘法指令为IMUL;除法指令为IDIV;而带符号
12、的二进制数的加、减法运算与无符号二进制数的加、减法指令一样,南开大学 朱耀庭,3.压缩型BCD码,压缩型BCD码,也称作压缩型二进制编码的十进制数。详见节二进制编码的十进制数BCD码(Binary-Coded Decimal)。对于一个字节来说,压缩型BCD码数的范围为099压缩型BCD码的加、减分两步来实现:先用一条无符号二进制数的加、减指令对压缩型BCD码进行加、减,在AL中产生一个中间结果(可能为不正确的结果);然后再执行一条加、减法的压缩型BCD码调整指令加法调整指令为DAA;减法调整指令为DAS。调整指令将AL中的中间结果调整为最终正确的压缩型BCD码。压缩型BCD码不能进行乘、除运
13、算,南开大学 朱耀庭,4.非压缩型BCD码,非压缩型BCD码,也称作非压缩型二进制编码的十进制数。详见节二进制编码的十进制数BCD码(Binary-Coded Decimal)。非压缩型BCD码一个字节只能存放一位非压缩型BCD码,即用00H09H表示09。非压缩型BCD码十进制数的加、减、乘运算都是先用无符号二进制数的加、减、乘运算指令在AL中产生一个中间结果,然后,再执行一条调整指令,以便将AL中可能错误的中间结果调整成最终正确的非压缩型BCD码。其加法的调整指令为AAA;减法的调整指令为AAS;乘法的调整指令为AAM。而非压缩型BCD码十进制数的除法运算与加、减、乘不同,除法不是先计算后
14、校正,而是先校正后做除法。除法调整指令为AAD。非压缩型BCD码在进行加、减时,可以直接用09数字的ASCII码参加运算,而不必将高4位清零,这也是将非压缩型BCD码的调整指令称为ASCII码调整指令的缘故。而乘、除运算之前则必须将ASCII码高4位清零,即必须转换为真正的非压缩型BCD码后才能够进行相应运算。,南开大学 朱耀庭,7.3 二进制数加减运算,二进制数加法,二进制数减法,7.3.1,二进制加减运算的有效性,南开大学 朱耀庭,7.3.1 二进制数加法,南开大学 朱耀庭,1.ADD指令(字节或字相加),格式:ADD 目的操作数,源操作数功能:将目的操作数加上源操作数,和送至目的操作数。
15、影响状态标志: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
16、存储器,立即数例:ADD BXSI,12;(DS:BXSI)+12(BXSI),南开大学 朱耀庭,2.ADC指令(带进位的加法指令),格式:同ADD功能:源操作数加目的操作数再加进位标志CF的和送至目的操作数。即如果进位标志已被置位,则两个操作数相加的结果在存入目的操作数之前再加上1,否则加上0。影响状态标志:AF,CF,OF,DF,SF,ZF。ADD和ADC指令既适用于无符号二进制数加法运算,也适用于带符号二进制数的加法运算。但是,它们的两个操作数必须同时为无符号数或同时为带符号数,并且同时为字节(8位数)或同时为字(16位数)。ADC指令多用于多字节加法运算,需要分步计算时很有用。例如,有
17、两个两字节的数相加,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;数据段中位移量B
18、X的字节加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。其中带下划线的部分,由用户输入。程序中出现的除法运
19、算本章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 目的操作数,源操作数功能:目的操作数减去源操作数,其结果再减去进位标志的内容,将最后
20、的结果送至目的操作数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的补码为11
21、11 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。影响
22、状态标志: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)-
23、(BH)BL,若差小于零,则将其求补并且输出一个“-”号,将差拼成ASCII码后输出。若差为大于等于0的,则直接将差拼成ASCII码后输出即可。例如:?8-3=5?3-8=-5,南开大学 朱耀庭,7.3.3 二进制加减运算的有效性,在7.1节中已经看到,运算结果有时会超出范围,变得无效,如何判断运算的有效性就是本节要介绍的内容。加减指令同时会影响到标志寄存器的进位标志和溢出标志,这两个标志位主要是为算术运算设计的,设计规则如下:(1)当符号位(即最高位)有进位时,进位标志设置成1,否则设置成0。(2)数据位向符号位有进位,但符号位不再产生进位时有溢出,或者符号位产生进位但数据位不向符号位进位时
24、也产生溢出。,南开大学 朱耀庭,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 二
25、进制加减运算的有效性,下面用实例来总结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位。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言程序设计 汇编语言 程序设计 第七 算术 运算 指令
链接地址:https://www.31ppt.com/p-6527962.html