X86架构(六)——光标控制

2024-09-05 04:28
文章标签 x86 架构 控制 光标

本文主要是介绍X86架构(六)——光标控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

光标(Cursor)是在屏幕上有规律地闪动的一条小橫线,通常用于指示下一个要显示的字符位置。
光标在屏幕上的位置保存在显卡内部的两个光标寄存器中,每个寄存器是8位的,合起来形成一个16位的数值。标准VGA文本模式是25 行,每行80个字符。所以,0表示光标在屏幕上第0行第0列,80表示它在第1行第0列,这样算来,当光标在屏幕右下角时,该值为25×80-1=1999
光标寄存器是可读可写的

取当前光标位置

显卡的操作非常复杂,内部的寄存器很多。为了不过多占用主机的I/O空间,很多寄存器只能通过索引寄存器间接访问
索引寄存器的端口号是0x3d4,向它写入一个值,用来指定目标内部寄存器
两个8位的光标寄存器,其索引值分别是0x0e和0x0f,分别用于提供光标位置的高8位低8位
光标寄存器的读写控制通过数据端口0x3d5指定

;程序清单_1
mov dx, 0x3d4	;索引寄存器端口
mov al, 0x0e
out dx, al		;指定操作寄存器索引
mov dx, 0x3d5	;数据端口
in  al, dx		;读出0x0e寄存器的值
mov ah, al		;8位传送到ah寄存器mov dx, 0x3d4
mov al, 0x0f
out dx, al
mov dx, 0x3d5
in  al, dx		;ax寄存器中的数值此时是光标数据位置 ah+al

处理回车和换行字符

ASCII码0x0d是回车,0x0a是换行
回车和换行的概念最早起源于老式打字机。那种打字机上有滚筒,用于使纸张上下卷动,每敲击一个按键,字车往右移动一格,位于下一个可打印的位置。在这种设备上,将字车推到最左边,也就是一行的开始,叫做回车(Carriage Return);而拧一下滚筒,将纸上卷一行,叫做换行(Line Feed)。
如果是回车符0x0d,应将光标移动到当前行的行首。每行有80个字符,用当前光标位置除以80,余数不要,就可以得到当前行的行号。接着,再乘以80,就是当前行行首的光标数值。

;程序清单_2
;该程序接程序清单_1
mov bx, ax	;ax寄存器中存储着当前光标的位置
mov ax, bx	;16位除法,被除数在ax寄存器中
mov bl, 80	;除数
div bl		;商在al中余数在ah中
mul bl		;结果在ax中
;mul 是乘法指令
;mul r/m8  ax = al * r/m8     8位乘法,结果16;mul r/m16 dx:ax = ax * r/m16 16位乘法,结果32位
mov bx, ax
jmp __set_cursor

如果是换行符0x0a,应将光标向下移动一行

;换行处理
;接程序清单_2
cmp cl, 0x0a	;字符存储在cl寄存器中
add bx, 80		;cl = 0x0a bx存储的当前光标位置
jmp __roll_screen

设置光标位置

;光标设置
__roll_screen:cmp bx, 2000jl __set_cursor	;bx小于2000不需要滚屏mov ax, 0xb800	;0xb800显存映射的内存地址;滚屏;将屏幕上第225 行的内容整体往上提一行;最后用黑底白字的空白字符填充第25行mov ds, axmov es, axcldmov si, 0xa0	;第二行第一列的显存偏移地址(一行80个字符,用两个字节控制)[ds:si]mov di, 0x00	;目的偏移地址 [es:di]mov cx, 1920	;传送字节数 24 * 80 * 2 / 2rep movsw		;使用movsw传送所以除以2mov bx, 3840	;25行显存偏移地址 24 * 80 * 2mov cx, 80		;传送字数
__cls:mov word[ex:bx], 0x0720add bx, 2loop clsmov bx 1920		;滚屏后光标位置对应的数值(最后一行第一列)
__set_cursor:mov dx, 0x3d4mov al, 0x0eout dx, al		;指定操作寄存器mov dx, 0x3d5mov al, bh		;光标位置高8位out dx, al		;写入数据端口mov dx, 0x3d4mov al, 0x0fout dx, almov dx, 0x03d5mov al, bl		;光标位置低8位out dx, al		;写入数据端口

这篇关于X86架构(六)——光标控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137941

相关文章

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应