首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

微機原理匯編:BCD 碼調整指令 DAA/DAS 原理解析

     編輯:程式設計疑難解答

匯編語言中 BCD(Binary-Coded Decimal)碼運算後需用 DAA(十進制加法調整)或 DAS(十進制減法調整)修正 AL 寄存器值。針對題目 73H - 27H = 4CH 經 DAS 變為 46H 的疑惑,核心在於 運算數被視為壓縮 BCD 碼而非純十六進制。

關鍵概念

  • 非壓縮 BCD:每個十進制位佔一字節,高 4 位為 0(如 7 = 07H)。
  • 壓縮 BCD:每字節存兩位十進制數(高 4 位、低 4 位各一位),如 73 = 73H。
  • DAA/DAS 專用於壓縮 BCD,根據 AL 低 4 位、AF/CF 標誌自動加 6/減 6 修正。

題目逐步演示

; 假設 AL = 73H (壓縮 BCD 代表十進制 73)
;     BL = 27H (壓縮 BCD 代表十進制 27)
SUB AL, BL      ; AL = 4CH, AF=1 (低半字節借位), CF=0
DAS             ; 十進制減法調整
; DAS 邏輯:低 4 位 > 9 或 AF=1 → AL = AL - 06H
;           高 4 位 > 9 或 CF=1 → AL = AL - 60H
; 此處 AF=1 → AL = 4CH - 06H = 46H
; 結果 46H 即壓縮 BCD 表示十進制 46 (73 - 27 = 46)

為何不是 4CH?

4CH 是二進制減法結果(十進制 76),但壓縮 BCD 中 C (1100) 非法(十進制位只能 0-9)。DAS 檢測到低半字節借位 (AF=1),自動減 6 修正為合法 BCD 碼 46H。

驗證方法

  • 十進制:73 - 27 = 46 ✓
  • 壓縮 BCD:73H - 27H --DAS--> 46H ✓
  • 純十六進制:73H - 27H = 4CH(非 BCD 語境)

實務建議

  • 現代編程極少直接用 BCD,多用整數/浮點或十進制庫。
  • 嵌入式舊系統、財務專用協議仍可能涉及 BCD 交互。
  • 調試時用調試器查看 AF、CF 標誌,單步執行 DAA/DAS 觀察 AL 變化。

理解 BCD 調整指令需建立「壓縮 BCD 表示十進制」的心智模型,而非按十六進制思維推導。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved