8085 微处理器中的 DAA 指令


让我们假设我们要添加两个十进制数 38 和 45。它们将用 BCD 表示为 0011 1000 和 0100 0101。相加的结果是 0111 1101。但是,如果我们将此结果解释为 BCD 数,则答案将不正确。结果不仅不正确,而且是非法的,因为我们作为答案的最后一个半字节获得的 1101 不是有效的 BCD 数。在这种情况下,我们可以使用 DAA 来获得 BCD 和作为结果。所有需要做的就是将 BCD 数相加并将结果存储在 A 中,然后执行 DAA 指令。

以下是计算的详细说明:

  38 ---> 0011 1000
+ 45 ---> 0100 0101
----     ---------
  83     0111 1101
         ---- ----
            7    D

DAA 指令的工作原理取决于 AL 寄存器、Cy 和 AC 标志的内容。实际上,它将 00H、06H、60H 或 66H 添加到累加器中,以便在累加器中获得正确的 BCD 答案。因此,以下是针对前面示例的补救措施:

  38 ---> 0011 1000
+ 45 ---> 0100 0101
----      ---------        1
  83      0111 1101           0111 1101
          ---- ----              + 0110 (06H)
             7    D           ---------
                              1000 0011 ---> 83 (Decimal sum)

所有相关规则的总结如下:

  • 如果 A 中的低位十六进制数字 <= 9 且 AC 标志为 0,则低位十六进制数字的值不会改变。

  • 如果低位十六进制数字 > 9,或者如果 AC 标志设置为 1,则它将 6 加到 A 的低位十六进制数字。如果产生进位,则如果此加法导致向高位数字位置进位,则它会递增高位十六进制数字。在此过程中,如果高位十六进制数字从 F 递增到 0,则 Cy 标志将设置为 1。

  • 如果高位十六进制数字 <= 9 且 Cy 标志为 0,则高位十六进制数字不会改变,并且 Cy 标志重置为 0。

  • 如果高位十六进制数字 > 9,或者如果 Cy 标志设置为 1,则它将 6 加到 A 的高位十六进制数字并将 Cy 标志设置为 1。

请注意,对于十进制减法,不能使用 DAA 指令。由于 Intel 8085 指令集中没有十进制减法,因此需要执行一系列指令来执行十进制减法。

让我们考虑一些例子:

示例 1

地址十六进制代码助记符注释
2000
3E
MVI A, 38H
A ← 38H
2001
38


操作数为 38H
2002
06
MVI B, 45H
B ← 45H
2003
45


操作数为 45H
2004
80
ADD B
A ← A + B; A ← 38H + 45H; A ← 7DH
2005
27
DAA
A ← 83H(十进制和),S = 1,Z = 0,Ac = 1,P = 0,Cy = 0 累加器内容增加了 06H。由于 Cy=0,因此解释的结果为十进制的 83

示例 2

地址十六进制代码助记符注释
2000
3E
MVI A, 38H
A ← 38H
2001
38


操作数为 38H
2002
06
MVI B, 41H
B ← 41H
2003
41


操作数为 41H
2004
80
ADD B
A ← A + B; A ← 38H + 41H; A ← 79H
2005
27
DAA
A ← 79H(十进制和),S = 0,Z = 0,Ac = 0,P = 0,Cy = 0 累加器内容增加了 00H。由于 Cy = 0,因此解释的结果为十进制的 79

示例 3

地址十六进制代码助记符注释
2000
3E
MVI A, 83H
A ← 83H
2001
83


操作数为 83H
2002
06
MVI B, 54H
B ← 54H
2003
54


操作数为 54H
2004
80
ADD B
A ← A + B; A ← 83H + 54H; A ← D7H
2005
27
DAA
A ← 37H(十进制和),S=0,Z=0,Ac=0,P=0,Cy=1 累加器内容增加了 60H。由于 Cy=1,因此解释的结果为十进制的 137

示例 4

地址十六进制代码助记符注释
2000
3E
MVI A, 88H
A ← 88H
2001
88


操作数为 88H
2002
06
MVI B, 44H
B ← 44H
2003
44


操作数为 44H
2004
80
ADD B
A ← A + B; A ← 88H + 44H; A ← CCH
2005
27
DAA
A ← 32H(十进制和),S=0,Z=0,Ac=0,P=0,Cy=1 累加器内容增加了 66H。由于 Cy=1,因此解释的结果为十进制的 132

此指令 **DAA** 执行的时序图如下:

**总结:**因此,此指令 **DAA** 需要 1 字节、1 个机器周期(操作码提取)和 4 个 T 状态才能执行,如时序图所示。

更新于:2019 年 7 月 30 日

19K+ 次浏览

开启您的 职业生涯

完成课程获得认证

开始学习
广告