assume cs:code,ds:data
data segment
db 16 dup (0)
data ends
code segment
start:
mov ax,3000
mov dx,20000
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,4 ;行号
mov dl,4 ;列号
mov cl,07h ;背景色
call show_str
mov ax,4c00h
int 21h
;子程序描述
;名称:dtoc
;功能:将dword型数据转换为表示为十进制数的字符串,字符串以0为结尾符
;参数:(ax)=dword型数据低16位
; (dx)=dword型数据高16位
; ds:si指向字符串的首地址
;返回:无
dtoc:
push ax
push dx
push cx
push si
push bx
mov bx,0 ;记录字符串数量
dtoc_1:
mov cx,ax
or cx,dx ;判断dword数据是否为0
jcxz dtoc_2
mov cx,10
call divdw ;进行dword除法
add cx,30H ;对字符加30H,转换为字符
inc bx
push cx ;对转换后的字符压栈
jmp short dtoc_1
dtoc_2:
mov cx,bx ;判断字符数量是否为0,防止出现初始数字为0栈溢出的情况
jcxz dtoc_ok
dtoc_3:
pop bx ;字符出栈
mov ds:[si],bl
inc si
dec cx
jcxz dtoc_ok
jmp short dtoc_3
dtoc_ok:
mov byte ptr ds:[si],0
pop bx
pop si
pop cx
pop dx
pop ax
ret
;子程序描述
;名称:divdw
;功能:进行不产生溢出的除法运算,被除数dword型,除数word型,结果为dword型
;参数:(ax)=被除数低16位,(dx)=被除数高16位,(cx)=除数
;返回:(ax)=结果的低16位,(dx)=结果的高16位,(cx)=余数
divdw:
push bx
push ax
;div操作时,dx存高16位,ax存低16位,除法后,ax存储商,dx存储余数
mov ax,dx ;设置被除数的高16位0,低16位为dx中的值,实现H/N
mov dx,0
div cx ;计算int(H/N)*65536
mov bx,ax ;保存int(H/N)到bx,将rem(H/N)保存至dx
pop ax ;出栈ax(即L),准备计算[rem(H/N)*65536+L]/N
div cx ;除法后,ax保存为商
mov cx,dx ;将除法余数保存至cx中
mov dx,bx ;将int(H/N)保存至dx
pop bx
ret
;子程序描述
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0-24),(dl)=列号(取值范围0-79)
; (cl)=颜色,ds:si指向字符串的首地址
;返回:无
show_str:
push ax
push bx
push es
push di
push cx
push si
mov ax,0B800h
mov es,ax
;计算160X+2Y,X行号,Y列号
mov al,0a0h
mul dh
mov bx,ax
mov al,2
mul dl
add bx,ax ;bx存放显存开始位置
mov di,0
mov al,cl
mov ch,0 ;高8位为0
show_str_dis:
mov cl,ds:[si] ;判断是否到了字符结束
jcxz show_str_ok
mov es:[bx+di],cl
mov es:[bx+di+1],al
inc si
add di,2
jmp short show_str_dis
show_str_ok:
pop si
pop cx
pop di
pop es
pop bx
pop ax
ret
code ends
end start
王爽《汇编语言》显示字符串、除法溢出、数值显示程序
最新推荐文章于 2020-12-01 21:24:32 发布