数值显示

;--------------------------------------------------------------------------------------
; 功能:
;  将word型数据转变为表示十进制的字符串,字符串以0位结尾符
;--------------------------------------------------------------------------------------

assume cs:code, ds:data

data segment
 db 10 dup(0)
data ends

code segment
 start: 
   mov ax, 12666d
   
   mov bx, data
   mov ds, bx
   mov si, 0
   
   call dtoc   ;实现将word型整数转化为ASCII字符串

   mov dh, 8     ;初始化打印位置
   mov dl, 3
   mov cl, 0fah  ;打印属性
   
   call show_str ;开始打印
   
   mov ax, 4c00h
   int 21h
   
 dtoc: 
   push dx
   push cx
   push bx
   push ax
   push si
   
   mov bx, 0  ;bx记录 该数 有多少位 用于循环多少次 将 栈中每位的ASCII码存放到指定内存中
   
  s1: 
   mov cx, 10d     ;d表示十进制
   mov dx, 0
   
   div cx
   mov cx, ax  ;得到的商赋值给cx, 用于jcxz判断是否为0
   
   jcxz s2     ;当商为0跳到s2
   
   add dx, 30h  ;余数+30h = 该余数的ASCII码
   push dx
   
   inc bx
   
   jmp short s1
   
  s2: 
   add dx, 30h  ;当商为0的时候,余数为个位
   push dx
   
   inc bx
   
   mov cx, bx  ;bx记录了有多少位
   mov si, 0
   
  s3: ;实现将栈中的数据依次出栈放到指定内存中   
   pop ax
   
   mov [si], al
   inc si
   
   loop s3
   
  ok_dtoc:
   pop si
   pop ax
   pop bx
   pop cx
   pop dx
 
   ret
   
 show_str:
   push dx
   push cx
   push bx
   push ax
   push si
   
   mov al, 0A0h ;160个字节==0A0h
   
   dec dh ;dh=dh-1   7=8-1
   mul dh ;(n-1)*0A0h  7*160=字节
   
   mov bx, ax ;偏移位置【7行】
   
   mov al, 2 ;每个字符占两个字节
   mul dl ;(ax)=(al)*(dl) = 2*3=6
   sub ax, 2 ;(ax)=(ax)-2 = 6-2 = 4
   
   add bx, ax ; 7行+4
   
   mov ax, 0B800h ;显存开始地址
   mov es, ax
   
   mov di, 0
   mov al, cl 
   mov ch, 0
   
  s: 
   mov cl, ds:[si]
   jcxz ok_show_str
   
   mov es:[bx+di], cl ;字符
   mov es:[bx+di+1], al ;颜色属性
   
   inc si
   
   add di, 2 ;一个字节存放字符 另一个字节存放属性
   jmp short s
   
  ok_show_str: 
   pop si
   pop ax
   pop bx
   pop cx
   pop dx
   
   ret
code ends
end start


原文地址:https://www.cnblogs.com/qintangtao/p/2860727.html