汇编语言简单应用程序设计

上传人:ji****72 文档编号:45584803 上传时间:2018-06-17 格式:PDF 页数:31 大小:1.07MB
返回 下载 相关 举报
汇编语言简单应用程序设计_第1页
第1页 / 共31页
汇编语言简单应用程序设计_第2页
第2页 / 共31页
汇编语言简单应用程序设计_第3页
第3页 / 共31页
汇编语言简单应用程序设计_第4页
第4页 / 共31页
汇编语言简单应用程序设计_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《汇编语言简单应用程序设计》由会员分享,可在线阅读,更多相关《汇编语言简单应用程序设计(31页珍藏版)》请在金锄头文库上搜索。

1、 1 第七章 汇编语言简单应用程序设计 7.1 算术运算调整指令及其应用 在前面我们讨论的加、减等运算指令都是以二进制为操作对象的,但在实际使用中,更为习惯的是以 十进制数为基础的运算形式,因此,我们也希望程序能直接接收十进制数进行运算,并用十进制数进行输 出。 要达到这个目标,显然可以采用数制转换方法,先将输入的十进制数转换为二进制数,然后利用计算 机中二进制数指令进行运算,将得到的二进制结果转化为十进制数输出。 当然,也可以直接进行十进制数运算,此时需要计算机提供能进行十进制运算的指令,否则不能采用 此方法。由于现在的计算机内部数据都是以二进制数的形式来表示的,要表示 1 位十进制数(0-

2、9) ,至少 要用 4 位二进制数来表示,我们将这种用 4 位二进制数表示 1 位十进制数的编码方式称为 BCD 码。利用 BCD 码,可在计算机内部实现十进制数运算,一般来说,这类方法有两种: 1. 指令系统中提供了有能直接进行 BCD 码加、减、乘、除法等运算的指令。 2. 先用二进制运算指令进行加、 减、 乘、 除法运算, 然后再将得到的结果进行 BCD 码校正。 8086/8088 采用的就是这种方法。 7.1.1 BCD 码校正及其加减法 BCD 码校正指令 8086/8088 的十进制数运算调整指令采用 BCD 码表示的十进制数, BCD 码有组合型 BCD 码 (PACKED B

3、CD CODE)和非组合型 BCD 码(UNPACKED BCD CODE)两种表示形式。 组合型 BCD 码用一个字节表示两个十进制数,即用一个字节的低四位和高四位分别表示一位十进制 数。例如,将十进制数 97 用组合型 BCD 码表示,则为: 非组合型 BCD 码用一个字节只表示一位十进制数。由于一位十进制数只需 4 位二进制数即可表示, 因而,通常用一个字节的低四位表示此十进制数,而其高四位对表示的十进制数没有影响,通常用“0000” 或“1111”作为标志。例如,对于十进制数 97 用非组合型 BCD 码表示则需要两个字节,即为: 8086/8088 共有六条 BCD 码校正指令,其中

4、加减法各有两条,乘除法各有一条。 1. 非组合型加法校正指令 AAA(ASCII Adjust for Addition) AAA 指令对寄存器 AL 中数据进行校正,校正后结果放在 AL 中。若有进位,则将标志 CF 置为 1, 并更改 AH 值。由于其为加法校正指令,因此使用 AAA 指令前需先用 ADD 或 ADC 完成加法运算,并且 其和应存在寄存器 AL 中。 具体校正法则:若 AL 中低四位的数9,或 AF=1,则执行操作(AL)=(AL)+6,(AH)=(AH)+1,且 AL2 中高四位清零,AF,CF 置1 。 下面举例说明其应用。 用键盘直接输入两个一位十进制数,相加后结果存

5、放在 AL 和 AH 中,实现此操作的程序段如下: MOV AH, 1 INT 21H MOV BL, AL MOV AH, 1 INT 21H MOV AH, 0 ADD AL, BL AAA 在执行 ADD 之前,程序首先通过键盘接收了两个一位的十进制数分别存放在 BL 和 AL 中。需要注意的 是,输入的十进制数是以 ASCII 码存储的。一位十进制数的 ASCII 码和其二进制编码如表 7.1 所示,比较 它们可以发现,ASCII 码的低四位正好就是其所要表示的十进制数的二进制编码。因此上述程序中 AL 和 BL 中的操作数可以看作为一位非组合型 BCD 码。两个非组合型 BCD 码相

6、加后,再用 AAA 指令进行校正。根 据 AL 和 BL 中存放的数据不同,它们低四位相加后可能产生进位,因此,下面分两种情况说明执行十进制 校正指令的校正过程。 表 7.1 输入一位十进制 ASCII 字符同 BCD 码之间关系 一位十进制数 十进制数的 ASCII 码 ASCII 码的二进制编码 一位十进制数的 BCD 码 0 30H 0011 0000 0000 0000 1 31 H 0011 0001 0000 0001 2 32 H 0011 0010 0000 0010 3 33 H 0011 0011 0000 0011 4 34 H 0011 0100 0000 0100 5

7、 35 H 0011 0101 0000 0101 6 36 H 0011 0110 0000 0110 7 37 H 0011 0111 0000 0111 8 38 H 0011 1000 0000 1000 9 39 H 0011 1001 0000 1001 情况 1:无进位情况下的十进制数校正。 设(AL)=2,(BL)= 5 执行 ADD 指令: 0 0 1 1 0 0 1 0 +) 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 1 (AL) 执行 AAA 指令:由于两个数相加没有产生进位(2 + 5 9) ,所以,需要按照上述法则进行校正: 3 1 1 0 1 0

8、0 0 0 (AL)+ 6 +) 0 0 0 0 0 1 1 0 1 1 0 1 0 1 1 0 (AL) AL 中高四位清零: 0 0 0 0 0 1 1 0 (AL) AH 中加 1: 0 0 0 0 0 0 0 1 (AH) 2. 组合型加法校正指令 DAA(Decimal Adjust for Addition) 此校正指令对组合型 BCD 码的加法运算进行。同 AAA 一样,在执行 DAA 指令之前,已用 ADD 或者 ADC 指令完成加法,且加法结果在 AL 中。执行 DAA 指令,对 AL 中的数据进行校正,并将校正后的结果放在 AL 中,如果有高位进位,则高位进位放在 CF 中

9、。 具体校正法则: 如果 AL 中低四位 9 或者 AF = 1, 则执行操作(AL) =(AL)+ 6,并置(AF) = 1; 如果 AL 中高四位 9 或者 CF = 1, 则执行操作:(AL) =(AL) + 60H,并置(CF) = 1。 上述校正法则的实质和 AAA 校正指令法则相同,都是根据是否进位进行的。由于组合型 BCD 码在一个 字节中包含了两位十进制数,因而,需要按照低四位和高四位的划分方法分别进行讨论。其中,AF = 1 表 示 AL 中低四位不大于 9,但已向高四位产生进位,所以,在执行加法指令时,十进制数的低位结果大于 9。 同理,CF = 1,表示执行加法指令时,十

10、进制数的高位结果大于 9。 例如实现十进制数的加法 1245+3456,可编制如下程序段。 NUM1 DB 45H, 12H ;十进制数 1245D NUM2 DB 56H, 34H ;十进制数 3456D SUN DB ? , ? MOV AL, NUM1 ;将 45 的 BCD 码送 AL ADD AL, NUM2 ;低两位十进制数相加(45+56) DAA ;校正。此时,如果有进位,则会影响标 ;志位取值 MOV SUM, AL ;保存和的低两位 MOV AL, NUM1+1 ;将高两位数 12 的 BCD 码送 AL ADC AL, NUM2+1 ;将高两位十进制数相加(45+56)并

11、加上 ;低位来的进位 DAA ;高字节结果校正 MOV SUM+1, AL ;保存和的高两位 为了说明该指令的处理过程,下面编写了二位十进制加法的程序段,该程序将连续四个十进制数 34, 47,87,79 相加,每条指令执行后各个相关寄存器结果作为注释给出。指令 1)使 AL 装入表示两位十进 制数 34 的组合 BCD 码;指令 2)进行十进制数 34 和 47 的加法操作,因 ADD 为二进制相加,所以结果为 7BH,但上述两个十进制数相加的正确结果应该为 81,需要对计算结果进行校正;指令 3)对刚计算得到 的结果进行校正,由于(AL)=7BH,其低四位的值是大于 9,根据校正规则,最终

12、得到的结果为(AL)=81H, 并置标志位(AF)=1;指令 4)将得到的结果再和十进制数 87 累加;指令 5)将指令 4)相加的结果进行校 正,得正确结果。以此类推。 1) MOV AL,34H 2) ADD AL,47H ;(AL)=7BH, (AF)=0, (CF)=0 3) DAA ;(AL)=81H, (AF)=1, (CF)=0 4) ADC AL,87H ;(AL)=08H, (AF)=0, (CF)=1 5) DAA ;(AL)=68H, (AF)=0, (CF)=1 4 6) ADC AL,79H ;(AL)=E2H, (AF)=1, (CF)=0 7) DAA ;(AL)

13、=48H, (AF)=1, (CF)=1 3. 非组合型减法校正指令 AAS(ASCII Adjust for Subtraction) 减法校正指令和加法校正指令类似。要求在进行校正以前已经进行了减法运算,并且结果在 AL 中, 校正后的结果送回到 AL 中。如果减法产生了借位,则向高位的借位标志放在 AH 和 CF 中。 具体校正法则: 若 AL 中低四位 9 或者 AF = 1,那么顺序执行以下步骤。 第一步: (AL)=(AL) 6 因为两个十进制数相减的结果不可能大于 9,因而需要校正数值范围。 第二步:(AH) = (AH)1 校正数值范围后,实际是向高位借位进行的一个减法。此时,

14、相应的高四位需要做-1 操作。 第三步:AL 高四位清零 第四步:标志位 CF 和 AF 置为“1” 。 为了说明该指令的执行过程,下面列举了两个十进制数 3 和 9 相减的程序段。程序首先进行减法运算 得到结果 2BH,存放在寄存器 AL 中,由于存在借位,标志(AF)=1,得到的结果和实际结果不符合,因此 利用 AAS 指令对结果进行了调整并最终得到正确结果 05H。每条指令执行后各个相关寄存器结果作为注释 给出,请注意比较它们的具体取值。 1) MOV AL,03H 2) SUB AL,09H ;(AL)=2BH,(AF)=1,(CF)=0 3) AAS ;(AL)=05H,(AF)=1

15、,(CF)=0 4. 组合型校正减法校正指令 DAS(Decimal Adjust for Subtraction) 执行 DAS 指令前,需要先使用 SUB 指令或 SBB 完成减法,且结果在 AL 中。执行 DAS 指令对 AL 中数据 进行校正后, 结果放在 AL 中, 但与非组合型减法校正指令 AAS 不同的是, 其向高位的借位只在 CF 中表示。 具体校正法则: 若 AL 中低四位 9 或者 AF = 1,则执行操作(AL)=(AL) 6,并置(AF)= 1; 若 AL 中高四位 9 或者 CF = 1,则执行操作(AL)=(AL) 60H,并置(CF)= 1。 为了说明该指令下面列举了三个十进制数 45、27 和 49 连续相减的程序段。指令 2)首先进行 45 和 27 之间的减法运算,得到结果 1EH,存放在寄存器 AL 中。由于低四位存在借位,使标志(AF)=1,得到 的结果和实际结果不符合。 指令 3) 对结果进行了调整并得到 45 减去 27 的正确结果 18H。 类似地, 指令 4) 和指令 5) 给出了减法和调整指令。 相减时, 其低四位和高四位都发生了借位, 所以标志位(AF)=1,(CF)=1。 每条指令执行后各个相关寄存器结果作为注释给出,请注意比较它们的具体取值。 1) MOV AL,45H 2) SUB AL,27H ;(AL)=1EH,(A

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号