子程序描述
名称:dtoc
功能:将word型数据转变为表示十进制数的字符串
参数:(ax)=word型数据
ds:si指向字符串的首地址
应用举例:将数据12666以十进制形式在屏幕的8行3列,用绿色显示出来。
分析: 要得到字符串“12666”,就是要得到一列表示该字符的ascii吗,31h,32h,36h,36h,36h.
十进制数码字符对应的ascii=十进制数码值+30h
看我最开始写的一段代码,是有问题的,不能逆序输出,输出的是66621
dtoc: push ax push bx push cx push dx push si mov bx,10 s: mov dx,0 div bx;ax存放商,dx余数 add dl,30h ;dh 没用 mov ds:[si],dl inc si mov cx,ax jcxz dtoc_ok jmp short s dtoc_ok: pop si pop dx pop cx pop bx pop ax ret
怎么才能逆序输出呢?没有什么好的办法,把结果一个一个保存到栈中,注意栈是以字为操作单位的,而且,为了正确的循环,我们还有统计余数的个数。
assume cs:code data segment
db 16 dup(0) data ends code segment start: mov ax,12666 mov bx,data mov ds,bx mov si,0 call dtoc mov dh,8 mov dl,3 mov cl,2 call show_str mov ah,4c int 21h dtoc: push bx push cx push ax push si push bx mov bx,0 s1: mov cx,10d mov dx,0 div cx ;dx余,ax商 mov cx,ax jcxz s2 add dx,30h push dx inc bx ;bx是统计余数的个数 jmp s1 s2: add dx,30h ;s2很重要,不能忽略 push dx inc bx ;再进行一次栈操作(补充当"商为零而余数不为零"时的情况) mov cx,bx mov si,0 s3: pop ax mov [si],al inc si loop s3 ok: pop bx pop si pop ax pop cx pop dx ret ;数值显示的子程序定义结束 show_str: push ax push bx push cx push dx push es ;bx=160*(lines-1) sub dh,1 mov al,160 mul dh mov bx,ax ;ax=lie*2-2 mov al,2 mul dl sub ax,2 add bx,ax ; 偏移地址存在bx中了 mov ax,0b800h mov es,ax mov dl,cl ;dl存放字符颜色属性 mov ch,0 s_show_str: mov cl,ds:[si] mov es:[bx],cl jcxz ok_show_str mov es:[bx+1],dl inc si add bx,2 jmp short s_show_str ok_show_str: pop es pop dx pop cx pop bx pop ax ret code ends end start
可以用下面的代码简化:
mov di,0 ;di计数 mov bx,10 s:mov dx,0 div bx ;dx 余 ax 商 mov cx,ax add dx,30h push dx inc di jcxz s1 jmp short s s1: mov cx,di s2: pop ax mov ds:[si],al; inc si loop s2