1. 程式人生 > >十進位制轉化為二進位制與十六進位制顯示(彙編程式)

十進位制轉化為二進位制與十六進位制顯示(彙編程式)

stacks segment
stack dw 200h dup(0);不太明白要200h這麼大
stacks ends
data segment
in_buf db 6;定義輸入字串最大長度
in_len db ?;輸入字串實際長度
dec_buf db 6 dup(30h),'='
bin_buf db 16 dup(30h),'B='
hex_buf db 4 dup(30h),'H'
crlf db 0dh,0ah,'$'
;注意這兒定義資料是放在一塊兒的,就不需要把二進位制和十六進位制的字串分別再設定結束符
mes_1 db 'please input a number(0~65535):$'
mes_2 db 'input invalid,exit!',0dh,0ah,'$'
data ends
code segment
	assume cs:code,ds:data,ss:stacks
main:
mov ax,data
mov ds,ax
call input
mov bx,offset dec_buf
add bl,in_len
mov byte ptr [bx],'D';注意!這兒一定要覆蓋住原字串的最後一個回車符
;否則,輸出時,那個回車符會使前面的字元被覆蓋
call str2bin;首先判斷輸入的合法性並轉化為數值
jc exit_no
call bin2str;將十進位制轉化為二進位制
call hex2str;將十進位制轉化為十六進位制
mov dx,offset crlf
call out_str
mov dx,offset dec_buf
call out_str
mov ah,4ch
int 21h

exit_no:;輸入不合法時的提示
mov dx,offset crlf
call out_str
mov dx,offset mes_2
call out_str
ret

input:;功能:從鍵盤輸入字串
mov dx,offset mes_1
mov ah,9
int 21h
mov dx,offset in_buf
mov ah,10
int 21h
ret

str2bin:;功能:判斷輸入的十進位制是否合法
;若合法則把十進位制的ASCII碼轉化成數值形式
sub ax,ax;ax用來存放十進位制的最終數值
mov si,10;si用來做乘數
sub ch,ch
mov cl,in_len;輸入串的實際長度設定為迴圈次數
mov di,offset dec_buf;di指向串實際開始的位置
loop_10:
mov bl,[di]
cmp bl,39h;若大於字元9,不合法
ja quit_n
cmp bl,30h;若小於字元0,不合法
jb quit_n
sub bh,bh;避免bh裡面有雜資料,清零
sub bl,30h
mul si;ax*10
jc quit_n
add ax,bx;(ax*10)+bx
jc quit_n
inc di
loop loop_10;cx不為零,繼續迴圈
clc;沒有跳轉到quit_n,則表示合法,設定cf=0
ret
quit_n:
stc;表明輸入的十進位制不合法,設定cf=1
ret

bin2str:;功能:將十進位制轉化為二進位制
push ax;ax儲存的是十進位制的數值
;因為之後還要用到去轉化為十六進位制,所以先push進堆疊暫存
mov cx,16;設定需要迴圈的次數
mov bx,offset bin_buf
loop_20:
shl ax,1
jnc next_20;如果該位為零
inc byte ptr [bx]
next_20:
inc bx
loop loop_20
pop ax
ret

hex2str:;功能:將十進位制轉化為十六進位制
mov bx,ax
mov si,offset hex_buf
mov ch,4
loop_30:
mov cl,4
rol bx,cl;當移動次數大於1時,必須用cl代替
mov al,bl;從高到低提取四位二進位制數送入al
and al,0fh
add al,30h;al=0~9,加30h轉化為ascii碼
cmp al,3ah
jl next_30
add al,7;al>9,加37h轉化為ascii碼
next_30:
mov [si],al
inc si
dec ch
jnz loop_30;注意,這兒只能用dec運算對標誌位的設定來判斷迴圈與否
;因為cl被用來存放位移數了
ret

out_str:;用於輸出的子程式
mov ah,9
int 21h
ret

code ends
end main
 

執行結果如圖: