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+ 次瀏覽

開啟您的 職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.