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 状态才能执行,如时序图所示。