<p>assume cs:code ,ss:stack, ds:data
data segment
dd 123,12666,1,8,3,38
dw 11 dup(0)
data ends
stack segment
dw 16 dup(0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,33
mov si,0
mov di,31
call dtoc ;转换并存入内存指定位置
W1: call show_str ;显示
mov ax,4c00h
int 21h
dtoc: mov cx,6 ;共有6个数据
w0: push cx ;外层循环,每次对一个数据进行操作
mov ax,[si] ;读数据
add si,2
mov dx,[si]
add si,2 ;si 指向下一个数据
s0: call divdw
mov ds:[26],ax ;保护被除数低16位
push cx ; 余数入栈(从低位到高位顺序入栈)
mov ax,ds:[24]
inc ax ;这个内存单元用来记录入栈次数即数值长度
mov ds:[24],ax
mov ax,ds:[26]
inc cx ;
or cx,ax ;商和余数同时为零,即此数据被分解完毕
loop s0 ;余数为零,代表这个数已经按从低到高入栈完毕
mov cx,ds:[24] ;数值长度给cx用于循环次数
mov word ptr ds:[24],0
pop ax ;数据个个位倒序出栈
mov [di],al
inc di
dec cx ;每串数都以零开头,所以第一个数(0)不加30h,同时cx减少一次循环
s1: pop ax
add al,30h ;每位改成ASICII码
mov [di],al
inc di
loop s1
pop cx
loop w0
mov byte ptr [di],0 ; 因为每组数字都以零开头,补个零结尾,这样要显示的数字实际开始位置为,ds:[32]
ret
divdw: push bx
push ax ;除法子程序(ax被除数低16位 dx被除数高16位 cx余数)
mov cx,10
mov ax,dx
mov dx,0
div cx ;高16位作除法
mov bx,ax ;ax高16位的商,dx余数
pop ax
div cx ;低16位作除法
mov cx,dx
mov dx,bx
pop bx
ret
show_str: mov ax,0b800h ;显示字符串
mov es,ax
mov ax,0
mov al,8 ;显示位置,第九行
mov cl,2 ; 第三例
mov bx,0
mov bl,160
mul bl
mov bx,0
add bx,ax
mov ax,0
mov al,2
mul cl
add bx,ax ;bx为首字偏移值
mov ch,2 ; 颜色为绿色
mov al,ch ;颜色放al中保存
mov di,0
mov cx,6
mov si,32
w2: push cx
call show_str11
pop cx
inc si ;指向下一个字符
add di,2 ;显示二个数字之间加个空格,di必须为2的倍数
loop w2
ret
show_str11:
mov cl,[si]
mov ch,0
jcxz w3 ;cx为零时 跳到s1
mov es:[bx+di],cl
mov es:[bx+di+1],al
inc si
add di,2
jmp short show_str11
w3: ret
code ends
end start</p>