第十一篇 BCD码调整

第十一篇 BCD码调整

无论是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的存在。

三、为什么要调整?

计算机并不能理解什么是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) then

AL=AL+6;

AF=1;

endif

if(AL高四位>9 || CF=1) then

AL=AL+60H;

CF=1;

endif

所以,上面的问题就可以解答了,AF=1与AL低四位与9的大小关系没有必然联系。同理,CF=1与AL高四

位与9的关系也一样。

举个例子:

1100+0100=10000,AL低四位为0,但AF=1,需要做加6调整。

相关推荐

开口笑,3个窍门,想不笑都难
365彩票下载1.0.0老版本

开口笑,3个窍门,想不笑都难

1988年属什么的生肖(1988年出生的属相是什么)
365bet哪个国家的

1988年属什么的生肖(1988年出生的属相是什么)

NvidiaGeForce RTX 5060 笔记本电脑性能预览
365彩票下载1.0.0老版本

NvidiaGeForce RTX 5060 笔记本电脑性能预览

《地铁跑酷》联机方法教程
365bet哪个国家的

《地铁跑酷》联机方法教程

口袋妖怪精灵最多的版本是什么?(口袋妖怪精灵最多的游戏)
365彩票下载1.0.0老版本

口袋妖怪精灵最多的版本是什么?(口袋妖怪精灵最多的游戏)

话费查询有哪些APP推荐?让你的话费管理更加轻松!
日博365哪个是真的

话费查询有哪些APP推荐?让你的话费管理更加轻松!