汇编 光标轨迹程序求救 10

以下是完整程序TITLEDRAW---ProgramtodrawonscreenwithRead_cequ0Key_romequ16hUpequ48hDownequ50h... 以下是完整程序
TITLE DRAW---Program to draw on screen with
Read_c equ 0
Key_rom equ 16h
Up equ 48h
Down equ 50h
Right equ 4dh
Left equ 4bh
Block equ 0dbh
Escl equ 1bh
Video segment at 0b800h
Wd_buff label word
V_buff db 25*80*2 dup(?)
Video ends
Pro_name segment
Main proc far
Assume cs:pro_name,es:video
Start:
Push ds
Sub ax,ax
Push ax

Mov ax,video
Mov es,ax

Mov cx,80*25
Mov bx,0
Clear:
Mov es:[wd_buff+bx],0700h
Inc bx
Inc bx
Loop clear

Mov ch,12d
Mov cl,40d
Get_char:
Mov ah,read_c
Int key_rom
Cmp al,escl
Jz exit
Mov al,ah
Cmp al,up
Jnz not_up
Dec ch
Not_up:
Cmp al,down
Jnz not_down
Inc ch
Not_down:
Cmp al,right
Jnz not_right
Inc cl
Not_right:
Cmp al,left
Jnz lite_it
Dec cl
Lite_it:
Mov al,160d
Mul ch

Mov bl,cl
Rol bl,1
Mov bh,0
Add bx,ax

Mov al,block
Mov es:[v_buff+bx],al
Jmp get_char
Exit:
Ret
Main endp
Pro_name ends
End start
问题:光标轨迹运行到边界后,为什么光标会闪烁和改变颜色?若要光标不会,应怎么修改程序?
展开
 我来答
398041618
2012-06-07 · TA获得超过187个赞
知道答主
回答量:209
采纳率:0%
帮助的人:96.5万
展开全部
因为b800:0000显示屏幕缓冲区的内容
在文本方式下,B800:0000开始的地址保存着屏幕上每个字符位置的值。在文本方式下,屏幕被分为80 X 25。每个位置有两个值,一个值是ASCII字符,一个值是该ASCII的属性值(主要是颜色)。所以一个屏幕共有80X25X2=400个字符。

也就是说奇数偏移地址保存的是字符的属性值,偶数偏移地址保存字符ASCII码值,显示某一行内存地址范围为 160*CH ---160*CH+79*2+1,如果cl的值超过
50H,或者等于它(行不变情况下),地址保存的是下一行字符ASCII值和属性值
如果在行ch不变情况下,cl越过0边界,cl变成FF,
rol bl,1 指令不能使它乘2的效果,由于最高位是1,每次cl减一后循环左移末位都有1
使mov es:[v_buff+bx],al中bx的值变为奇数偏移量,之前未超边界时cl都不会超过50H,最高位是0,rol bl,1 指令使bl乘2,变为偶数,具有偶偏移量
每次把block值赋值给偶地址,也就是ASCII值,屏幕出现空白,而超出列边界后
修改
求出的BX的值是奇数偏移地址,修改字符属性值,值为DBH,颜色发生变化(而原先属性值为70H),若再经过原先修改的空白区(字符ASCII为DBH,属性为70H)
字符ASCII和属性值都修改为DBH,又是另一种颜色!
另外,楼主所说的光标指的是什么?
光标始终都在0行0列(就是输入的光标),可能你表达有错误,程序界面之所以会变化,只是修改了
b800:0000 地址的值而已,通过偏移量BX修改,不要被眼睛看到的所误导...
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式