问题描述
我知道 DAW 指令在添加两个打包的 BCD 数字后会调整 WREG 中的 8 位结果,但 DAW 指令是否能够调整 WREG 中更高位的结果?
解决方法
在 ADDWF
或 SUBWF
期间,DC
(数字进位)标志在加法期间从位 3 捕获进位,而 C
(进位)标志捕获在加法过程中从第 7 位进位。减法中的进位是根据 x - y = x + NOT (y) + 1 生成的,其中 NOT 是补码。这意味着这些进位标志的值是各自借位的补码。
DAW
将 6 添加到 W
的最低有效半字节,即 W<3:0>
,如果半字节的值大于 9,或 {{1} } 已设置。DC
将 DAW
的最高位半字节加 6,即 W
,如果半字节的值大于 9,则设置 或 W<7:4>
.
如果添加两个代表 BCD 数字的半字节,则生成的半字节值在 [0x0,0x12] 中,这就是为什么需要结合两个条件来检测该半字节的十进制进位。例如,当我们将 C
添加到 0x99
时,总和为 0x99
,并且 0x32
=1 和 DC
=1,因为 0x9 + 0x9 = { {1}} 表示每个半字节都有一个进位。因为两个标志都设置了,所以后面的 C
给每个半字节加 6,结果是 0x12
,这是正确的 BCD 结果。
DAW
指令只是遵循上述规则,无法知道 0x98
寄存器和标志的内容是否实际上是两个 BCD 数字相加的结果。所以让我们假设我们添加 DAW
(不是有效的 BCD 数字)和 W
,结果是 0xee
。 0x11
和 0xff
都将为零。后面的 DC
会发现每个半字节都大于 9,每个半字节加 6,得到 C
。