emu8086實現兩位數乘法運算


 

題目說明:從鍵盤上輸入任意兩個不大於2位數的正實數,計算其乘積,結果在屏幕上顯示

 

一、准備材料

DOS功能調用表:https://blog.csdn.net/mybelief321/article/details/13168071

emu8086軟件:https://emu8086-microprocessor-emulator.en.softonic.com/

ASCII碼參考表:http://ascii.911cha.com/

 

二、asm代碼

其中的注釋詳細解釋了每一步代碼的含義

由於算法本身的原因,輸入的數字必須是兩位數,例如:23,05,01,03,99……

data segment
    num1 db "Enter Number 1: $"
    num2 db "Enter Number 2: $"
    resultstring  db "Num1 * Num2 = Result: $"
    result db 0,0,0,0,"$"
ends

code segment
start:
    mov ax, data
    mov ds, ax
    ;將data數據放入data段
               
    lea dx, num1
    ;將num1的有效地址放入dx
    mov ah, 09h
    ;調用DOS的09H號功能,顯示字符串,用來顯示“Enter Number 1: ”
    int 21h        
    ;調用DOS
        
    mov ah, 01h
    ;調用DOS的01H號功能:鍵盤輸入並回顯。AL存入輸入的字符
    int 21h
    ;調用DOS
    sub al, 30h
    ;減去30的原因:鍵盤鍵入“1”時,獲得1的ASCII碼為31,因此減去31,得到真實的數字1, 0~9同理
    mov bl, al
    ;將輸入的十位上的數字放入bl
    
    mov al, 0ah
    mul bl
    ;十位上的數字×10 放入ax
    mov bl, al
    ;由於個位數× 0ah 得到的數字總是小於等於兩位的,所以AH必定為00H
    
    mov ah, 1h
    int 21h  
    sub al,30h
    ;獲得個位上的數字
    add bl, al
    ;個位上的數字 + 十位上的數字×10 = Number 1
    ;此時bl 存入輸入的第一個數字的真實大小
    
    mov ah,2
    mov dl,0ah 
    ;調用DOS的02H號功能:顯示輸出。此時顯示的是DL的內容:ASCII(10)為LF 換行
    int 21h
    ;調用DOS
    mov dl,0dh
    ;此時DL為ASCII(15)為CR 回車
    int 21h
    ;調用DOS
    
    
    ;以下為重復輸入數字的過程,不再贅述
    lea dx, num2
    mov ah, 9
    int 21h 
    
    mov ah, 1h
    int 21h
    sub al, 30h
    mov dl, al 
    
    mov al, 0ah
    mul dl
    mov dl, al
    
    mov ah, 1h
    int 21h  
    sub al,30h
    add dl, al 
    ;此時dl內存入了Number 2 的真實大小
    
    mov al, bl
    mul dl
    ;此時ax內存入了兩數乘積結果(Hex)
    
    mov bx, 0ah
    mov cx, 4
    mov si, 3
    ;si為什么等於3:從第3、2、1、0位開始處理result字段,將每一位結果分別存入個、十、百、千位上
    ; si: 0,  0,  0,  0, "$"
    ;     千   百  十   個
    ;位置  0,  1,  2,  3
    
getresult:
    mov dx, 0000h
    ;將dx清空,用以以下步驟:
    div bx
    ;ax中的乘積 ÷ 0ah , 商得數會在ax刷新 余數保存在dl
    ;因此dl中現在保存了第si位的數字
    add dl, 030h
    ;轉換為ASCII碼,顯示出字符類型的數字
    mov byte ptr result+si, dl
    sub si, 1
    ;si-=1,下一循環處理低一位的數字
    loop getresult
    
;接下來輸出提示語:Num1 × Num2 = ……
    mov ah,2
    mov dl,0ah   ;輸出換行
    int 21h
    mov dl,0dh   ;輸出回車
    int 21h
    lea dx, resultstring
    mov ah, 9
    int 21h
    lea dx, result

display:
    mov ah, 9
    int 21h   
    
    mov ah, 4ch
    mov al, 00h
    ;DOS 4CH號功能:帶返回值結束程序,返回值為AL
    int 21h
ends

end start 

 

三、技巧分享

1、程序捕獲到的鍵盤輸入,是按鍵所代表的ASCII 碼,並非其字符本身,例如數字“1”的ASCII 碼為31

2、

3、

4、

5、

 


免責聲明!

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



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