十進位制轉化為二進位制與十六進位制顯示(彙編程式)
阿新 • • 發佈:2019-02-18
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
執行結果如圖: