在文本方式下,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修改,不要被眼睛看到的所误导...
汇编语言将光标移动到指定的位置可以调用BIOS中断INT 10h,输出显示可以调用DOS功能INT 21H。程序示例如下:data segment
Total db '中国龙$'
data ends
code segment
assume cs:code,ds:data
main proc far
start:
mov ax,data
mov ds,ax
mov ah,02h
mov dx,0A10h设定光标到第10行16列
int 10h
mov dx,offset Total
mov ah,09h显示字符串
int 21h
mov ah,4ch
int 21h
ret
main endp
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)