汇编 光标轨迹程序求救

来源:百度知道 编辑:UC知道 时间:2024/05/15 05:47:22
以下是完整程序
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_

因为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修改,不要被眼睛看到的所误导...