魯明珠,趙曉華
(河北省滄州師範專科學校南校區,河北 滄州 061001)
一、引言
如果要處理乙個與數相關的問題,不管是中間的、還是最終的結果,我們都希望能直觀地在顯示器上顯示出來。數字計算機中的資料儲存方式是由「0」和「1」組成的二進位製碼串,根據不同的需要,我們往往要求資料的顯示形式不一樣,如二進位制、十進位制、十六進製制、八進位制等等,然而在組合語言中實現資料的顯示沒有類似高階語言中的輸出格式命令那麼方便,對每個數的顯示,一般都需要逐位地轉換成ascii碼才能呼叫系統顯示功能完成顯示,其中,按不同的數制要求,還要先完成數制間的轉換。下面我們來**乙個數如何程式設計讓它分別按二進位制、十進位制、十六進製制的數制形式顯示在顯示器上。
二、程式設計思路與演算法
以乙個16位二進位制機器整數為例,它的二進位制表示範圍是0至1111111111111111b;十進位制的範圍是0至65535(無符號數),或-32768至+32767(有符號數);十六進製制表示範圍是0000至ffffh。為方便說明,假設此數放在bx暫存器中,下面介紹按不同進製形式顯示的程式設計思路和演算法。
(一)按二進位制形式顯示
二進位制只有「0」和「1」兩個數字,它們的ascii碼分別是30h和31h,只要逐位判斷是「0」還是「1」,然後轉換成對應的ascii碼即可。
實際程式設計時,對於bx中的十六位二進位制數,可設定乙個迴圈次數為16的迴圈體,用向左的移位指令,通過cpu標誌暫存器中的cf標誌,由高位到低位逐位判斷、逐位取ascii碼值、逐位顯示。當然也可以先將十六個數字都轉換成乙個ascii碼串放入記憶體緩衝區後再按字串方式顯示,要注意2種方法在顯示時系統呼叫的功能號不同。
(二)按十進位制形式顯示
首先要完成二進位製到十進位制數的轉換,一般採用「除10取餘」法來完成,其大致過程如下:將待轉換的數(在bx中)除以10,得到第乙個商和餘數,此第乙個餘數就是所求的十進位制數的個位;再用第乙個商除以10,得到第二個商和餘數,此第二個餘數就是所求十進位制數的十位;……;重複這一過程直至商為0,此時的餘數就是所求十進位制數的最高位。
在記憶體中分配一緩衝區,用來存放以上分離出來的十進位制數的每一位,然後再逐個轉換成ascii碼,轉換成ascii碼的過程很簡單,就是給每個十進位制位加上30h即可;最後送顯示器輸出。從轉換的過程可以看出,先分離出來的是十進位制數的低位,要後顯示;後分離出來的是十進位制數的高位,應該先顯示。因此在程式設計時,我們可以利用堆疊操作中「先進後出、後進先出」的特性,當分離出各十進位制位時依次入棧,要逐個轉換成ascii碼,顯示時依次出棧。
(三)按十六進製制形式顯示
十六進製制與二進位制有很好的對應關係(每4位二進位制數和1位十六進製制數存在一一對應關係),顯示時只需將原二進位制數(在bx中)每4位分成一組,按組求對應的ascii碼送顯示器即可。
ascii碼與十六進製制數字的對應關係為:30h~39h對應數字0~9,41h~46h對應數字a~f,從數字9到a,其ascii碼間隔了7h,這一點在轉換時要特別注意。為使乙個十六進製制數能按高位到低位依次顯示,實際程式設計中,我們對先bx中的數每次迴圈左移一組(4位二進位制),然後遮蔽掉當前高12位,對當前餘下的4位(即1位十六進製制數)求其ascii碼,要判斷它是0~9還是a~f,是前者則加30h得對應的ascii碼,後者則要加37h才行,最後送顯示器輸出。以上步驟重複4次,就可以完成bx中數以4位十六進製制的形式顯示出來。
三、組合語言源程式例項
假設要將bx暫存器中的數分別按無符號二進位制、十進位制和十六進製制顯示在螢幕上,下面給出實現的彙編源程式,均為子程式方式,為了簡明,略去現場的保護與恢復操作。
(一)按二進位制形式
dispbxb proc near
mov cx,16
lp:rol bx,1
jc d1
mov dl,30h
jmp outp
d1:mov dl,31h
outp:mov ah,2
int 21h
loop lp
mov dl,』b』;顯示字母「b」
mov ah,2
int 21h
retdispbxb endp
設(bx)=7fffh,則輸出格式為0111111111111111b,後面的大字字母b表示二進位制形式,顯示結果固定為十六位。
(二)按十進位制形式
dispbxd proc near
mov si,10
xor cx,cx
mov ax,bx
next:mov dx,10
div si
push dx
inc cx
cmp ax,0;商為0則完成轉換
jnz next
outp:pop dx
add dl,30h
mov ah,2
int 21h
loop outp
retdispbxd endp
此程式在轉換和顯示時的迴圈控制方式和二進位制形式的例子不一樣,即顯示結果的位數是不固定的。若(bx)=7fffh=32767,則顯示結果為5位:32767;若(bx)=00ffh=255,則顯示結果為3位:255,與十進位制的有效位數相同。
(三)按十六進製制形式
dispbxh proc near
mov cl,4
mov ch,4
next:rol bx, cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl outp
add al,07h;是a~f,要多加7
outp:mov dl,al
mov ah,02h
int 21h
dec ch
cmp ch,0
ja next
mov dl,』h』;顯示字母「h」
mov ah,2
int 21h
retdispbxh endp
此程式的顯示格式固定為4位,最後加上字母「h」表示為十六進製制形式。設(bx)=7fffh,則顯示結果為:7fffh;若(bx)=00ffh,則顯示結果為:00ffh。
四、對有符號數顯示的擴充套件應用
cmp bx,0
jge zs
mov dl,』-』
mov ah,2
int 21h
zs:call dispbxd
五、結語
以上介紹了在組合語言程式設計中,根據不同的需要,如何把機器數按不同數制形式顯示出來的方法,對於不具體介紹的八進位制形式,只需將十進位制顯示的子程式(dispbxd)中的除數由10改為8即可。各種方法中,主要是資料轉換的方法不同,顯示的功能呼叫指令是一樣的,當然還可以用其他(比如字串方式)方法呼叫顯示功能,這裡不再詳細介紹。
【參考文獻】
[1]沈美明,溫冬嬋.ibm-pc組合語言程式設計[m].北京:清華大學出版社,1991.
b halt 彙編 arm常用幾個組合語言的程式
一。從一數到十 count equ 0x30003100 定義變數 count 的基位址 area example1,code,readonl y 宣告 段 example1 為唯讀entry 標識程式入口 code32宣告位 arm指令 start ldr r1,count 將0x30003100...
組合語言中的常數
1,數值常數 二進位制數 10110100b 八進位制數146q,5430 十進位制數146d,543 十六進製制數 1a2fh,0ff00h 實數12.48e 2,1a3c0000r 彙編時,則有匯程式設計序將所有的數值常數都轉換成二進位制標示的目標 凡是以字母a f開頭的十六進製制數,唏噓在前面...
組合語言中PTR的含義
組合語言中ptr的含義 mov ax,bx 是把bx暫存器 裡 的值賦予ax,由於二者都是word型,所以沒有必要加 word mov ax,word ptr bx 是把記憶體位址等於 bx暫存器的值 的地方所存放的資料,賦予ax。由於只是給出乙個記憶體位址,不知道希望賦予ax的,是byte還是wo...