王爽彙編語言實驗10.3

;*********************************************
;編程:將data段中的數據以十進制的形式顯示出來
;*********************************************

assume cs:code, ds:data

data segment
db 10 dup(0) ;data段用於存放每位的ascII碼
data ends

code segment
start:
mov ax, 12666
mov bx, data ;
mov ds, bx ;
mov si, 0 ;將數據段的段地址存入ds,偏移地址存入si
call dtoc ;跳到子程序dtoc運行:將十進制轉爲字符串形式
mov dh, 8 ;
mov dl, 3 ;
mov cl, 2 ;設定顯示參數:在第8行第3列顯示,顏色爲2
call show_str ;跳到子程序show_str運行,講字符串顯示出來
mov ax, 4c00H
int 21H

;***************************************
;將word型數據轉爲十進制數字字符串的子程序
;***************************************
dtoc:
push ax
push si
push dx
push cx
push bx ;將在主程序中運用到的寄存器全部在棧中緩存
mov bx, 0

s0:
mov cx, 10d ;將10作爲除數,用12666出10,可以依次得出每一位
mov dx, 0 ;清空dx內存,用於存放每一位對應的ascii碼
dic cx
mov cx, ax ;16位除法,ax中保存着商,將商放到cx中,判斷商是否是0,是0則說明已經得出每一位
jcxz s1 ;cx爲0,則跳轉到s1
add dx, 30H ;dx中存有餘數(即每一位),add 30H,即將數字轉爲對應字符
push dx ;將對應字符的ascii保存到棧中
inc bx ;記錄下全部的位數,以保證每一位都可以出棧
jmp s0

s1:
add dx, 30H
push dx
inc bx ;跳出s0後,還有一位餘數未入棧,故需入棧,並且bx++
mov cx, bx ;將餘數的個數賦給cx,以便可以用loop確定出棧個數
mov si, 0

s2:
pop ax ;將每位字符對應的ascii碼出棧,放入ax中,注意:ax中高位是00,低位纔是對應的ascii碼
mov ds:[si], al ;將每位字符對應的ascii碼放入data段,以便隨後輸入顯存
inc si
loop s2

pop bx
pop cx
pop dx
pop si
pop ax ;將主程序保存的寄存器中的值全部出棧
ret ;返回主程序

;*********************************************************************************
;顯示字符串子程序
;若想顯示字符,需將字符寫入顯存中(B8000H - B8FFFH)
;字符寫入顯存是,每個字符佔2個字節,低位存字符的ascii碼,高位存放字符顯示屬性
;80*25模式下,每行可顯示80個字符(這樣看來,一行佔160字節),一頁可以顯示25行,顯示緩衝區有8頁
;*********************************************************************************
show_str
push bx
push cx
push si ;緩存主程序的寄存器值
mov al, 0a0H ;即160,用於計算偏移位置,以保證字符在顯示器在指定行列顯示
dec dh ;dh–
mul dh ;8位乘法,al*dh,結果存放在ax中
mov bx, ax ;bx中即(dh-1)*160
mov al, 2
mul dl ;8位乘法,al*dl,結果存放在ax中
sub ax, 2 ;ax中即: dl*2-2
add bx, ax ;得到偏移地址: bx=(dh-1)*160 + dl*2-2
mov ax, 0B800H ;B800H即顯示緩衝區的段地址
mov es, ax ;es中保持顯示緩衝區的段地址
mov di, 0
mov ch, 0
mov al, cl ;將cx設爲00__H,cl若爲0,則停止輸入顯存,跳回主程序

s:
mov cl, ds:[si]
jcxz next ;若cx=0,則跳到next處執行:判斷最後一個字符是否是0,是0則跳回主程序
mov es:[bx+di], cl ;將字符串放到偶地址
mov es:[bx+di+1], al;將顏色等屬性放到奇地址
add di, 2 ;移動到下一個字符的顯示緩衝區
inc si ;移動到data段中的下一個字符
jmp short s

next:
pop si
pop cx
pop bx
ret

code ends
end start

發佈了23 篇原創文章 · 獲贊 22 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章