assume cs:code
data segment
db 10 dup (0)
data ends
stack segment
db 16 dup(0)
stack 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 cx
push si
push bx
push dx
push ds
mov dx,0
mov bx,0
div_cur:
mov cx,0Ah
call divdw ;调用解决溢出的除法
jcxz s ;余数=0,跳出
add cx,30H ;将余数转换成ASCII码
push cx
inc bx
jmp short div_cur
s:
mov cx,bx
s1:
pop ax
mov byte ptr ds:[si],al
inc si
loop s1
ok1:
pop ds
pop dx
pop bx
pop si
pop cx
ret
divdw:
push bx
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax ;将商的高位临时放到bx中
pop ax
div cx ;上一步div的余数(在dx中)做高位,连同ax中的数据(低位)一起做被除数
mov cx,dx ;将余数给cx
mov dx,bx
pop bx
ret
show_str:
push dx
push cx
push si
push es
push di
push ax
mov ax,0B800H
mov es,ax
mov ch,0
;计算dh*160,保存(dh*160)到di中
mov ax,0A0H
mul dh
mov di,ax
;计算2dl-1,保存(dh*160)+(2*dl-1)到di中,得到字符写入显存的偏移地址di
mov ax,2
mul dl
add di,ax
mov al,cl
next_zf:
mov cl,[si]
jcxz ok
;写入字符
mov byte ptr es:[di],cl
;写入颜色
mov byte ptr es:[di+1],al
add di,2
inc si
jmp short next_zf
ok:
pop ax
pop di
pop es
pop si
pop cx
pop dx
ret
code ends
end start |