摘要:把從鍵盤輸入的二進制、八進制、十進制、十六進制字符數據轉換成計算機能夠識別的二進制數據,給出了各種進制通用的輸入、轉換方法及匯編語言程序段,通過字符串本身可以判斷數制。
關鍵詞:匯編語言 轉換 數制 通用輸入方法
中圖分類號:TP313 文獻標識碼: B 文章編號:1002-2422(2008)01-0059-02
1 編程思路
1.1輸入數值字符串
利用DOS系統功能的10號調用,把需要的數值從鍵盤輸入,此時輸入的是字符串。在利用10號調用時,要注意緩沖區BUF的設定,其格式為:
BUF DB 18
DB ?
DB 18 DUP(0)
1.2判斷數制
字符串輸入后,先判斷輸入數據的進制。通過緩沖區中回車符前面的字符來判斷。這個字符只能是字符串“0123456789BbOoQqHh”中的一個,否則輸入的數據錯誤,程序結束。此字符若為“B”或“b”則是二進制數;若為“O”、“o”、“Q”、“q”中的任一字符,則是八進制;若為“D”、“d”或“0”~“9”之間的任一字符,則是十進制數;若為“H”或“h”則是十六進制數。
1.3字符數據轉換為數值數據
需要把字符串中的每個字符數據轉換為其對應的數值數據。對于二、八、十進制數,只要將其減去30H即可;對于十六進制,因“A”~“F”或“a”~“f”表示數值10-15,若字符在“0”~“9”之間,則減去30H;若在“A”~“F”之間,則減去37H;若在“a”~“f”,之間,則減去57H。
1.4數值數字轉換成二進制數
把得到的數值數字d1d2……dn通過每種數制的基數轉換成二進制數。d1d2……dn可用如下公式計算得到二進制形式:
(…(d1*基數+d2)*基數+…)*基數+dn二、八、十、十六進制的基數分別為2、8、10、16。例如十進制數3472=((3*10+4)*10+7)*10+2。
二、八、十進制的數字符號均在0-9之間,可用同一轉換子程序con-vert實現,只要改變一些傳遞的參數即可。十六進制有“A”~“F”、“a”~“f”數字字符,情況特殊,單獨用一個子程序coil-vert16轉換。
2 匯編語言源程序實例
;num1:不同數制的基數
;low:基數的最小數字符號
;high:基數的最大數字符號
init macro num1,low,high
dee bur+1
mov num,num 1
moY cl,low
moY eh,high
endm
data segment
bur
db 18
db?
db 18 dup(0)
str db‘0123456789BbOoQqDdHh’
count equ S-sir
nuln
dw?
loopnum db?
data
ends
stack segment stack
db 100 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,aX
lea dx,buf
mov ah.10
int 21h
mov si,offset buf+2
mov bl,buf+1
mov bh,0
mov a1,-1[bx+si]
mov cx,connt
lea si,str
;判斷輸入的數據是否是所需進制
lop0: cmp al,[si]
jz lab1
inc si
lcop lop0
jmp exit
lab1: cmp al,‘m’
jnz lab2
init 2,‘0’,‘1’
call convert
jmp exit
lab2: cmp a1,‘b’
jnz lab3
init 2,‘0’,‘1’
call convert
jmp exit
lab3: cmp al,‘0’
jnz lab4
init 8,‘0’,‘7’
call convert
jmp exit
lab4: cmp al,‘0’
jnz lab5
init 8,‘0’,‘7’
call convert
jmp exit
lab5: cmp al,‘Q’
jnz lab6
init 8, ‘0’,‘7’
call convert
jmp exit
lab6: cmp al,‘q’
jnz lab7
init 8,‘0’,‘7’
call convert
jmp exit
lab7: cmp al,‘H’
jnz lab8
call convert16
jmp exit
lab8: cmp al,‘h’
jnz lab9
cell convert16
jmp exit
lab9: cmp al,‘0’
jnz lab10
init 10,‘0’,‘9’
call convert
jmp exit
lab10:cmp al,‘d’
jnz lab11
init 10,‘0’,‘9’
call convert
jmp exit
lab11:inc buf+1
init 10,‘0’,‘9’
call conyelt
jmp exit
;二、八、十進制轉換子程序
convert proc
mov si.offset buf+2
mov al,buf+1
mov lcopnurn,al
nov ax,0
mov dx,0
lop10:mul num
jc
exit;
mov bl,[si]
cmp bl,cl
jb exit
cmp b1,ch
ja exit
sub bl,30h
mov bh,0
add ax,bx
inc si
dec lcopnum
jnz lop10
ret
convert endp
;十六進制轉換子程序
convertl6 proc near
mov si.offset buf+2
dec buf+1
mov cl,lbuf+1
mov ax,0
mov dx,0
mov num,16
lop16:mul num
jc exit;
mov bl,[si]
cmp bl,‘0’
jb exit
cmp bl,‘9’
ja con1
sub bl,30h
jmp con3
conl: cmp bl,‘A’
jb exit
cmp bl,‘F’
ja con2
Bub bl,37h
jmp con3
con2: cmp bl,‘a’
jb exit
cmp bl,‘f’
ja exit
sub bl,57h
con3: mov bh,0
add ax,bx
inc si
dec cl
jnz lop16
ret
convert16 endp
exit: mov ah,4ch
int 21h
code
ends
end start
3 結束語
在輸入的所有字符中,程序均支持大小寫。例如可以輸入:101010001011B、6520、28594、6dB4h,分別表示二、八、十、十六進制數。程序經過匯編、連接后,形成可執行文件,也可以稍加修改成為一個子程序。