摘 要:在用匯編語言編程時, 將結果數(shù)據(jù)按不同的數(shù)制形式顯示出來是一個難點。計算機中的機器數(shù)是按二進制形式進行處理和存儲的,如何將它們進行轉換,分別按二進制、十進制和十六進制等形式顯示在顯示器上,文章給出了具體的實現(xiàn)方法。
關鍵詞:匯編語言 二進制 十進制 十六進制 顯示
引言
數(shù)字計算機中的數(shù)據(jù)存儲方式是由“0”和“1”組成的二進制碼串,根據(jù)不同的需要,我們往往要求數(shù)據(jù)的顯示形式不一樣,如二進制、十進制、十六進制、八進制等等。在高級程序設計語言中,最后的處理結果都能在顯示器上顯示出來。然而,匯編語言卻沒有相應的輸出命令,而是需要使用DOS功能調用。對每個數(shù)的顯示,一般都需要逐位地轉換成ASCII碼,再使用DOS功能調用完成在顯示器上的顯示。使用DOS系統(tǒng)功能調用的一般步驟為:把調用號放入AH中,設置入口參數(shù),然后執(zhí)行INT 21H指令,最后分析處理出口參數(shù)。下面我們探討一下如何將計算機中的數(shù)據(jù)轉換成所需要的進制并在顯示器上顯示。
一、編程思路與算法
假設在BX寄存器中,存放了一個無符號整數(shù),要求將該數(shù)以十進制的形式在屏幕上顯示。
1.編程思路:
在內存中分配一緩沖區(qū)。用來存放十進制的每一位。在計算機中所有的數(shù)都是以二進制的形式存放的。首先要完成二進制到十進制的轉換,再將每一位轉換成ASCII碼。一般采用“除10取余”法。第一步:將待轉換的數(shù)除以10,得到第一個商和余數(shù),再在該余數(shù)上加上30H將該余數(shù)轉換成ASCII碼,此數(shù)就是所求的十進制數(shù)的個位;第二步:用剛才的第一個商除以10,得到第二個商和余數(shù),再在該余數(shù)上加上30H將該余數(shù)轉換成ASCII碼,此第二個余數(shù)就是所求的十進制數(shù)的十位;……重復這一過程直到商為0。最后送顯示器輸出即可。該題中我們采用DOS系統(tǒng)功能調用的9號功能調用來顯示輸出字符串,入口參數(shù)DS:DX置字符串首址,字符串以‘S’結束。
2.程序實現(xiàn):
Stack segment stack ‘stack’
Dw 32 dup(?)
Stack ends
Data segment
OBUF DB 6 DUP(?)
Data ends
Code segment
Start proc far
Assume ss:stack,cs:code,ds:data
Mov ax,data
Mov ds,ax
MOV SI.,OFFSETOBUF+5
MOV BYTE PTR[SI],‘S’; OBUF的最后一位置“S”
DEC SI
MOV CX,10
MOV AX,BX
AGAIN: MOV DX,0; 無符號數(shù)擴展
DIV CX
ADD DL,30H
MOV[SI],DL
DEC SI
CMP AX,0
JNZ AGAIN
INC SI
MOV DX,SI; 首地址送DX
MOV AH,9
INT 21H; 顯示器輸出字符串
Ret
Start endp
Code ends
End start
以上介紹了在匯編語言程序設計中,如何將數(shù)按十進制的形式顯示出來的方法。當然,也可以以不同的進制輸出。例:二進制輸出,只需要對二進制的每一位加上30H,再輸出即可。按十六進制輸出時,顯示時只需將原二進制數(shù)每4位分成一組,按組求對應的ASCII碼送顯示器即可。ASCII碼與十六進制數(shù)字的對應關系為:30H—39H對應數(shù)字0—9,41H—46H對應數(shù)字A—F,從數(shù)字9到A,ASCII碼間隔了7H,這一點在轉換時要特別注意。實際編程中,我們對先BX中的數(shù)每次循環(huán)左移一組(4位二進制),然后屏蔽掉當前高12位,對當前余下的4位(即1位十六進制數(shù))求其ASCII碼,要判斷它是0—9還是A—F,是前者則加30H得對應的ASCII碼,后者則要加37H才行。以上步驟重復4次,最后送顯示器輸出,就可以完成BX中數(shù)以4位十六進制的形式顯示出來。
結語
以上介紹了在匯編語言程序設計中,根據(jù)不同的需要,如何把機器數(shù)按不同數(shù)制形式顯示出來的方法。各種方法中,主要是數(shù)據(jù)轉換的方法不同,顯示的功能調用指令是一樣的,當然還可以用其他(比如2號功能調用)方法調用顯示功能,這里不再詳細介紹。
參考文獻:
[1]沈美明,溫冬嬋.IBM-PC匯編語言程序設計[M].北京:清華大學出版社,1991.