匯編語言 : 子程序設(shè)計 ( 數(shù)值顯示 1 )


簡介 :

需要將一個在內(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ù)。

推薦閱讀更多精彩內(nèi)容