导读:
新一篇: VGA显示卡图形模式访问(提示版) (2)
VGA显示卡图形模式访问(提示版) (1)
最近闲来无聊,在 上海图书馆 借了本《IBM-PC汇编语言程序设计》。没想,在看显示器访问的那章时。觉得作者讲得实在含糊,无法让人明白。后来,又借了本《80x86汇编语言程序设计》发现,这两本书在那一章节的内容几乎是一样,例子图片都一样。在我反复的摸索和在 上海科学技术情报研究所 里查看几天的资料后。终于模清了门路。当然,我也上网看了。没有相关的内容,也许是我没找到。所以,在这里献上我的成果希望有缘人能和我交流。
本文主要是介绍不用BIOS中断在VGA 640*480 16色模式下,对屏幕单个象素进行读写操作。我将用两段代码来说明如何操作,用于对各位处于迷茫的学者们一些提示。
在阅读本文前,我希望读者能够有一定的汇编基础,和对VGA显卡原理的基础知识(其实只要知道一些就可以了)。如果有空,可以在看本文之前阅读前面我借的两本书中的一本中,有关VGA显示卡的操作内容。
本文使用的例子,是用于NASM汇编器,读者可以从网上免费下载。我使用的软件,都可以从www.sf.net免费下载。
对VGA的写操作
首先是确定坐标位置,由于对内存的访问是一个字节,也就是 8 位二进制,而四个位面同一地址的字,构成了一个四位的颜色值。所以,我们需要确定在0a000h中的哪段地址进行操作。
b=x/8+y*80
既然知道如何计算所写的位置,我们就来写一段汇编代码。
文件名: VGA_WRITE.ASM(部分解析)
作者: 黄庠魁
主要函数:Pix_write
参数说明: cx : x坐标值 dx : y坐标值 al : 颜色值(16色)
简要注意: 本程序需要用户在VGA 640*380 16色模式下工作,在使用前,请使用BIOS中断
设置VGA显示模式为 12H。
创建时间: 2005年1月
CopyRight: (C)黄庠魁
邮箱:Huangxiangkui@msn.com
产权所有 不得抄袭 如要使用 与我联系
x=cx,y=dx
push ax ;保存现场AX寄存器
push bx ;保存现场BX寄存器
push dx ;保存现场DX寄存器
开始计算x/8
mov ax,cx
mov bx,8
div bl ;al=ax/8 ah=ax%8
mov word[x],ax ;将结果存入x
开始计算y*80
pop ax ;将dx的内容读入ax
push ax;将ax内容入栈,以便在程序结束后恢复dx内容
mov bx,80
mul bx ;(dx,ax)=ax*80。因为dx在这个计算中不会有值,所以dx不作记录。
mov word[y],ax
开始汇总计算
mov ax,word[x]
mov dx,word[y]
mov bl,al
新一篇: VGA显示卡图形模式访问(提示版) (2)
VGA显示卡图形模式访问(提示版) (1)
最近闲来无聊,在 上海图书馆 借了本《IBM-PC汇编语言程序设计》。没想,在看显示器访问的那章时。觉得作者讲得实在含糊,无法让人明白。后来,又借了本《80x86汇编语言程序设计》发现,这两本书在那一章节的内容几乎是一样,例子图片都一样。在我反复的摸索和在 上海科学技术情报研究所 里查看几天的资料后。终于模清了门路。当然,我也上网看了。没有相关的内容,也许是我没找到。所以,在这里献上我的成果希望有缘人能和我交流。
本文主要是介绍不用BIOS中断在VGA 640*480 16色模式下,对屏幕单个象素进行读写操作。我将用两段代码来说明如何操作,用于对各位处于迷茫的学者们一些提示。
在阅读本文前,我希望读者能够有一定的汇编基础,和对VGA显卡原理的基础知识(其实只要知道一些就可以了)。如果有空,可以在看本文之前阅读前面我借的两本书中的一本中,有关VGA显示卡的操作内容。
本文使用的例子,是用于NASM汇编器,读者可以从网上免费下载。我使用的软件,都可以从www.sf.net免费下载。
对VGA的写操作
首先是确定坐标位置,由于对内存的访问是一个字节,也就是 8 位二进制,而四个位面同一地址的字,构成了一个四位的颜色值。所以,我们需要确定在0a000h中的哪段地址进行操作。
b=x/8+y*80
既然知道如何计算所写的位置,我们就来写一段汇编代码。
文件名: VGA_WRITE.ASM(部分解析)
作者: 黄庠魁
主要函数:Pix_write
参数说明: cx : x坐标值 dx : y坐标值 al : 颜色值(16色)
简要注意: 本程序需要用户在VGA 640*380 16色模式下工作,在使用前,请使用BIOS中断
设置VGA显示模式为 12H。
创建时间: 2005年1月
CopyRight: (C)黄庠魁
邮箱:Huangxiangkui@msn.com
产权所有 不得抄袭 如要使用 与我联系
x=cx,y=dx
push ax ;保存现场AX寄存器
push bx ;保存现场BX寄存器
push dx ;保存现场DX寄存器
开始计算x/8
mov ax,cx
mov bx,8
div bl ;al=ax/8 ah=ax%8
mov word[x],ax ;将结果存入x
开始计算y*80
pop ax ;将dx的内容读入ax
push ax;将ax内容入栈,以便在程序结束后恢复dx内容
mov bx,80
mul bx ;(dx,ax)=ax*80。因为dx在这个计算中不会有值,所以dx不作记录。
mov word[y],ax
开始汇总计算
mov ax,word[x]
mov dx,word[y]
mov bl,al