;参数:| (dh)=行号 | (dl)=列号 | ds:si指向字符串的首地址 |
;——————————————————————————————————————————————————————————————
push ax
push cx
push dx
push es
push si
push di ;数据保存
mov ax,0b800h
mov es,ax ;设置es为显存段地址
mov al,160
mul dh ;每行占160字节,故用dh*160
add dl,dl ;每列占2个字节,故dl*2
mov dh,0
add ax,dx
mov di,ax ;设置di为显存偏移地址
mov ah,cl ;用ah存放颜色属性
show_str_x:
mov cl,ds:[si]
mov ch,0
jcxz show_str_f ;判断字符串是否结束(以0结尾)
mov al,cl ;用al存放要显示的字符
mov es:[di],ax ;向显存中写入内容
inc si ;si指示字符串,每次移动一个字符
add di,2 ;di指示显存位置,每次移动两个字符
jmp show_str_x
show_str_f:
pop di
pop si
pop es
pop dx
pop cx
pop ax
ret ;数据恢复,返回主程序
dtoc_word:
;———————————————word型数据转十进制字符串—————————————————
;参数:| (ax)=word型数据 | ds:si指向字符串的首地址 |
;——————————————————————————————————————————————————————
push ax
push bx
push cx
push dx
push si ;数据保存
mov bx,0 ;用bx来记录要生成的字符串长度
dtoc_word_x:
mov dx,0
mov cx,10
p cx ;对ax进行除10操作,得到其每一位数字的大小
mov cx,ax ;用cx记录每次除10得到的商
add dx,'0' ;将得到的每位数字转为其对应的ASCII码
push dx ;将得到的每个ASCII码依次入栈
inc bx ;每除一次,就有一个ASCII码对应的字符,故bx+1
jcxz dtoc_word_f ;通过判断商是否为零来确定ax是否还能被10除
jmp dtoc_word_x
dtoc_word_f:
mov cx,bx ;将字符串长度赋给cx确定循环次数
dtoc_word_x1:
pop ds:[si] ;入栈时低位先入栈,故出栈时高位先出栈,无需改变顺序
inc si
loop dtoc_word_x1
pop si
pop dx
pop cx
pop bx
pop ax
ret ;数据恢复,返回主程序
dtoc_dword:
;—————————————————————————dword型数据转十进制字符串——————————————————————————————————————
;参数:| (ax)=dword型数据低16位 | (dx)=dword型数据高16位 | ds:si指向字符串的首地址 |
;——————————————————————————————————————————————————————————————————————————————————————
push ax
push bx
push cx
push dx
push si ;数据保存
mov bx,0 ;用bx来记录字符串长度