.DATA
X1 DB '1234567890123456' ; 16位的十進制被加數
X2 DB '9233445566778899' ; 16位的十進制加數
Y1 DB '00000000000000000' ; 17位的十進制加法的和(考慮最高位可能有進位產生)
.CODE
.STARTUP
LEA SI, X1
LEA DI, X2
LEA BX, Y1
ADD SI, 15 ; SI 指向被加數的最右端的個位數
ADD DI, 15 ; DI 指向加數的個位數
ADD BX, 16 ; BX 指向加法的和的個位數
MOV CX, 16 ; 循環16次
CLC ; 運算前將CF清0
PUSHF ;PSW標誌寄存器入棧保存
AGAIN:
POPF ; PSW標誌寄存器出棧,恢復CF
MOV AL, [SI] ;取被加數到AL
ADC AL, [DI] ;將加數加到AL中
AAA ;非壓縮的BCD碼(即ASCII碼)加法調整
MOV [BX], AL ; 保存加得的和
PUSHF ; PSW標誌寄存器入棧,主要是為了保存好CF標誌
AND BYTE PTR [BX], 0FH ;將這壹位加法的和的高4位清零
ADD BYTE PTR [BX], 30H ; 將這壹位加法的和調整成數字的ASCII碼
DEC SI ; 調整指針,處理下壹位
DEC DI
DEC BX
LOOP AGAIN
POPF ; 這壹小段指令處理最後的進位形成的第17位
MOV AL, 0
ADC AL, 0
ADD AL, 30H
MOV [BX], AL
.EXIT
END
程序說明:
1. 很長的整數,直接按每壹位用壹個字節的數字字符的ASCII碼存儲,16位的十進制數就是壹個由16個數字字符構成的字符串
2. 加法運算,是將每個ASCII字符看成是非壓縮的BCD碼,在AL中進行過加法運算後,用非壓縮的BCD碼調整指令將結果調整成非壓縮的BCD碼格式,加法的進位保存在CF中。運算規則完全按照手工計算的方法進行,依個位、十位、百位……的次序從右向左逐位相加,在相加時帶上上壹位的進位。程序***循環16次。
3. 為了避免指針調整和循環控制時CF被這些運算結果所修改,造成運算結果錯誤,需要用堆棧保存PSW的方法保護CF,運算結果調整好以後立即保存CF,下次運算前恢復CF。
4. 程序只考慮了運算,沒有考慮顯示。可以在調試程序中查看運算結果是否正確。若需要加上顯示功能,對數據段的定義稍加修改,用09H號DOS系統功能調用即可。