21,458
社区成员
发帖
与我相关
我的任务
分享
;将数据12666以十进制的形式在屏幕的8行列,用绿色显示出来。显示时调用子程序show_str。
;转换方法:用12666除以10,循环5次,记下每次的余数,即12666每一位的值;将每次的余数分别加30H,就得到了表示十进制数的ASCII字符串。
;dtoc功能:将word型数据转变为表示十进制数的字符串,字符串以0为结束符。参数:(ax)=word型数据 ds:si指向字符串的首地址 返回:无
assume cs:code,ds:data
data segment
dw 6 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:
mov bx,10
mov ss,ds
mov sp,0BH
s1: div bx
mov cx,ax
add dx,30H
push dx
jcxz done
loop s1
done:
ret
show_str: ;显示字符串的子程序定义开始
;子程序的功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。参数:(dh)=行号(取值范围0-24)
;(dl)=列号(取值范围0-79),(cl)=颜色,ds:si指向字符串的首地址,返回:无
push cx
push si
mov al,0A0h ;先计算行地址,一行占160字节(80*2)
dec dh ;行号在显存中下标从0开始,所以减1
mul dh ;ax=460h
mov bx,ax ;行地址存在bx中
mov al,2 ;后计算列地址,字符和颜色共两个字节
mul dl ;ax=6,计算列地址
sub ax,2 ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2,列地址已计算好
add bx,ax ;此时bx中存放的是行与列号的偏移地址
mov ax,0b800h
mov es,ax ;es中存放的是显存的第0页(共0--7页)的起始的段地址
mov di,0 ;di是一行中的列(字符)的偏移
mov al,cl ;al暂存颜色
mov ch,0
s: mov cl,ds:[si] ;cl暂时存放字符
jcxz ok
mov es:[bx+di],cl ;偶地址存放字符
mov es:[bx+di+1],al ;奇地址存放字符的颜色属性
inc si
add di,2 ;字符和颜色共两个字节
jmp short s
ok: pop si ;输出字符串完成,出栈并返回
pop cx
ret ;显示字符串的子程序定义结束
code ends
end start