1 assume cs:code
2 data1 segment
3 dw 123,12666,1,8,3,38
4 data1 ends
5 data segment
6 db 30 dup (0) ;该段存放转换后的字符串
7 data ends
8 code segment
9 start:mov ax,data1
10 mov es,ax
11 mov ax,data
12 mov ds,ax
13 mov si,0 ;寻址data段用
14 mov bx,0 ;寻址data1段用,现在指向第一个数123
15 mov cx,6 ;循环次数6,共6个word型数据
16
17 s:mov ax,es:[bx] ;将需要转换的数据暂存到ax中
18 push cx ;将循环次数CX暂存:入栈
19 call dtoc ;将ax中的数据转换为字符串,并存到data段中
20 pop cx ;将cx恢复
21 add bx,2 ;bx指向下一个数据
22 loop s ;(cx)=(cx)-1,循环把6个数据转换完成
23 mov byte ptr ds:[si+1],0 ;将最后一个字符串后放0,标志结束
24
25 mov dh,8
26 mov dl,3
27 mov cl,2
28 call showstr ;将字符串放到显存相关位置
29
30 mov ax,4c00h
31 int 21h
32
33 dtoc: push ax ;保护现场
34 push bx
35 push cx
36 push dx
37 mov bx,0 ;后面计数需要
38
39 dto: mov cx,ax
40 jcxz ok1 ;判断商是否为0,为0时结束转换,跳到ok1
41 mov dx,0
42 mov cx,10
43 div cx
44 add dx,30h ;dx中是余数,数字+30h转换为对应的ascll码
45 push dx ;将每一个数字的ascll码入栈
46 inc bx ;记录转换数字的位数
47 jmp short dto ;循环把一个数据全转换完成
48
49
50 ok1:mov cx,bx ;将循环次数赋给cx
51 s1:pop dx ;出栈一位数字的ascll码
52 mov ds:[si],dl ;将该位数字的8位的ascll码放入data段中
53 inc si ;si+1,准备传送下一个数字的ascll码
54 loop s1 ;将该数据的各个位的ascll码都传到data段中
55 mov al,20h
56 mov ds:[si],al ;在每个数据后面放一个空格的ascll码,以分开各个数据
57 inc si ;将si+1,否则下一个数据进入data段时,会把空格的ascll码覆盖
58
59
60 pop dx
61 pop cx
62 pop bx
63 pop ax
64 ret ;返回s,继续下一个数据的ascll码转换
65
66 showstr:push ax
67 push bx
68 push cx
69 push di
70 push si
71 push es
72 mov ax,data
73 mov ds,ax
74 mov si,0
75 mov ax,0b800h
76 mov es,ax
77
78
79 mov si,0
80 mov al,160
81 mul dh
82 mov bx,ax
83 mov dh,0
84 mov al,2
85 mul dl
86 add bx,ax
87
88
89 mov ah,cl
90 str:mov cl,ds:[si]
91 mov ch,0
92 jcxz ok2
93 mov ch,ah
94 mov es:[bx+di],cx
95 inc si
96 add di,2
97 jmp short str
98 ok2:pop es
99 pop si
100 pop di
101 pop cx
102 pop bx
103 pop ax
104 ret
105 code ends
106 end start