assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start: mov ax,12666
mov dx,0
mov bx,data
mov ds,bx
mov si,0
call dtocdw ;调用双字数据转换字符串
mov dh,8
mov dl,3
mov cl,2 ;设置输出格式
call show_str ;调用字符输出
mov ax,4c00h
int 21h
;=========================================双字数据转换字符串
dtocdw: push ax
push cx
push dx
push di
push si ;保护现场
mov di,0 ;字符串长度计数器
chance: ;转换
mov cx,0ah ;设置为以十进制转换
call divdw ;调用双字除法
add cx,30h ;转换为字符
push cx ;保存字符
inc di ;计数器加一
mov cx,ax
add cx,dx
jcxz dtocdw_ok ;判断完成
jmp chance
dtocdw_ok: mov cx,di ;设置计数器
writ: ;写入指定位置并整理格式
pop [si]
inc si
loop writ
pop si
pop di
pop dx
pop cx
pop ax ;恢复现场
ret ;返回
;==============================================双字除法
divdw: push bx ;保护现场
mov bx,ax
mov ax,dx
mov dx,0h
div cx ;被除数高位除法
push ax ;保存高位除法商
mov ax,bx ;恢复被除数低位,高位为高位除法余数
div cx ;被除数低位除法
mov cx,dx ;以CX保存余数
pop dx ;恢复商的高位
pop bx ;恢复现场
ret ;返回
;==============================================字符输出
show_str: push ax
push bx
push cx
push si
push es ;保护现场
mov ax,0b800h
mov es,ax ;定位显存
mov al,0a0h
mul dh
mov bx,ax ;设置行号
mov al,2h
mul dl ;设置列号
add bx,ax ;设置显示位置基址
mov al,cl ;设置字体属性
show: ;输出字符
mov cl,[si]
mov ch,0h
jcxz show_str_ok ;判定字符串结尾
mov es:[bx],cl
inc bx ;显示字符
inc si ;指向下一字符
mov es:[bx],al
inc bx ;设置字体属性
jmp show
show_str_ok:
pop es
pop si
pop cx
pop bx
pop ax ;恢复现场
ret ;返回
code ends
end start |