assume cs:code,ds:data
data segment
dw 12666,444,1,8,3,38
db 30 dup(0)
data ends
code segment
begin:
mov ax,data
mov ds,ax
mov si,0
mov bx,10
mov cx,6
mov di,16
s1:
call dtoc ;调用函数dtoc
add si,2
loop s1
mov si,16 ;为调用函数show_str前做必要参数的初始化
mov dh,2
mov dl,3
mov cl,2
call show_str ;调用函数show_str
mov ax,4c00h ;退出程序
int 21h
dtoc: ;进入函数dtoc,保存变量si,cx
push si
push cx
mov ax,ds:[si] ;将需要运算的被除数放入ax
mov si,0 ;si置0,作为压栈计数器
instack: ;数内循环,将数据进制转为10进制每位数存入一个字节单元
div bx ;除数(bx)=10
add dx,30h ;余数(dx)=(dx)+30h为10进制每位数的ascii码
push dx ;余数(dx)压栈
inc si ;用si计算压栈次数
mov dx,0
mov cx,ax
jcxz ok
jmp instack
ok:
mov cx,si ;cx计算将要出栈的次数
outstack:
pop ds:[di]
inc di
loop outstack
pop cx ;还原变量cx,si
pop si
ret ;函数dtoc返回
show_str: ;进入函数show_str
push cx
mov ax,0B800H
mov es,ax ;es为0B800h显存的段地址
mov cx,2000 ;设定循环2000次,正好完整清屏
mov al,0h
mov di,0
init: ;初始化清屏开始
mov es:[di],al
add di,2
loop init
mov al,80 ;计算应该从显存的哪一个地址开始存数据
sub dh,1
mul dh
sub dl,1
mov dh,0
add ax,dx
add ax,ax
mov di,ax
pop cx ;字体颜色存放进bl
mov bl,cl
s:
mov ch,0
mov cl,ds:[si] ;cl存放具体数据
jcxz ok1 ;如果数据为00跳出
mov es:[di],cl ;数据cl,颜色bl放进显存对应地址
mov es:[di+1],bl
inc si
add di,2
jmp s
ok1:
ret ;函数show_str返回
code ends
end begin