題目說明:給出一個公式,例如 “35 + 28 = ”,輸出計算結果
一、准備材料
DOS功能調用表:https://blog.csdn.net/mybelief321/article/details/13168071
emu8086軟件:https://emu8086-microprocessor-emulator.en.softonic.com/
ASCII碼參考表:http://ascii.911cha.com/
二、asm代碼
其中的注釋詳細解釋了每一步代碼的含義
在輸入公式時,數字必須為兩位,例如:01 + 01 =
加號、等於號兩側都需要加空格(雙元運算符書寫慣例)
data segment question db "97 + 56 = $" result db 0,0,0,"$" data ends code segment start: mov ax, data mov ds, ax ;將data放入ax lea dx, question mov ah, 09h int 21h ;調用DOS 09H功能:顯示以$結尾的字符串 xor ax,ax ;ax歸0 mov al, question + 1 ;第一個數的個位存入al mov bl, question ;第一個數的十位存入bl mov cl, question + 6 ;第二個數的個位存入cl mov dl, question + 5 ;第二個數的十位存入dl sub al, 30H sub cl, 30H sub bl, 30H sub dl, 30H ;ASCII轉碼 clc ;清空進位標志CF add al, cl ;兩數個位相加 aaa ;使用非壓縮BCD碼相加指令,結果存儲在AX mov byte ptr result+2,al ;將最終結果的個位存入result的個位 mov al, bl adc al, dl ;檢查CF進位標志,進行帶進位加法 aaa mov byte ptr result+1,al ;將最終結果的十位存入result的十位 lea dx, result jc hundred ;如果CF位為1,則說明十位加法后產生了百位,則轉至處理三位數的hundred流程 add byte ptr result+1,30h add byte ptr result+2,30h ;轉ASCII用於打印 inc dx jmp display ;顯示最終結果 hundred: mov byte ptr result, 31h ;若產生百位,則必定為1 add byte ptr result+1, 30h add byte ptr result+2, 30h ;個位和十位轉為ASCII display: mov ah, 9 int 21h mov ax, 4c00h ;結束,返回值為AL:0 int 21h ends end start