題目說明:從鍵盤上輸入任意兩個不大於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、
