当前位置: 首页 > news >正文

小谈汇编程序中对VGA显存直接操作

最近闲来无聊,找了本80x86的汇编教程学习学习。在对显存直接操作的时候,发现书上说的很不清楚,

还没有说清楚呢,就开始例子了。(感觉像我们蹩脚的英语老师,说虚拟语气会说到不定式)所以,下面我

就来说一个简单的使用例子。希望各位能对各位有所启发。

首先,看一下图形控制器,它的端口是3CEH只要对这个端口传送参数,我们就可以将图形控制器9个寄存

器中的一个设置为当前操作的寄存器。然后通过3CFH传送参数给你刚才选择的寄存器。

其次,我所说的操作是对于VGA的12H模式也就是640×480 16色。

最后,我所用的汇编器是NASM,大家可以到www.sf.net上找到。

##################################################

寄存器的索引如下

寄存器名称 索引
置位/重置寄存器 0
允许置位/重置寄存器 1
颜色比较寄存器 2
数据循环/功能寄存器 3
读映像选择寄存器 4
模式选择寄存器 5
杂用 6
颜色无关寄存器 7
位屏蔽寄存器 8

关于寄存器的具体功能,在这里不做介绍。大家可以看看《IBM-PC汇编语言程序设计》第二版的10.3。

关于读模式,我看了看《IBM-PC汇编语言程序设计》上面说的还比较清楚。我在这里简单介绍一下写模式


通过对3CFH端口进行数据传送,可以对所选寄存器操作。

###################################################

写模式的种类

写模式有4种,其中0模式为默认模式,模式2是模式0的简化版本。模式3是VGA独有的。感觉和模式0差不

多。模式1是对位面的直接操作。

###################################################

操作过程

0 将屏幕设置为 12H 模式
1 通过端口对寄存器进行设置
2 对段地址为0a000h的内存进行写操作。

###################################################

简单的例子
;---------------------------------------------------
;文件:test.asm
;介绍:一个简单的对VGA写的例子。
;现象:在屏幕上出现绿黑相间的竖直条纹。
;语言:汇编语言,使用nasm汇编器
;作者:北斗星君
;邮箱:huangxiangkui@163.com
;---------------------------------------------------

;通过BIOS设置VGA模式
mov ah,00h
mov al,12h
int 10h


;以下对VGA控制器设置

;将VGA控制器,设置为写模式2
mov dx,3ceh
mov al,5
out dx,al ;选择 模式选择寄存器 为当前可用寄存器

mov dx,3cfh
mov al,2
out dx,al ;将模式2设为当前写模式

;对位屏蔽寄存器设置,使传送给0a000h的八个象素中设位1的象素为有效。
mov dx,3ceh
mov al,8
out dx,al ;选择 位屏蔽寄存器 为当前可用寄存器

mov dx,3cfh
mov al,11110000b ;让八个象素前四个有效,后四个无效
out dx,al

;对0a000h地址进行操作
;设置初始参数
mov ax,0a000h ;段地址
mov es,ax
mov bx,00000h ;起始偏移
mov al,0ah ;绿色
mov cx,0ffffh ;循环次数

;对内存循环操作写入
jmp re
re:
mov [es:bx],al
inc bx
loop re


上面是一个简单的写入程序,我这里注释的应该相当清楚了。如果有什么问题,我非常欢迎来大家探讨。

上面的代码用nasm编译通过。由于Win32下不能操作BIOS中断。所以,我加了些代码让它在Bochs下运行。

一切正常。

如果有任何问题,可以询问。

STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)

相关文章:

  • yolov5 报错:UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe6 in position 84: ordinal not in ra
  • Quartz
  • yolov5中成功解决:subprocess.CalledProcessError: Command ‘pip install ‘pycocotools>=2.0‘‘
  • Http.sys's HTTPERR and Timer_ConnectionIdle
  • Anaconda 中成功解决:Could not fetch URL https://pypi.tuna.tsinghua.edu.cn/simple/pyperclip/
  • 调用Lasso进行回归预测时遇到问题:ConvergenceWarning: Objective did not converge.
  • 利用mglearn绘图报错:TypeError: ‘(slice(None, None, None), 0)‘ is an invalid key
  • AD/2000技巧
  • 批量对图片处理:对图像进行色度饱和度亮度(HSV)调整
  • 一次性解决:UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe5 in position 373: ordinal not in range
  • 配置对位于网络地址转换(NAT)后方的服务的访问
  • 图像处理:二值图取反
  • 有关使用网络地址转换器的一些问题
  • Google colab踩坑
  • 内容管理系统(CMS)的设计和选型
  • AHK 中 = 和 == 等比较运算符的用法
  • CentOS 7 防火墙操作
  • JavaWeb(学习笔记二)
  • Objective-C 中关联引用的概念
  • Shadow DOM 内部构造及如何构建独立组件
  • ubuntu 下nginx安装 并支持https协议
  • unity如何实现一个固定宽度的orthagraphic相机
  • 阿里研究院入选中国企业智库系统影响力榜
  • 从零开始在ubuntu上搭建node开发环境
  • 关于Flux,Vuex,Redux的思考
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 利用jquery编写加法运算验证码
  • 前端攻城师
  • 巧用 TypeScript (一)
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 数据科学 第 3 章 11 字符串处理
  • 运行时添加log4j2的appender
  • #Linux(Source Insight安装及工程建立)
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (万字长文)Spring的核心知识尽揽其中
  • (转)菜鸟学数据库(三)——存储过程
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .net CHARTING图表控件下载地址
  • .NET 反射的使用
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 使窗口永不获得焦点
  • .Net8 Blazor 尝鲜
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @Autowired标签与 @Resource标签 的区别
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [BUG]vscode插件live server无法自动打开浏览器
  • [Bugku]密码???[writeup]
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [C++] sqlite3_get_table 的使用
  • [C++]四种方式求解最大子序列求和问题
  • [ios-必看] IOS调试技巧:当程序崩溃的时候怎么办 iphone IOS
  • [Java]深入剖析常见排序