汇编显示程序中,光标运行到边界后,为什么光标会闪烁和改变颜色

来源:百度知道 编辑:UC知道 时间:2024/05/18 09:40:21
程序如下(运行无错,主要是思考题不理解)
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
esc1 equ 1bh

video segment at 0b800h ;附加段ES
wd_buff label word
v_buff db 25*80*2 dup(?)
video ends
CODES SEGMENT
main proc far
ASSUME CS:CODES,es:video
START:
push ds
mov ax,0
push ax
MOV AX,video
mov es,ax
mov cx,80*25
mov bx,0
clear:
mov es:[wd_buff+bx],7000h
inc bx
inc bx
loop clear
mov ch,12d ;set pointer
mov cl,40d
get_char:
mov ah,read_c
int key_rom
cmp al,esc1
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

不知你说的光标会闪烁什么意思!,至于改变颜色
因为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修改,不要被眼睛看到的所误导...

不知楼主要什么效果!(楼主提出所谓光标不变是什么意思!)