汇编将数据以十进制格式显示在屏幕上

   子程序描述

名称: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
     
原文地址:https://www.cnblogs.com/youxin/p/2530837.html