第十一篇 BCD码调整
来源:互联网 发布:旋转矩阵计算器 编辑:程序博客网 时间:2024/06/05 11:43
无论是X86汇编还是MCS-51的指令集中都会有BCD码调整指令。本博文将浅谈下BCD码调整的
相关情况。
一、BCD码是十进制数在计算机中的表现形式。
我们一直都说计算机只能表示0、1二进制,这毫无疑问是正确的。但人对十进制数较为熟悉,为
了迎合人的方便,8421BCD码用来在计算机中表示十进制数。当然了,BCD码也是用0、1二进制来表
示的。所以,需要注意理解的是,这里的计算机表示十进制数更多的是一种逻辑上的概念,但也正是这
种逻辑概念使得我们可以在指令中运用BCD码来表示十进制数,从而在在一些实际应用中会很方便。比
如在ADD、SUB等指令中。从而为我们带来方便。
二、(A)=56H,(R5)=67H。ADD A,R5, DA A。(MCS-51指令集)
DA是51中的十进制调整指令。
首先我们得解决一个问题。56H、67H是16进制数还是10进制数?
有过汇编编程经验的人都应该可以很好的理解这个问题。56H、67H到底是多少进制数不是你决定
的,也不是我决定的。它是程序员根据实际应用情景赋予的。换句话说,程序员说它是16进制它就是16
进制;说它是10进制它就是10进制。只要程序员能够理解并合理的处理即可。就像本例中的56H、67H
就是十进制数,因为DA A的存在。
三、为什么要调整?
计算机并不能理解56H、67H是8421BCD表示的十进制数,还是普通的16进制数。它都默认是二进
制运算。比如上例的56H+67H=0BDH,作为16进制加法这显然是没错的。错就错在这根本不是16进制加
法,是十进制加法。换句话说程序员将其意义改变成十进制了,计算机还是按16进制来运算,导致了结果
出错。不过,计算机可以通过简单的调整得到正确的结果。
更直观的解释可以是这样的:
8421BCD用来表示0-9,还有1010、1011、1100、1101、1110、1111这6个数字不用。十进制运
算中一旦出现了这6个数字即是出错了,需要调整。
四、辅助进位标志AF与AL低四位的区别,进位标志CF与AL高四位的区别?(X86)
AF=1是不是AL低四位就一定大于9,AF=0是不是AL低四位就一定小于9呢?CF与AL高四位也有同
样的问题。
首先来看下DAA调整指令的算法:
if(AL低四位>9 || AF=1) thenAL=AL+6;AF=1;endifif(AL高四位>9 || CF=1) thenAL=AL+60H;CF=1;endif
所以,上面的问题就可以解答了,AF=1与AL低四位与9的大小关系没有必然联系。同理,CF=1与AL高四
位与9的关系也一样。
举个例子:
1100+0100=10000,AL低四位为0,但AF=1,需要做加6调整。
五、最关键的问题。
进行BCD码调整最关键的是要理解什么需要做调整,什么时候根本不用。就像前面已经说过的一样,如果
是十进制运算那就需要,如果是十六进制就不需要。这就要看程序员所在的具体应用场合了。为什么我一直在强
调十进制与十六进制,那是因为BCD码也是表示为XXH,和十六进制一个样。我想很多人都会在这里卡壳。但有
一点,表示BCD码的XXH,其中X一定不会是A、B、C、D、E、F的。
- 第十一篇 BCD码调整
- BCD码
- bcd码
- BCD码
- BCD码
- BCD码
- BCD码
- BCD码
- BCD 码
- BCD码
- BCD码
- BCD码
- BCD码
- BCD码
- BCD码
- BCD码
- BCD码
- BCD码
- linux内核启动过程
- Dalvik虚拟机的运行过程分析
- erlang连接到mysql
- Struts通过加载插件的形式初始化系统常量以及其他信息
- 获取android应用程序信息(PackageInfo、ActivityInfo、ResolveInfo)
- 第十一篇 BCD码调整
- erlang 内存被大量占用,跟踪过程
- NSInvocation 回调使用
- linux times函数分析。
- java.lang.IllegalArgumentException: node to traverse cannot be null!
- PHP上传文件功能实现
- 基带芯片、射频芯片相关
- tomcat document
- linux内核学习1 start_kernel()