首先我们知道要显示12666,我们拿到这个整形数字了,要把他转换成字符串”12666”然而字符串的存储方式是ascii码,分别为31h,32h,36h,36h,36h一个字要显示,需要两个字节的属性,所以一共是10个字节。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
assume cs:code

data segment
db 10 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 ax,4c00h
int 21h

dtoc:push bx
push ax
putchar:div 10//余数存在dx中,为6
mov bl,30
add bl,dl
//得到了ascii码
mov ds:[si],bl//把字符放进数据段
mov ch,0
mov cl,al
jxcz ok//如果商为0了,那么就结束了
//如果还有字符
inc si
mov dx,0//清零方便下一次存余数
jmp short putchar
ok:pop ax
pop bx
ret

show_str:push dx
push cx
push si

//算偏移量找到显示位置
mov ax,B800h#先找到每个字符对应的偏移地址!这是段地址,每行160字节
mov es,ax//偏移地址存起来因为ax做乘法
mov ax,0
mov al,160
mul dh//结果存在ax中
mov bx,ax
mov ax,0
mov al,2
mul dl
add bx,ax//算出总偏移量

mov di,0
mov ax,0
mov al,cl//把字符属性移到al
mov ch,0
show:mov cl,ds:[si]//把字符移过来
jcxz ok
//如果不是最后一位
mov es:[bx+di+0],cl
mov es:[bx+di+1],al
add di,2
inc si
jmp short show//省了一个cx循环的。

ok:pop si
pop cx
pop dx
ret

code ends
end start

这里的show_str就是之前我们写过的显示函数,我们本次主要编写的是转换ascii的函数。