簡介 :
需要將一個在內(nèi)存中的二進制數(shù)轉(zhuǎn)換成十進制的 ASCII 碼顯示出來
: 備注
由于該題目難度較大 , 因此分解成幾部分來完成
本節(jié)課先來實現(xiàn)將 數(shù)據(jù)段 中的數(shù)據(jù)轉(zhuǎn)換成 ascii 碼
然后將結(jié)果保存在另一段內(nèi)存中
下節(jié)課只需要來實現(xiàn)將內(nèi)存中的 ascii 碼顯示出來即可
代碼實現(xiàn) :
assume cs:code,ds:datasrc,ss:stack
; 保存源數(shù)據(jù)
datasrc segment
dw 1234, 5678, 65535, 0
datasrc ends
; 保存源數(shù)據(jù)的 ascii 碼
datadst segment
db 128 dup(0)
datadst ends
stack segment
db 128 dup(0)
stack ends
code segment
start:
; 初始化數(shù)據(jù)段寄存器
mov ax, datasrc
mov ds, ax
; 初始化目標數(shù)據(jù)段寄存器
mov ax, datadst
mov es, ax
; 初始化原 , 目標寄存器
mov si, 0
mov di, 0
; 初始化段寄存器
mov ax, stack
mov ss, ax
mov sp, 128
; 調(diào)用函數(shù)
call get_ascii
jmp finish
;===============================================================================
; 功能 : 讀取源數(shù)據(jù)段中的所有數(shù)據(jù) , 然后將其轉(zhuǎn)換成 ASCII 碼后 , 移動到 datadst 段中
get_ascii:
; 遍歷所有 dw 數(shù)據(jù)( 2 字節(jié))
mov cx, 4
each_number:
push cx
; 設(shè)置被除數(shù)
mov dx, 0 ; 高 16 位
mov ax, ds:[si] ; 從源中讀取數(shù)據(jù) , 低 16 位
; 設(shè)置除數(shù)
mov bx, 10
each_bit:
; 計算余數(shù)
div bx
; 結(jié)果 ax 為商 , dx 為余數(shù) (由于除數(shù)是 10 , 因此余數(shù)必然小于 10 , 因此 dl 中即為余數(shù))
; 現(xiàn)在將結(jié)果加上 30H (變成 ASCII 碼) 移動到 目標數(shù)據(jù)段寄存器:[偏移地址] 中
add dl, 30H
mov es:[di], dl
inc di
; 判斷商是不是 0 , 如果是 , 則說明這個數(shù)字已經(jīng)轉(zhuǎn)換完畢
mov cx, ax
jcxz next_number
; 繼續(xù)進行除法運算 , 直到 商 為 0
mov dx, 0
jmp each_bit
next_number:
; 移動源偏移地址到下一個數(shù)字
add si, 2
; 在目標偏移地址的字符串中加一個 tab 鍵
mov byte ptr es:[di], 9 ; tab 的 ascii 碼是 9
inc di
pop cx
loop each_number
ret
finish:
mov ax, 4C00H
int 21H
code ends
end start
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。