assume cs:code,ds:data
data segment
db 20 dup(0)
data ends
code segment
main: mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,11
mov dl,32
mov cl,24h
call show_str
mov ax,4c00h
int 21h
dtoc: push ax ;以十进制形式显示data段中的数据
push bx
push cx
push si
push dx
mov bx,0
mov dx,0
chg: mov cx,10
call divdw
jcxz j ;各个数字已全部取出
push cx
add bx,1
jmp short chg
j: mov cx,bx
s0: pop ax ;将各个数字依次出栈,并存放到内存中
add al,30h
mov [si],al
inc si
loop s0
pop dx
pop si
pop cx
pop bx
pop ax
ret
divdw: ; 参数 (ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
; 返回 (dx)=结果的高16位,(ax)=结果的低16位
; (cx)=余数
push bx
mov bx,ax
mov ax,dx
mov dx,0
div cx
push ax ;将高位产生的商入栈保存
mov ax,bx
div cx
mov cx,dx ;结果
pop dx
pop bx
ret
show_str: ;参数:(dh)=行号(取值范围0-24),(dl)=列号(取值范围0-79)
;(cl)=颜色,ds:si 指向字符串的首地址
push ax
push bx
push cx
push dx
push si
push es
push di ; 保存寄存器原始信息,防止被子程序破坏
mov ax,0 ;注意,使用前,清零。否则很有可能会影响结果
mov bx,0
mov ah,dh
mov bl,160
mul bl
add dl,dl
add al,dl
add ax,0b800h
mov es,ax ;显示字符串的屏幕起始位置
mov di,0
mov al,cl
s: mov cl,[si]
mov ch,0
jcxz ok
mov es:[di],cl
mov es:1[di],al
inc si
add di,2
jmp short s
ok: pop di ;恢复寄存器信息,并返回主程序
pop es
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end main
自己写的,就是调用了一下前面写的两个子程序,不过,感觉麻烦了,有待优化!