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 cx
push dx
push si
;-------------------------------------
input:
mov dx,0 ;这一句必须在input段内
mov bx,10
div bx ;dx和ax被修改,dx非零
mov cx,ax
add dx,30h ;dx作为余数,加了30
mov [si],dx
jcxz over
inc si ;这一行不能提前到jcxz,si最终为0004h
jmp short input
;----------------------
over:
pop si
pop dx
pop cx
pop bx
ret
;-----------------------------这样的写法的最终结果是66621,倒过来的,正过来的话就用栈就行了
show_str:
push ax
push bx
push cx
push dx
push es
push si
push di
;------------------------------------------
mov ax,0b800h
mov es,ax
;之前最大的问题在于我没有被bx清零这里弄好,导致先把行字节存入之后,有把bx清零了,然后就显示不出来
mov al,0a0h
mul dh
mov bx,ax ;行字节
mov dh,0
add dx,dx
mov di,dx ;列字节
mov dl,cl
mov ch,0
;------------------------------------------
show:
;------------
mov cl,[si] ;cx内为字符或为字符最后的0
jcxz ok ;若cx不为0则顺序执行,为0则跳转到ok标记
;------------
mov es:[di+bx],cl
inc di
mov es:[di+bx],dl
inc di
inc si ;si代表data内的字符位置,在打印过程中不应当清零,每次增一字节,第一次存字符,第二次存属性
jmp short show ;循环打字
;-----------
ok:
pop di
pop si
pop es
pop dx
pop cx
pop bx
pop ax
ret ;当cl从[si]取得0时就代表字符串打完了
;-------------------------------------
code ends
end start