2019独角兽企业重金招聘Python工程师标准>>>

十进制数(BCD码)运算指令

在计算机中十进制数是用BCD码来表示的,BCD码有两类:一类叫压缩型BCD码,一类叫非压缩型BCD码。用BCD码进行加、减、乘、除运算,通常采用两种方法:一种是在指令系统中设置一套专用于BCD码运算的指令;另一种是利用二进制数的运算指令算出结果,然后再用专门的指令对结果进行修正(调整),使之转变为正确的BCD码表示的结果。8086/8088指令系统所采用的是后一种方法。

在进行十进制数算术运算时,应分两步进行:

① 先按二进制数运算规则进行运算,得到中间结果。

② 再用十进制调整指令对中间结果进行修正,得到正确的结果。

下面通过几个例子说明BCD码运算为什么要调整以及怎样调整。

结果正确,这时调整指令不需要做什么。

结果不正确,因为在进行二进制加法运算时,低4位向高4位有一个进位,这个进位是按十六进制进行的,即低4位逢十六才进一,而十进制数应是逢十进一。因此,比正确结果少6,这时,调整指令应在低4位上加6。即:

加法运算后,低4位若向高4位有进位(即AF=1)时,调整指令应做加06H处理。

加法运算后,低4位>9时,调整指令需做加06H处理;高4位>9时,调整指令需做加60H处理。

加法运算后,当CF=1(有进位产生)时,调整指令应做加60H处理。

前面我们已经详细地介绍了二进制数的算术运算指令,下面主要介绍十进制数(BCD码)的调整指令。

    ⒈ 十进制加法的调整指令

根据BCD码的种类,对BCD码加法进行十进制调整的指令有两条AAA和DAA。

    ⑴ 非压缩型BCD码加法调整指令AAA (ASCII Adjust for Addition)

指令格式:

AAA

AAA也称为加法的ASCII调整指令。指令后面不写操作数,但实际上隐含累加器操作数AL和AH。指令的操作为:

如果  (AL)∧0FH>9,或(AF)=1

则    (AL)←(AL)+06H

(AH)←(AH)+1

(AF)←1

(CF)←(AF)

(AL)←((AL)∧0FH)

否则  (AL)←((AL)∧0FH)

由上可见,指令将影响AF和CF标志,但状态标志位SF、ZF、PF和OF的状态不确定。

在用AAA指令调整以前,先用指令ADD(多字节加法时用ADC)进行8位数的加法运算,相加结果放在AL中,用AAA指令调整后,非压缩型BCD码结果的低位在AL寄存器,高位在AH寄存器。例如,要求计算两个十进制数之和,7+8=?。可以先将被加数7、加数8以非压缩型BCD码的形式分别存放在寄存器AL和BL中,且令AH=0,然后进行加法,再用AAA指令调整。可用以下指令实现:

MOV AX,0007H ;(AL)=07H,(AH)=00H

MOV BL,08H      ;(BL)=08H

ADD AL,BL      ;(AL)=0FH

AAA               ;(AL)=05H,(AH)=01H,(CF)=(AF)=1

以上指令的运行结果为7+8=15,所得之和也以非压缩型BCD码的形式存放,个位在AL,十位在AH。

例4.4  计算4609+3875=?

本例要求实现十进制多位数的加法,假设被加数的每一位数都以ASCII码形式存放在内存中,低位在前,高位在后。另外留出4个存储单元,以便存放相加所得的结果,如图4.19所示。程序的流程图见图4.20。

程序如下:

LEA SI,STRING1 ;(SI)←被加数地址指针

LEA  BX,STRING2  ;(BX)←加数地址指针

LEA   DI,SUM      ;(DI)←结果地址指针

MOV  CX,4        ;(CX)←循环次数

CLC                ;清进位标志CF

NEXT: MOV   AL,[SI]      ;取一个字节被加数

ADC   AL,[BX]     ;与加数相加

AAA                ;ASCII调整

MOV   [DI],AL     ;送存

INC   SI ;SI加1

INC   BX           ;BX加1

INC   DI            ;DI加1

DEC   CX           ;循环次数减1

JNZ   NEXT         ;如不为零,转NEXT

HLT                ;停止

    ⑵ 压缩型BCD码加法调整指令DAA (Decimal Adjust for Addition)

指令格式:

DAA

DAA指令同样不带操作数,实际上隐含寄存器操作数AL。指令的操作为:

如果  ((AL)∧0FH)>9  或  (AF)=1

则    (AL)←(AL)+06H

(AF)←1

如果  (AL)>9FH  或  (CF)=1

则    (AL)←(AL)+60H

(CF)←1

与AAA指令不同,DAA只对AL中的内容进行调整,任何时候都不会改变AH的内容。另外,DAA指令将影响状态标志位,如SF、ZF、AF、PF、CF,但不影响OF。例如,要求计算两个2位的十进制数之和,68+59=?。调整之前,也应先用ADD指令进行8位数加法运算,相加结果放在AL中,然后用DAA指令进行调整。可用以下指令实现:

MOV  AL,68H ;(AL)=68H

MOV  BL,59H     ;(BL)=59H

ADD  AL,BL       ;(AL)=C1H,(AF)=1

DAA              ;(AL)=27H,(CF)=1

如果要求对两个位数更多的十进制数进行加法运算,则也应编写一个循环程序,并采用ADC指令,在开始循环之前要清进位标志CF(参阅例4.4)。但采用压缩型BCD码时每次可以相加两位十进制数。例如,两个8位十进制数相加时只需循环4次。

为了掌握DAA指令与AAA指令的区别,现在再来做前面已经作过的简单计算,即7+8=?。不过这一次编程时不用AAA指令,而改用DAA指令调整,看看结果有什么不同。

MOV  AX,0007H ;(AL)=07H,(AH)=00H

MOV  BL,08H     ;(BL)=08H

ADD  AL,BL      ;(AL)=0FH

DAA               ;(AL)=15H,(AH)=00H,(AF)=1,(CF)=0

可见,现在7加8所得之和以压缩型BCD码的形式存放在AL寄存器中,而AH的内容不变。

    ⒉ 十进制减法的调整指令

同加法一样,对BCD码减法进行十进制调整的指令也有两条AAS和DAS。

    ⑴ 非压缩型BCD码减法调整指令AAS (ASCII Adjust for Subtraction)

指令格式:

AAS

AAS也称为减法的ASCII码的调整指令。隐含寄存器操作数为AL和AH。

AAS指令对非压缩型BCD码减法的计算结果进行行调整,以得到正确的结果。AAS指令的操作为:

如果  (AL)∧0FH>9  或  (AF)=1

则    (AL)←(AL)-06H

(AH)←(AH)-1

(AF)←1

(CF)←(AF)

(AL)←((AL)∧0FH)

否则  (AL)←((AL)∧0FH)

可见,AAS指令将影响状态标志位AF和CF,但SF、ZF、PF和OF状态标志位不确定。

例如想要进行两位十进制数的减法运算:13-4=?,可先将被减数和减数以非压缩型BCD码的形式分别存放在AH(被减数的十位)、AL(被减数的个位)和BL(减数)中,然后用SUB指令进行减法,再用AAS指令进行调整。可用以下指令实现:

MOV AX,0103H ;(AH)=01H,(AL)=03H

MOV  BL,04H      ;(BL)=04H

SUB  AL,BL      ;(AL)=03H-04H=FFH

AAS                ;(AL)=09H,(AH)=0

以上指令的执行结果为13-4=9,此结果仍以非压缩型BCD码的形式存放,个位在AL寄存器,十位AH在寄存器。

    ⑵ 压缩型BCD码减法调整指令DAS (Decimal Adjust for Subtraction)

指令格式:

DAS

DAS指令对减法进行十进制调整,指令隐含寄存器操作数AL。

在减法运算时,DAS指令对压缩型BCD码进行调整,其操作为:

如果  ((AL)∧0FH)>9  或  (AF)=1

则    (AL)←(AL)-06H

(AF)←1

如果  (AL)>9FH  或  (CF)=1

则    (AL)←(AL)-60H

(CF)←1

与DAA指令类似,DAS指令也只对AL寄存器中的内容进行调整,而不改变AH的内容。DAS指令也将影响状态标志位SF、ZF、AF、PF、CF,但不影响OF。

例如要求完成以下十进制数的减法运算:83-38=? 现在采用压缩型BCD码的形式来存放原始数据,则以上减法运算可用下列几条指令实现:

MOV  AL,83H ;(AL)=83H

MOV BL,38H      ;(BL)=38H

SUB  AL,BL      ;(AL)=4BH

DAS                ;(AL)=45H

    ⒊ 十进制乘除法的调整指令

对于十进制数的乘除法运算,8086/8088指令系统只提供了非压缩型BCD码的调整指令,而没有提供压缩型BCD码的调整指令。因此,8086/8088 CPU不能直接进行压缩型BCD码的乘除法运算。

非压缩型BCD码的乘除法与加减法不同,加减法可以直接用ASCII码参加运算,而不管其高位上有无数字,只要在加减指令后用一条非压缩型BCD码的调整指令就能得到正确结果。而乘除法要求参加运算的两个数必须是高4位为0的非压缩型BCD码,低4位为一个十进制数。也就是说,如果用ASCII码进行非压缩型BCD码乘除法运算的话,在乘除法运算之前,必须将高4位清零。

    ⑴ 非压缩型BCD码的乘法调整指令AAM (ASCII Adjust for Multiply)

指令格式:

AAM

AAM指令也是一个隐含了寄存器操作数AL和AH的指令。

在乘法运算时,调整之前,先用MUL指令将两个真正的非压缩型的BCD码相乘,结果放在AX中,然后用AAM指令对AL寄存器进行调整,于是在AX中即可得到正确的非压缩型BCD码的结果,其乘积的高位在AH中,乘积的低位在AL中。AAM指令的操作为:

(AH)←(AL)/0AH的商 即AL除以10,商送AH

(AL)←(AL)/0AH的余数      即AL除以10,余数送AL

AAM指令的操作实质上是将AL寄存器中的二进制数转换成为非压缩型的BCD码,十位存放在AH寄存器,个位存放在AL寄存器。

AAM指令执行以后,将根据AL中的结果影响状态标志位SF、ZF和PF,但AF、CF和OF的值不定。

例如要求进行以下十进制乘法运算:7´9=? 可编程序段如下:

MOV  AL,07H ;(AL)=07H

MOV  BL,09H     ;(BL)=09H

MUL  BL          ;(AX)=07H´09H=003FH

AAM              ;(AH)=06H,(AL)=03H

已知7´9=63。以上指令执行以后,十进制乘积也是以非压缩型BCD码的形式存放在AX中。

    ⑵ 非压缩型BCD码的除法调整指令AAD (ASCII Adjust for Division)

指令格式:

AAD

AAD指令也是一个隐含了寄存器操作数AL和AH的指令。它是对非压缩型BCD码进行调整,其操作为:

(AL)←(AH) ´0AH+(AL)

(AH)←0

即将AH寄存器的内容乘以10并加上AL寄存器的内容,结果送回AL,同时将零送AH。以上操作实质上是将AX寄存器中非压缩型BCD码转换成为真正的二进制数,并存放在AL寄存器中。

执行AAD指令以后,将根据AL中的结果影响状态标志位SF、ZF和PF,但其余几个状态标志位如AF、CF和OF的值则不确定。

AAD指令的用法与其它非压缩型BCD码调整指令(如AAA、AAS、AAM)有所不同。AAD指令不是在除法之后,而是在除法之前进行调整,然后用DIV指令进行除法,所得之商还需用AAM指令进行调整,方可得到正确的非压缩型BCD码的结果。

例如想要进行以下十进制除法运算:73÷2=?可先将被除数和除数以非压缩型BCD码的形式分别存放在AX和BL寄存器中,被除数的十位在AH,个位在AL,除数在BL。先用AAD指令对AX中的被除数进行调整,之后进行除法运算,并对商进行再调整。可编程序段如下:

MOV  AX,0703H ;(AH)=07H,(AL)=03H

MOV  BL,02H     ;(BL)=02H

AAD                ;(AL)=49H(即十进制数73)

DIV   BL           ;(AL)=24H(商),(AH)=01H(余数)

AAM               ;(AH)=03H,(AL)=06H

已知73÷2=36…1。以上几条指令执行的结果为,在AX中得到非压缩型BCD码的商,但余数被丢失。如果需要保留余数,则应在DIV指令之后,用AAM指令调整之前,将余数暂存到一个寄存器。如果有必要,还应设法对余数也进行调整。

转载于:https://my.oschina.net/iwuyang/blog/198627

BCD码指令 AAA DAA AAS DAS AAM AAD相关推荐

  1. 博客摘录「 BCD码指令 AAA DAA AAS DAS AAM AAD」2023年4月7日

    可见,AAS指令将影响状态标志位AF和CF,但SF.ZF.PF和OF状态标志位不确定.    例如想要进行两位十进制数的减法运算:13-4=?,可先将被减数和减数以非压缩型BCD码的形式分别存放在AH ...

  2. 微型计算机及原理怎么进制的,微型计算机原理及应用课件bcd码运算肥的十进制.ppt...

    微型计算机原理及应用课件bcd码运算肥的十进制 * * BCD码运算的十进制调整指令 专用于对BCD码运算的结果进行调整 包括:AAA.DAA.AAS.DAS.AAM.AAD 均为隐含寻址,隐含的操作 ...

  3. X32汇编AAA,AAS,AAM,AAD,DAS,DAA

    今天看了下IA-32架构手册卷二关于十进制算术指令的相关部分,现在做一下总结: 先解释以下几个概念: 1. ASCII码十进制数: 就是十进制ASCII码的十六进制表达形式. 比如说,十进制中的数字1 ...

  4. 程序填空题——压缩BCD码调整指令

    程序填空题--压缩BCD码调整指令 题目 在以BCD为首地址的字节单元中存放了3个压缩BCD码x.y.z本程序用以计算x+y-z,并将结果存放在SS字节单元中.试在程序的空格处填入适当的指令. BCD ...

  5. 汇编语言-013(DAS 、DAA与DAS、QWORD类型用SBB借位减法、编写指令将AX符号扩展到EAX,不能使用CWD、用SHR和条件判断指令将AL循环右移一位、SHLD、压缩十进制转换)

    1:DAS : SUB或SBB在AL中生成二进制结果,DAS(减法后的十进制调整)转压缩十进制格式 .386 .model flat,stdcall.stack 4096 ExitProcess PR ...

  6. x86汇编_ASCII和非压缩BCD码运算_AAA / AAS_笔记56

    虽然 CPU 用二进制运算,但是也可以执行 ASCII 十进制串的运算.使用后者进行运算,对用户而言既便于输入也便于在控制台窗口显示,因为不用进行二进制转换.尽管 ASCII 运算执行速度比二进制运算 ...

  7. 计算机中bcd的中文意思,BCD码

    同义词 bcd(Binary-Coded Decimal‎缩写)一般指BCD码 BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二 ...

  8. 内存中有两个4字节以压缩的bcd_【汇编程序】循环程序设计方法 求A和B两个4字节BCD数之和 他们在内存中以压缩BCD码形式存放...

    ;循环程序设计方法 求A和B两个4字节BCD数之和 他们在内存中以压缩BCD码形式存放 ;低字节在前 高字节在后 要求结果以同样形式存放以SUM的单元中 data segment a db 44h,3 ...

  9. 语言4位bcd码怎么加加_S7300400如何使用SCL语言调用SFC1(READ_CLK)读取日期和时间?...

    系统功能 SFC1 用于读取 CPU 的系统时钟.系统时钟存储在数据类型为DATE_AND_TIME的变量里.通过指针访问系统时钟的单个组成元素. 数据类型DATE_AND_TIME所包含的关于年.月 ...

最新文章

  1. node项目部署到服务器报错,记一次部署node项目到centos服务器经历
  2. Android - MVP个人愚见
  3. pandas 处理时间戳数据
  4. WebService入门简介教程
  5. c语言分配内存空间方法,C语言之动态分配内存空间
  6. 图片鉴黄大赛上线,请开始你的表演
  7. golang 锁的使用
  8. perl cgi session php,如何使用Perl中的CGI :: Session处理Web会话?
  9. 江苏职称计算机考试错做题,江苏省职称计算机考试word注意点.doc
  10. php foeeach页面输出,PHP数组foreach遍历输出例子详解
  11. masm5安装教程_masm5 1、下载个masm5.0(简单 联合开发网 - pudn.com
  12. php如何大批量群发微信模板消息,如何用php实现发送微信模板消息呢?
  13. android factorymode下回路测试无声音问题解析
  14. 20sccm_sccm是什么单位-简短介绍
  15. su - root 和 su root 的区别
  16. 【speach】语音信号基础
  17. ati显卡驱动的安装 linux,Fedora 18 下ATI 显卡驱动的安装
  18. Android 形状绘制 —— shape详解
  19. 百度me域名收录欠佳,站长如何应对?
  20. 《Javscript实用教程》

热门文章

  1. iPhone7黔驴技穷,Moto Z另辟蹊径,谁才能引领行业创新?
  2. java分页导出excel_报表中利用API来实现导出excel列后分页
  3. 房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文
  4. 运维人最重要的工具软件 -- VI
  5. 计算机相关书籍推荐(持续更新)
  6. 使用jsoup简单爬取微信公众号一些图片
  7. golang mysql 非阻塞_Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库...
  8. 计算机输入开机密码无法进入,电脑开机无法输入密码怎么办
  9. matlab模糊优选理论模型,模糊优选神经网络BP模型
  10. 太阳表面的重力加速度