8086彙編,輸入16進位數轉換為10進位數輸出程式
使用8086彙編,輸入一個16進位的數,程式把該16進位數轉換為相應的10進位數輸出
程式運行截圖:
要實現這樣一個程式,思路可以是這樣的:
1.由於我們讀入的鍵盤輸入是ASCII碼表示的,且輸入一個字元便得到一個ASCII碼,如輸入ab,程式中可以得到61h和62h。現在的問題是怎麼把這些輸入的字元表示成一個完整的數。對於這個問題,我們可以把每次輸入的字元的ASCII碼先轉換為對應的數,0-9之間的數,根據ASCII碼表發現可以用 ASCII碼減30h 得到0-9對應的十六進位數值,對於a-b,用ASCII碼減57h 得到a-b對應的十六進位數值。
2.得到這些對應的數值之後,要把它們按輸入順序組合起來,這裡可以用移位運算來組合,如根據輸入轉換得 1、2兩個十六進位數值,1的二進位表示為0001,2的二進位表示為0010,把0001左移4位得到00010000,加上0010,得到0001010,00010010表示的便是12h。
3.把輸入轉換為數值之後就準備要輸出了,可採用除10法得到各個位上的數,如要輸出110,先要把110轉為 1、1、0 再把對應的數值加上30h轉為ASCII碼後輸出,把110轉換為 1、1、0,110除以10商為11,餘數為0,此時餘數作為個位上的數,得到個位為0;再用上一步的商11作為被除數除以10,得到商為10,餘數為1,此時餘數作為十位上的數,得到十位為1;重覆上述步驟,商1作為被除數除以10,商0餘1,得到百位為1,此時商等於0,演算法結束。
DATAS SEGMENT bin dw 10 dup(?) ;存放二進位結果 buf db 5 dup(?) ;存放十進位數 各個數位上的數值 如100,存放為 1,0,0 msg1 db 'please input a hex number',13,10,'$' msg2 db 'the dec number:',13,10,'$' crlf db 13,10,'$' ;回車換行 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX mov bx,0 ;初始化bx LEA dx,msg1 ;輸出提示字元串 mov ah,9 int 21h input: mov ah,1 ;輸入一個字元 int 21h sub al,30h ;把al中的ascii碼轉換成數值 jl init cmp al,10 ;輸入的數在0-9之間跳轉 jl toBin sub al,27h ;再轉換為a-f cmp al,0ah ;輸入的字元比a小 jl init ;結束輸入 cmp al,10h ;輸入的字元比f大 jge init ;結束輸入 toBin: ;轉換為二進位,把輸入組合成意義上的數值 mov cl,4 shl bx,cl ;bx左移4位 mov ah,0 add bx,ax ;把輸入後並從ascii碼轉換來的值與bx相加 mov bin,bx ;轉換成二進位數後存到記憶體bin jmp input ;繼續輸入 init: ;初始化,準備轉換 mov ax,bin mov bx,10 mov si,4 ;迴圈四次,最大到萬位 toDec: ;轉為各個數位上的數值,如100轉換為1,0,0 百位為1... mov dx,0 div bx ;除10法得到各個位上的數值 mov [buf+si],dl ;餘數為該位上的值,第一次迴圈為個位,第二次為十位...;存到記憶體中 dec si cmp ax,0 ;商是否為0,為0演算法結束 ja toDec lea dx,crlf ;顯示提示 mov ah,9 int 21h lea dx,msg2 mov ah,9 int 21h output: ;輸出記憶體中存放的各個數位上的數值 inc si mov dl,[buf+si] add dl,30h ;轉為ascii mov ah,2 int 21h cmp si,4 jb output mov ah,1 int 21h MOV AH,4CH INT 21H CODES ENDS END START
參考:百度文庫