DA指令通俗理解

发布时间 2023-12-21 19:38:47作者: ihuahua1415

DA指令通俗理解

最近在学微机的过程中,学到DA指令时对其底层实现感兴趣,但是搜集了网上的资料并没有讲的很清楚易懂的,遂有此文章,来分享一些我对这个指令的理解。

1.DA指令的作用

DA A这条指令书上叫做BCD加法调整指令,说人话就是因为单片机的加法指令是二进制的运算,如当01H+09H时如果我们想要将其当作十进制运算,其应该得到是10H,但是实际上给我们返回的是0AH,因此我们需要对其进行一些调整修正,也因此就有了DA指令,这条指令一般只用在我们想要单片机进行十进制运算的时候,在其他场景下使用没有啥意义,而且容易出错。

2.DA指令的底层运算原理/逻辑

2.1 DA指令使用条件

在讲解DA指令的底层运算逻辑之前,首先我先将其的使用条件总结一下放在下面

1.使用时必须紧跟在ADD/ADDC后面,没有其他的使用场景,DA指令就只是个十进制调整指令,注意这一点。

2.DA A,这是其的唯一用法,只能对累加器A使用,其他的都不行。

3.DA指令使用时,其前面的两个加数都必须是BCD码,即必须是0~9,不能是A~F,不然也不行。

4.减数没有调整指令,只有加数有,因此如果想要进行减数的十进制运算,需要通过加法来实现,后面会举例子。

5.注意,BCD码只是用二进制表示十进制的一种表示形式,与其值没有关系,如十进数67,其BCD码形式就为67H

2.2 DA指令底层修正逻辑

DA指令的修正逻辑其实挺好理解的,因为其只有0~9,没有A~F,因此我们需要在其显示出A~F时,让其转化掉,这也就有了下面的修正方法。

其修正有借助PSW标志位中的CY(进位标志)AC(辅助进位标志)的状态,这也就是为啥DA指令要紧跟在ADD/ADDC的后面的原因

1.若低4位大于9或(AC)=1,则低4位加6

2.若高4位大于9或(CY)=1,则高4位加6

3.若以上两条同时发生,或高4位虽等于9但低4位修正后有进位,则应加66H修正

上面就是其最基本也是全部的运算逻辑,下面几张图片是STC15官方文档里截出来的,有一些上面没有提到的但是可以稍微注意一下的点

image-20231221192359236

DA指令操作的伪代码可以看下面这张图

image-20231221192443004

2.3 关于CYAC的一些说明

CYAC在运算时若有相应的进位,则会置1,否则会清0,这又再次说明了为啥DA指令要在ADD/ADDC后面使用,因为其要结合CYAC来进行转换~~!

3.DA指令的使用举例

  • 十进制加法举例
ORG 0000H
MOV A, #56H
ADD A, #38H
DA  A
MOV 22H, A
SJMP $
END
  • 十进制减法举例

实现如下,假设够减:

​ (20H)- (21H) -> (22H)

ORG 0000H
CLR  C
MOV  A, #9AH    ;减数的补数为100-减数
SUBB A, 21H
ADD  A, 20H     ;被减数与减数的补数相加
DA   A
MOV  22H, A
SJMP $
END