emu8086實現兩位數加法運算


題目說明:給出一個公式,例如 “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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM