;--------------------------------------------------------------------------------------
; 功能:
; 将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