一步步编写操作系统 75 从显卡读取光标位置1

我们在打印字符时,通常都不用指定字符显示的坐标位置,大家也没觉得有什么奇怪,原因是字符是在当前光标的位置处显示的,而且光标的位置会一直更新顺延,我们的字符一直跟着光标走,似乎光标就是字符的导航一样,而我们已经习惯了跟随光标。我想大伙儿已经清楚了光标和字符的关系了,对,它们的关系就是没有任何关系^_^。“光标在哪字符就在哪”,这是我们人为有意设置的,我们是在光标处打印字符。也就是说,我们也可以不在光标处打印字符,让光标和字符的位置分开。这一点在理论上就能证明,我们知道打印字符本质上就是把字符写入在显存中的某个地址处。在文本模式80*25下的显存可以显示80*25=2000个字符,每个字符占2字节,低字节是字符的ascii码,高字节是前景色和背景色属性,所以在4000字节的显存空间中,只要起始地址为偶数的任意2字节我们都可以写入字符,您看,这哪里是光标能限制的。光标只是个亮点,用来吸引用户眼球的,它能够帮助咱们快速找到屏幕上的活跃位置,它本身与字符显示的位置没有关系。

话虽然这么说,但光标的作用已经被认同为当前可输入或显示字符的位置,字符在光标处显示,这已经成了字符打印的传统观念,所以在咱们的实现中也要传承复制这种观念。

光标是什么?不要感到奇怪,我是很认真的说。

我们Linux用户最熟悉了,就是屏幕上那一小白竖块,和文本软件中的小竖线是一回事,它们都是用来告诉用户当前文本输入点在哪里。光标是字符的坐标,只不过该坐标不是二维的,而是一维的线性坐标,是屏幕上所有字符以0为起始的顺序。在默认的80*25模式下,每行80个字符共25行,屏幕上可以容纳2000个字符,故该坐标值的范围是0~1999。第0行的所有字符坐标是0~24,第1行的所有字符坐标是25~49,以此类推,最后一行的所有字符是1975~1999。由于一个字符是占用2字节,所以光标乘以2后才是字符在显存中的地址。

光标的坐标位置是存放在光标坐标寄存器中的,当我们在屏幕上写入一个字符时,光标的坐标并不会自动+1,因为光标跟随字符并不是必要的,比如我们想删除文本中的某个字符时,咱们就可以把光标移动到该字符后面,再按下delete键,这样字符就被删除了,这就是光标与字符分离的应用之一。所以,光标位置并不会自动更新,因为光标坐标寄存器是可写的,如果需要的话,程序员可以自己来维护光标的坐标。

为了在光标处打印字符,咱们得先知道光标在哪,所以第一件事就是读取光标坐标寄存器,获取光标坐标值。

好了,以上是理论,下节咱们实战,下班吃饭。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Chrome浏览器】常用快捷键整理

标签页和窗口快捷键 1. Ctrl n 打开新窗口 2. Ctrl t 打开新的标签页,并跳转到该标签页 3. Ctrl Shift t 重新打开最后关闭的标签页,并跳转到该标签页 4. Ctrl Tab 跳转到下一个打开的标签页 5. Ctrl Shift Tab 跳转到上一个打开的标签页 6.…

一步步编写操作系统 76 用汇编语言编写字符打印函数

之前咱们介绍显卡上那么多的寄存器终于发挥用处了,我们看看前文中介绍的表CRT Controller Data Registers中索引为0Eh的 Cursor Location High Register寄存器和索引为0Fh的Cursor Location Low Register寄存器,这两个寄存器都是8位长度。分别用来存储光…

【人工智能课程实验】 - 利用贝叶斯分类器实现手写数字 的识别

读入数据与预处理 因为老师给的文件无法直接读取,故从官网导入数据: 官网链接:http://www.cs.nyu.edu/~roweis/data.html 导入数据之后要对MATLAB文件进行读入: datasio.loadmat(trainfile) 对文件type一下: ty…

一步步编写操作系统 77 内联汇编与ATT语法简介

内联汇编 之前和大家介绍过了一种汇编方法,就是C代码和汇编代码分别编译,最后通过链接的方式结合在一起形成可执行文件。 另一种方式就是在C代码中直接嵌入汇编语言,强大的GCC无所不能,咱们本节要学习的就是这一种,它…

【Python学习】内置函数(不断更新)

关于常用在for循环中的range函数 python range() 函数可创建一个整数列表,一般用在 for 循环中。 函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range&#…

【Python学习】 简单语法与常见错误(持续更新)

关于单引号和双引号 当输出的字符串内部没有单引号的时候,外面可以用单引号, 但是如果内部有了单引号,那么外部只能用双引号。 dict {Name: Zara, Age: 7, Class: First} print(dict) print (dict[Name]: , dict[Name]) print ("dic…

一步步编写操作系统 78 intel汇编与ATT汇编语法区别

本节咱们介绍下intel汇编语法和at&t汇编语法的区别。 以上表中未列出这两种语法在内存寻址方面的差异,个人觉得区别还是很大的,下面单独说说。 在Intel语法中,立即数就是普通的数字,如果让立即数成为内存地址,需要…

重读经典:《Masked Autoencoders Are Scalable Vision Learners》

MAE 论文逐段精读【论文精读】这一次李沐博士给大家精读的论文是 MAE,这是一篇比较新的文章,2021年11月11日才上传到 arXiv。这篇文章在知乎上的讨论贴已经超过了一百万个 view,但是在英文社区,大家反应比较平淡一点,R…

【Python学习日志】 - Numpy包

NumPy是什么? 使用Python进行科学计算的基础包,在数据分析的时候比较常用到矩阵计算。这时太多的Np属性不记得,所以方便自己使用把一些常用的Np属性汇总记录一下使用的时候方便查找。 ndarray.ndim 阵列的轴数(尺寸)…

SQL Server:触发器详解

SQL Server:触发器详解 1. 概述2. 触发器的分类3. Inserted和Deleted表4. 触发器的执行过程5. 创建触发器6. 修改触发器:7. 删除触发器:8. 查看数据库中已有触发器:9. “Instead of”相关示例:10. “After”触发器11. 参考资源 1…

详解协同感知数据集OPV2V: An Open Benchmark Dataset and Fusion Pipeline for Perception with V2V Communication

在《详解自动驾驶仿真框架OpenCDA: An Open Cooperative Driving Automation Framework Integrated with Co-Simulation》 一文中介绍了自动驾驶仿真框架 OpenCDA。本文将介绍论文作者另一篇最新工作 OPV2V,论文收录于 ICRA2022。 OPV2V 数据集主要 feature 有&…

【Python学习】 - 如何在Spyder中弹出plot绘图窗口而不是在Console中绘图

依次选择这几项: 点击ok确认。 注意:点击ok之后不会立即生效,重启Spyder之后才会生效

mysql系列:加深对脏读、脏写、可重复读、幻读的理解

关于相关术语的专业解释,请自行百度了解,本文皆本人自己结合参考书和自己的理解所做的阐述,如有不严谨之处,还请多多指教。 **不可重复读的重点是修改: **同一事务,两次读取到的数据不一样。 幻读的重点在于新增或者…

重读经典(点云深度学习开山之作):《Deep learning on point clouds for 3D scene understanding》(持续更新中)

本文介绍的是 PointNet 作者的博士论文:3D场景理解中的点云深度学习。从上图可以看到,整个博士论文主要贡献有两块:一是点云深度学习的网络架构(PointNet 和 PointNet);二是在3D场景理解中的应用&#xff0…

【Python学习】 - plt画图时,添加标题的中英文问题

默认是只能用中文,如果添加了中文标题,则会输出一堆乱码,解决方法就是加上下面这两行代码。 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False

Coursera自动驾驶课程第17讲:An Autonomous Vehicle State Estimator

在第16讲《Coursera自动驾驶课程第16讲:LIDAR Sensing》我们学习了自动驾驶目前常用的3D 传感器,激光雷达,了解了激光雷达的工作原理,掌握了对点云数据的操作以及如何使用点云配准方法来进行汽车定位。 回顾一下,在本…