;子程序描述
;名称:dtoc
;功能:将word型数据转变为表示十进制数的字符串,字符串以0位结尾符。
;参数:(ax)= word型数据
; ds:si指向字符串的首地址
;返回:无
;应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。
;在显示时我们调用本次实验中的第一个子程序show_str
;----------思路:-------------------------------------------
;已知:数据在ax中,要求转化为字符存储在ds:si中
;步骤:ax循环做除法,余数+30h入栈,直至商零,个数的记录用di
;出栈到ds:si中以零作尾。
;----------END 思路----------------------------------------
;名称:dtoc
;功能:将word型数据转变为表示十进制数的字符串,字符串以0位结尾符。
;参数:(ax)= word型数据
; ds:si指向字符串的首地址
;返回:无
;应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。
;在显示时我们调用本次实验中的第一个子程序show_str
;----------思路:-------------------------------------------
;已知:数据在ax中,要求转化为字符存储在ds:si中
;步骤:ax循环做除法,余数+30h入栈,直至商零,个数的记录用di
;出栈到ds:si中以零作尾。
;----------END 思路----------------------------------------
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 ax;子程序中使用的寄存器入栈
push bx
push cx
push dx
push di
push si
mov di,0;计数器,记录余数的个数
mov bx,10;除数
mov dx,0
s1: div bx
inc di
add dx,30H;余数+30H转化为ASCII码
push dx
mov cx,ax
jcxz yes;商为零则跳转到yes
mov dx,0;dx置零,为下次除法做准备
jmp short s1
yes: mov cx,di
p: pop ds:[si]
inc si
loop p
;由于show_str的需要,ds:di处的字符串以零作尾。
;mov byte ptr ds:[si],0这条语句有无皆可,因为最后一次入栈的时候高8位
;一定是零
pop si;子程序中使用的寄存器出栈
pop di
pop dx
pop cx
pop bx
pop ax
ret
show_str:
push ax;子程序中使用的寄存器入栈
push cx
push dx
push ds
push es
push si
push di
mov al,160;计算行号和列号对应的显存地址
mov ah,0;不要忽略了
dec dh
mul dh
dec dl
add dl,dl
mov dh,0;不要忽略了
add ax,dx
mov di,ax
mov dl,cl;由于下面的jcxz指令要用到cx,所以用dl保存cl的值
mov ax,0b800h
mov es,ax
s: mov al,ds:[si]
mov cl,al
mov ch,0
jcxz ok
mov es:[di],al
mov es:[di+1],dl;颜色属性被保存在dl中
inc si
add di,2
jmp short s
ok: pop di;子程序中使用的寄存器出栈
pop si
pop es
pop ds
pop dx
pop cx
pop ax
ret
code ends
end start