assume cs:code
date segment
db 20h dup(0)
date ends
stack segment
db 20 dup(0)
stack ends
code segment
start:mov ax,1266
mov bx,date
mov es,bx
mov si,0
mov bx,stack
mov ss,bx
mov sp,20h
call dtoc
mov dx,es
mov ds,dx
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
;显示字符 子程序
;在屏幕上 第8行(dh),3列(dl) 开始显示字符,颜色为(cl),数据来源来ds段中
show_str:push dx
push sp
push bx
push cx
push es
push si
;每行占0a0h个字节 25行80列 计算好偏移存至bp中
mov ah,0
mov al,0a0h
mul dh
mov bp,ax
mov ah,0
mov al,2
mul dl
add bp,ax
mov ax,0b800h ;显存基址
mov es,ax
mov bx,0
mov si,0
mov ah,cl ;颜色
mov ch,0
s:mov cl,[bx];
jcxz ok ;if(cx == 0)jcxz ok
mov al,cl
mov es:[si + bp],ax
add bx,1 ;+1 、+2 加的都是字节数
add si,2
jmp near ptr s
ok:pop si
pop es
pop cx
pop bx
pop sp
pop dx
ret
divdw:nop ;子程序实现除法功能
nop ;被除数ax(低位1000) dx(高位1) 表示11000h 除数bx 表示1
nop ;返回:ax存低位商,dx存放高位商,cx存余数
push es
push ds
mov ds,ax
mov es,dx
mov ax,dx
sub dx,dx
div bx
mov es,ax ;临时结果高位商:es
mov ax,ds
div bx
mov cx,dx ;余数
mov dx,es ;最终返回的高位商
pop ds
pop es
ret ;返回 商ax,dx, 余数cx
dtoc:nop ;将ax中的数据转化成十进制字符,存至数据段中。将数据存储在es段中。
;参数来自己ax,下次再实现参数来自己内存
push cx
push dx
push bx
push si
mov si,0
mov bx,0ah
dc:mov cx,ax
jcxz near ptr dhh
call divdw
add cx,30h
push cx
inc si
jmp near ptr dc
dhh:mov cx,si
mov bx,0
dh3:nop
;pop word ptr es:[bx]
pop ax
mov es:[bx],al
add bx,1
loop dh3
pop si
pop bx
pop dx
pop cx
ret
code ends
end start