汇编操作显存
導(dǎo)讀:
新一篇: VGA顯示卡圖形模式訪問(提示版) (1)
最近閑來無聊,找了本80x86的匯編教程學(xué)習(xí)學(xué)習(xí)。在對(duì)顯存直接操作的時(shí)候,發(fā)現(xiàn)書上說的很不清楚,
還沒有說清楚呢,就開始例子了。(感覺像我們蹩腳的英語老師,說虛擬語氣會(huì)說到不定式)所以,下面我
就來說一個(gè)簡(jiǎn)單的使用例子。希望各位能對(duì)各位有所啟發(fā)。
首先,看一下圖形控制器,它的端口是3CEH只要對(duì)這個(gè)端口傳送參數(shù),我們就可以將圖形控制器9個(gè)寄存
器中的一個(gè)設(shè)置為當(dāng)前操作的寄存器。然后通過3CFH傳送參數(shù)給你剛才選擇的寄存器。
其次,我所說的操作是對(duì)于VGA的12H模式也就是640480 16色。
最后,我所用的匯編器是NASM,大家可以到www.sf.net上找到。
##################################################
寄存器的索引如下
寄存器名稱 索引
置位/重置寄存器 0
允許置位/重置寄存器 1
顏色比較寄存器 2
數(shù)據(jù)循環(huán)/功能寄存器 3
讀映像選擇寄存器 4
模式選擇寄存器 5
雜用 6
顏色無關(guān)寄存器 7
位屏蔽寄存器 8
關(guān)于寄存器的具體功能,在這里不做介紹。大家可以看看《IBM-PC匯編語言程序設(shè)計(jì)》第二版的10.3。
關(guān)于讀模式,我看了看《IBM-PC匯編語言程序設(shè)計(jì)》上面說的還比較清楚。我在這里簡(jiǎn)單介紹一下寫模式
。
通過對(duì)3CFH端口進(jìn)行數(shù)據(jù)傳送,可以對(duì)所選寄存器操作。
###################################################
寫模式的種類
寫模式有4種,其中0模式為默認(rèn)模式,模式2是模式0的簡(jiǎn)化版本。模式3是VGA獨(dú)有的。感覺和模式0差不
多。模式1是對(duì)位面的直接操作。
###################################################
操作過程
0 將屏幕設(shè)置為 12H 模式
1 通過端口對(duì)寄存器進(jìn)行設(shè)置
2 對(duì)段地址為0a000h的內(nèi)存進(jìn)行寫操作。
###################################################
簡(jiǎn)單的例子
---------------------------------------------------
文件:test.asm
介紹:一個(gè)簡(jiǎn)單的對(duì)VGA寫的例子。
現(xiàn)象:在屏幕上出現(xiàn)綠黑相間的豎直條紋。
語言:匯編語言,使用nasm匯編器
作者:北斗星君
郵箱:huangxiangkui@163.com
---------------------------------------------------
通過BIOS設(shè)置VGA模式
mov ah,00h
mov al,12h
int 10h
以下對(duì)VGA控制器設(shè)置
將VGA控制器,設(shè)置為寫模式2
mov dx,3ceh
mov al,5
out dx,al ;選擇 模式選擇寄存器 為當(dāng)前可用寄存器
mov dx,3cfh
mov al,2
out dx,al ;將模式2設(shè)為當(dāng)前寫模式
對(duì)位屏蔽寄存器設(shè)置,使傳送給0a000h的八個(gè)象素中設(shè)位1的象素為有效。
mov dx,3ceh
mov al,8
out dx,al ;選擇 位屏蔽寄存器 為當(dāng)前可用寄存器
mov dx,3cfh
mov al,11110000b ;讓八個(gè)象素前四個(gè)有效,后四個(gè)無效
out dx,al
對(duì)0a000h地址進(jìn)行操作
設(shè)置初始參數(shù)
mov ax,0a000h ;段地址
mov es,ax
mov bx,00000h ;起始偏移
mov al,0ah ;綠色
mov cx,0ffffh ;循環(huán)次數(shù)
對(duì)內(nèi)存循環(huán)操作寫入
jmp re
re:
mov [es:bx],al
inc bx
loop re
上面是一個(gè)簡(jiǎn)單的寫入程序,我這里注釋的應(yīng)該相當(dāng)清楚了。如果有什么問題,我非常歡迎來大家探討。
上面的代碼用nasm編譯通過。由于Win32下不能操作BIOS中斷。所以,我加了些代碼讓它在Bochs下運(yùn)行。
一切正常。
如果有任何問題,可以詢問。
STUDIO軟件開發(fā)組(SDT)
STUDIO Development Team
北斗星君(黃庠魁)
本文轉(zhuǎn)自
新一篇: VGA顯示卡圖形模式訪問(提示版) (1)
最近閑來無聊,找了本80x86的匯編教程學(xué)習(xí)學(xué)習(xí)。在對(duì)顯存直接操作的時(shí)候,發(fā)現(xiàn)書上說的很不清楚,
還沒有說清楚呢,就開始例子了。(感覺像我們蹩腳的英語老師,說虛擬語氣會(huì)說到不定式)所以,下面我
就來說一個(gè)簡(jiǎn)單的使用例子。希望各位能對(duì)各位有所啟發(fā)。
首先,看一下圖形控制器,它的端口是3CEH只要對(duì)這個(gè)端口傳送參數(shù),我們就可以將圖形控制器9個(gè)寄存
器中的一個(gè)設(shè)置為當(dāng)前操作的寄存器。然后通過3CFH傳送參數(shù)給你剛才選擇的寄存器。
其次,我所說的操作是對(duì)于VGA的12H模式也就是640480 16色。
最后,我所用的匯編器是NASM,大家可以到www.sf.net上找到。
##################################################
寄存器的索引如下
寄存器名稱 索引
置位/重置寄存器 0
允許置位/重置寄存器 1
顏色比較寄存器 2
數(shù)據(jù)循環(huán)/功能寄存器 3
讀映像選擇寄存器 4
模式選擇寄存器 5
雜用 6
顏色無關(guān)寄存器 7
位屏蔽寄存器 8
關(guān)于寄存器的具體功能,在這里不做介紹。大家可以看看《IBM-PC匯編語言程序設(shè)計(jì)》第二版的10.3。
關(guān)于讀模式,我看了看《IBM-PC匯編語言程序設(shè)計(jì)》上面說的還比較清楚。我在這里簡(jiǎn)單介紹一下寫模式
。
通過對(duì)3CFH端口進(jìn)行數(shù)據(jù)傳送,可以對(duì)所選寄存器操作。
###################################################
寫模式的種類
寫模式有4種,其中0模式為默認(rèn)模式,模式2是模式0的簡(jiǎn)化版本。模式3是VGA獨(dú)有的。感覺和模式0差不
多。模式1是對(duì)位面的直接操作。
###################################################
操作過程
0 將屏幕設(shè)置為 12H 模式
1 通過端口對(duì)寄存器進(jìn)行設(shè)置
2 對(duì)段地址為0a000h的內(nèi)存進(jìn)行寫操作。
###################################################
簡(jiǎn)單的例子
---------------------------------------------------
文件:test.asm
介紹:一個(gè)簡(jiǎn)單的對(duì)VGA寫的例子。
現(xiàn)象:在屏幕上出現(xiàn)綠黑相間的豎直條紋。
語言:匯編語言,使用nasm匯編器
作者:北斗星君
郵箱:huangxiangkui@163.com
---------------------------------------------------
通過BIOS設(shè)置VGA模式
mov ah,00h
mov al,12h
int 10h
以下對(duì)VGA控制器設(shè)置
將VGA控制器,設(shè)置為寫模式2
mov dx,3ceh
mov al,5
out dx,al ;選擇 模式選擇寄存器 為當(dāng)前可用寄存器
mov dx,3cfh
mov al,2
out dx,al ;將模式2設(shè)為當(dāng)前寫模式
對(duì)位屏蔽寄存器設(shè)置,使傳送給0a000h的八個(gè)象素中設(shè)位1的象素為有效。
mov dx,3ceh
mov al,8
out dx,al ;選擇 位屏蔽寄存器 為當(dāng)前可用寄存器
mov dx,3cfh
mov al,11110000b ;讓八個(gè)象素前四個(gè)有效,后四個(gè)無效
out dx,al
對(duì)0a000h地址進(jìn)行操作
設(shè)置初始參數(shù)
mov ax,0a000h ;段地址
mov es,ax
mov bx,00000h ;起始偏移
mov al,0ah ;綠色
mov cx,0ffffh ;循環(huán)次數(shù)
對(duì)內(nèi)存循環(huán)操作寫入
jmp re
re:
mov [es:bx],al
inc bx
loop re
上面是一個(gè)簡(jiǎn)單的寫入程序,我這里注釋的應(yīng)該相當(dāng)清楚了。如果有什么問題,我非常歡迎來大家探討。
上面的代碼用nasm編譯通過。由于Win32下不能操作BIOS中斷。所以,我加了些代碼讓它在Bochs下運(yùn)行。
一切正常。
如果有任何問題,可以詢問。
STUDIO軟件開發(fā)組(SDT)
STUDIO Development Team
北斗星君(黃庠魁)
本文轉(zhuǎn)自
http://blog.csdn.net/VisionCat/archive/2005/01/12/250431.aspx
【0】README
0.1)本文轉(zhuǎn)自: http://www.cnblogs.com/youxin/archive/2012/05/21/2512329.html
for relative source code , please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/lib.inc
【1】關(guān)于 80*25彩色字符模式顯示緩沖區(qū)(以下簡(jiǎn)稱顯示緩沖區(qū))結(jié)構(gòu)的總結(jié):
1.1)顯存介紹
- 1)顯示緩沖區(qū)地址空間:b8000h~bffffh,共32k 空間;
- 2)顯示緩沖區(qū)分為8個(gè)頁,每頁4k;
- 3)每頁25行,每行160B;
- 4)每行80個(gè)字符,每個(gè)字符占兩個(gè)字節(jié),分別存儲(chǔ)字符本身的ascii 和 屬性值(背景色,前景色);
- 5) 一般情況下,顯示第0頁的內(nèi)容,也就是說通常情況下,b8000h~b8f9fh中的4000個(gè)字節(jié)的內(nèi)容將出現(xiàn)在顯示器上。
1.2)在一頁顯示緩沖區(qū)中:
- 偏移000~09f 對(duì)應(yīng)顯示器上的第一行(80個(gè)字符占160個(gè)字節(jié))
- 偏移0a0~13f對(duì)應(yīng)顯示器上的第二行
- 依此類推,可以知道,偏移f00~f9f對(duì)應(yīng)顯示器上的第25行
【3】對(duì)于一個(gè)字符占2個(gè)字節(jié)的總結(jié):
3.1)低位字節(jié)存儲(chǔ)字符的ascii,高位存儲(chǔ)字符的屬性(一行共有80個(gè)字符,占160個(gè)字節(jié)),如:
- 00~01 單元對(duì)應(yīng)顯示器上的第1列;
- 02~03 單元對(duì)應(yīng)顯示器上的第2列;
- 04~05 單元對(duì)應(yīng)顯示器上的第3列;
3.2)關(guān)于前景色和背景色屬性設(shè)置:
- 7 6 5 4 3 2 1 0
- BL7閃爍 rgb背景(654)I(高亮3) rgb(前景色 210)
- 可以按位設(shè)置屬性字節(jié),從而配出各種不同的前景色和背景色。
總結(jié)
- 上一篇: 汇编语言——键盘输入字符
- 下一篇: babyos (三)——利用BIOS I