DTOC

desc: Decimal to character

把十进制转换为字符类型,显卡显示区只能显示字符。

code segment

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
assume cs:code,ds:data,ss:stack

data segment
db 10 dup(0) ;define bytes
dw 10 ; define word
dd 12666 ;7A31_low 16bit is in the front of the address
db 10 dup(0);
data ends ;数据段
stack segment
dw 8 dup(0)
stack ends ;栈段
code segment
start:mov bx,data
mov ds,bx
mov si,0
mov bx,0
mov ax,0B800H ;0B800H 显存地址
mov es,ax
mov ax,stack
mov ss,ax
mov sp,16
call dtoc ;十进制转换为字符类型
call count ;记录有多少个字符
call transfer
call transfer_back ;将倒序字符反转
call show_str ;打印出字符
mov ax,4c00H
int 21h

dtoc

1
2
3
4
5
6
7
8
9
dtoc:
call divdw ;避免溢出除法
add cx,30H ;每个字符比数字大30H(16进制)
mov ds:[bx],cl
inc bx
add ax,dx ;dx为高16位,ax为低16位
mov cx,ax ;cx为0时则无新的余数产生
jcxz over
jmp short dtoc

divdw:
公式 X/n=(H*65536+L)/n=(H/n)*65536+(L/n)
H=int(x/65536)
L=rem(x/65536)
具体证明见汇编语言(第三版) 附注5

1
2
3
4
5
6
7
8
9
10
11
12
divdw:
mov dx,ds:[14];ds[14] high 16bit
mov ax,0;low 16bit
div word ptr ds:[10]; 商存在ax,余数存在dx.
push ax
mov ax,ds:[12]
div word ptr ds:[10];
mov cx,dx;cx the remainder
pop dx
mov ds:[12],ax
mov ds:[14],dx
ret

show_str:

1
2
3
4
5
6
7
8
9
10
show_str:
mov ch,0
mov cl,ds:[bx]
jcxz over
mov dl,ds:[bx]
mov dh,11000010b ;闪烁
mov es:[si],dx ;地址偶数位为字符,奇数位为模式
inc bx
add si,2
jmp short show_str
asm