光标的定义
- 所谓光标直观上就是,我们打字时出现在屏幕上一闪一闪的“短横线”(或“竖线”),但它的主要目的是指出,我们写入和删除会作用的位置,也就是定位。
- 光标的定位使用坐标,从左上角开始,这里按照习惯定义“列”为X轴,“行”为Y轴。按照规定,每一行可以容纳80个字符,也就值整个屏幕可以显示80列的ASCII码。每一页可以从事显示25行。也就是总共25*80个字符。
- 一般0表示 0行0列, 79表示0行79列,80表示1行0列。
读取和控制光标位置
- 索引寄存器
与光标进行交互的寄存器存在于显卡中,它的交互与硬盘有所不用,需要通过索引寄存器间接与寄存器进行通讯。其索引寄存器的端口号为0x3d4。通过向这个端口号写入不同的值,就可以和不同的寄存器进项交互。如,如果要访问8位的光标寄存器,我们就要输入14(0x0e)或15(0x0f),分别表示与高8位或低8位交互。
- 数据读取寄存器
定义好我们要交互的寄存器后,我们还需要通过端口号为0x3d5的寄存器与光标进行数据交互。
取位置
mov dx, 0x3d4 ;读取高八位
mov al, 0x0e
out dx, al
mov dx, 0x3d5
in ah, dx
mov dx, 0x3d4 ;读取第八位
mov al, 0x0f
out dx, al
mov dx, 0x3d5
in al, dx
mov bx, ax ;此时ax中就储存了光标的全部位置信息
操作光标
可以理解为取光标的逆过程,这里接上文。假设我们输出数据时遇到了一个换行符,我们就需要将光标移动到下一行开头。
注意: 显卡是不会自动在换行符处换行的,这需要我们自己写命令进行换行
;首先,计算光标下一行开头的位置
mov di, 80
div di ;光标位置除80,余数不要。除数表示光标下一行,因为第一行记为0。
mul di ;商乘以80,求出所需结果
mov bx, ax ;计算后的光标位置
;把结果通过寄存器写入
mov dx, 0x3d4
mov al, 0x0e ;高位
out dx, al
mov dx, 0x3d5
mov al, bh
out dx, al
mov dx, 0x3d4
mov al, 0x0f ;低8位
out dx, al
mov dx, 0x3d5
mov al, bl
out dx, al
这样光标的位置就刷新了。

356

被折叠的 条评论
为什么被折叠?



