|
主题 : : 10-3显示12666,偶都注释好了,请高手给点意思 [已解决] |
回复[ 4次 ]
点击[ 516次 ] | |
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23 |
;把12666,ds段中的数值以十进制,绿色显示在屏幕第8行第3列的位置
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
dw 12666
dw 8 dup(0)
datasg ends
stacksg segment
dd 4 dup(0)
stacksg ends
codesg segment
start:
mov ax,datasg
mov ds,ax ;关联ds
mov ax,stacksg
mov ss,ax
mov sp,16 ;关取ss
mov di,0 ;ds中的读写数指针
call dtoc ;调用dtoc把数据改成字符的子函数,保存在堆栈段里
mov dh,8 ;屏幕显示行号
mov dl,3 ;屏幕显示列号
mov cl,2 ;屏幕显示颜色
call show_str ;调用show_str以要求显示转换后堆栈段中的字符
mov ax,4c00h ;结束程序中断参数
int 21h ;结束
dtoc: mov ax,[di] ;ax保存要显示的数值
pop [di+2] ;数值转换字符函数,把主函数中的ip出栈到ds:[di+2]保存起来
mov bx,10 ;用X/10取余数的方法从低位到高位求出每一位,bx放除数
mov [di+4],dx ;把dx,输入位置相关的dh,dl保存在ds:[di+4]中
mov [di+6],cx ;把cx相关的显示颜色保存在ds:[di+6]中
agin: sub dx,dx ;除数16位,所以被除数要是32位,把被除数高16位置0
div bx
mov cx,dx ;把余数传到cx里
jcxz myout ;余数是0,说明这个数除净了,跳转到 myout
add dx,30h ;把余数+30h,余数对应的字符传给dx
push dx ;dx进栈
loop agin ;cx不等于0进入下一次循环
myout: mov dx,[di+4] ;被除数除净了,把用过的dx,cx还原
mov cx,[di+6]
push [di+2] ;把调用子程序时的ip入栈
ret ;ip出栈,子程序返回
show_str: pop [di+2] ;主函数中ip保存在ds:[di+2]的位置
mov ax,0b800h
mov es,ax ;设置es为彩显区
mov bx,cx
mov cx,5 ;有5个字符,循环5次
mov ax,160 ;每一行的字节数
mul dh ;要显示的行一共要空多少个字节
add ax,6 ;要显示的列是3,再加6个字节
mov si,ax ;把显示位置传给si
next: pop ax ;要显示的从高到低位字符出栈
mov es:[si],al ;把要显示的字符传到要显示的位置
inc si
mov es:[si],bl ;设置要显示的参数,绿色
inc si
loop next ;下一个字符的循环
push [di+2] ;主函数ip入栈
ret ;主函数ip出栈
codesg ends
end start | | |