assume cs:code,ds:data
data segment
db 10 dup (0)
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0 ;data字符串首地址为ds:si
mov ax,12666
call dtoc
mov dh,8 ;行号为8(0~24)
mov dl,3 ;列号为3(0~79)
mov cl,2 ;绿色 (绿字00000010b; 绿底红字:00100100b; 白底蓝字:01110001b)
call show_str
mov ax,4c00H
int 21h
;数值显示
;功能: 将word型数据转变为十进制的字符串,字符串以0为结尾符。
;参数: (ax)=word型数据; ds:si指向字符串首地址
;返回: 无
dtoc:
push cx
push bx
push dx
push ax
push di
push si
mov di,0 ;di记录位数
d: mov cx,10
mov dx,0 ;初始化divdw的参数
call divdw ;(ax)=int,(cx)=rem
inc di ;位数++
add cx,30h ;余数+30h转为ASCII码串
push cx ;将各位对应的ASCII码串倒序入栈
mov cx,ax
jcxz ok1 ;商为0则结束
jmp short d
ok1: mov cx,di
s: pop ax ;循环di次,顺序出栈
mov [si],al
inc si
loop s
mov byte ptr [si],0 ;字符串结尾补0
pop si
pop di
pop ax
pop dx
pop bx
pop cx
ret
;显示字符串
;功能: 在指定位置用指定颜色显示一个用0结束的字符串
;参数: (dh)=行号(0~24),(dl)=列号(0~79),(cl)=颜色,ds:si指向字符串首地址
;返回: 无
show_str:
push ax
push es
push di
push cx
mov ax,0B800H
mov es,ax ;显示位置为es:di
mov al,160 ;di=160*(dh-1)+2*(dl-1)=160*dh+2*dl-162
mul dh
mov di,ax
mov al,2
mul dl
add di,ax
sub di,162 ;根据公式得到di
show: mov cl,[si]
mov ch,0
jcxz ok ;判断字符是否为0
mov al,[si]
mov es:[di],al ;写入字符
inc si
inc di
pop cx
mov byte ptr es:[di],cl ;写入字符属性(颜色)
push cx
inc di
jmp short show
ok: pop cx
pop di
pop es
pop ax
ret
;解决除法溢出的问题
;功能: 进行不会溢出的除法运算,被除数dword型,除数word型,结果dword型
;参数: (dx)=被除数高16位,(ax)=被除数低16位,(cx)=除数
;返回: (dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
divdw:
push bx
push bp
mov bx,dx ;bx暂存高16位
mov bp,ax ;bp暂存低16位
mov dx,0
mov ax,bx
div cx
push ax ;(ax)=int(H/N),(dx)=rem(H/N)
mov ax,bp
div cx
mov cx,dx ;rem(X/N)
pop dx ;将int(H/N)给dx
pop bp
pop bx
ret
code ends
end start