王爽汇编语言实验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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章