我们在打印字符时,通常都不用指定字符显示的坐标位置,大家也没觉得有什么奇怪,原因是字符是在当前光标的位置处显示的,而且光标的位置会一直更新顺延,我们的字符一直跟着光标走,似乎光标就是字符的导航一样,而我们已经习惯了跟随光标。我想大伙儿已经清楚了光标和字符的关系了,对,它们的关系就是没有任何关系^_^。“光标在哪字符就在哪”,这是我们人为有意设置的,我们是在光标处打印字符。也就是说,我们也可以不在光标处打印字符,让光标和字符的位置分开。这一点在理论上就能证明,我们知道打印字符本质上就是把字符写入在显存中的某个地址处。在文本模式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键,这样字符就被删除了,这就是光标与字符分离的应用之一。所以,光标位置并不会自动更新,因为光标坐标寄存器是可写的,如果需要的话,程序员可以自己来维护光标的坐标。

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

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

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

  1. 一步步编写操作系统 18 操作显卡,显存,显示器 下

    接上回,大家看下显卡各种模式的内存分布. 各外部设备都是通过软件指令的形式与上层接口通信的,显卡(显示适配器)也不例外,所以它也有自己的bios.位置是0xC0000到0xC7FFF.显卡支持三种模式 ...

  2. 一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

    一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法.咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量.如今我们要写一个打印函数了, ...

  3. 一步步编写操作系统 69 汇编语言和c语言共同协作 70

    由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...

  4. 一步步编写操作系统 62 函数调用约定

    由于我们要将c语言和汇编语言结合编程啦,所以一定会存在汇编代码和c代码相互调用的问题,有些事情还是要提前交待给大家的,本节就是要给大家说下函数调用规约中的那些事儿. 函数调用约定是什么? 调用约定,c ...

  5. 一步步编写操作系统 09 写个mbr

    有点不好意思了,说了好久,才说到实质性的东西,好了,赶紧给客官上菜. 代码2-1(c2/a/boot/mbr.S)1 ;主引导程序2 ;-------------------------------- ...

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

    之前咱们介绍显卡上那么多的寄存器终于发挥用处了,我们看看前文中介绍的表CRT Controller Data Registers中索引为0Eh的 Cursor Location High Regist ...

  7. 一步步编写操作系统 19 改进MBR,直接操作显卡

    到目前为止,说了一部分有关显存的内容,这对于一般的输出来说已经足够了,下面咱们可以尝试写显存啦.我们将之前MBR改造一下,保留滚屏的操作,只修改有关输出的部分.即把通过bios的输出改为通过显存,你会 ...

  8. 一步步编写操作系统 17 显存,显卡,显示器 上

    为了能够看到图像,我们需要显示器.无论是哪种显示器,它都是由显卡来控制的,我们没必要了解液晶显示器和普通CRT显示器的差别.无底是哪种显卡,它提供给我们的可编程接口都是一样的:IO端口和显存. 显存是 ...

  9. 一步步编写操作系统 16 显卡概述

    之前我们的mbr中我们刚刚向屏幕输出了"1 MBR"这几个字符,这种喜悦还没有过去,我就要给大家泼冷水了:这种打印字符的方法马上就用不了啦. mbr是运行在实模式下,所以在实模式下 ...

最新文章

  1. Laravel 底层是如何处理 HTTP 请求的?
  2. Disruptor官方文档实现
  3. gradle常用命令
  4. 文件管理详细知识要点
  5. 提高mysql千万级大数据SQL查询优化30条经验
  6. Linux网络:网络传输基本流程与协议初识
  7. Spring Boot + Vue 前后端分离,两种文件上传方式总结
  8. beego使用php,介绍beego、nginx性能测试实例
  9. apk去除签名验证工具安卓版_App 签名过期或泄露怎么办?别担心,Google 已经给出解决方案!...
  10. 学习 Linux/C/C++ 必备资料
  11. kafka数据不丢失不重复_如何配置 KAFKA 使其消息不会丢失
  12. Matlab中出现“无法打开电子表格,MATLAB报告了以下错误;错误:服务器出现意外情况”
  13. toj 4315 一二三
  14. dbeaver默认值怎么设置_电脑没声音怎么办,峰哥教你如何解决
  15. 马云生气了 mysql_“马云生气了”之增删改查
  16. UGUI的InputField
  17. 计算机 继续教育培训心得体会,继续教育培训总结.doc
  18. 产品升级 | 7月产品及解决方案升级来袭!
  19. 【Mongodb】常用的一些功能
  20. VMware14配置虚拟网络详解

热门文章

  1. CAS单点登陆的两个原理图
  2. 工具资源 Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
  3. CSS3详解:transform、transition
  4. 【转】Yelp是如何实现每天运行数百万个测试的
  5. BZOJ2720: [Violet 5]列队春游
  6. ubuntu11.10中配置OGRE1.8
  7. Convert.Int32、(int)和int.Parse三者的区别
  8. [Leedcode][JAVA][第680题][验证回文字符串Ⅱ][贪心][递归]
  9. 天梯赛-是否完全二叉搜索树
  10. 注册登录页面代码用js判断是否填入信息_php实现登录功能