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 狀態才能執行,如時序圖所示。
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP