汇编操作显存
導讀:
新一篇: VGA顯示卡圖形模式訪問(提示版) (1)
最近閑來無聊,找了本80x86的匯編教程學習學習。在對顯存直接操作的時候,發現書上說的很不清楚,
還沒有說清楚呢,就開始例子了。(感覺像我們蹩腳的英語老師,說虛擬語氣會說到不定式)所以,下面我
就來說一個簡單的使用例子。希望各位能對各位有所啟發。
首先,看一下圖形控制器,它的端口是3CEH只要對這個端口傳送參數,我們就可以將圖形控制器9個寄存
器中的一個設置為當前操作的寄存器。然后通過3CFH傳送參數給你剛才選擇的寄存器。
其次,我所說的操作是對于VGA的12H模式也就是640480 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
北斗星君(黃庠魁)
本文轉自
新一篇: VGA顯示卡圖形模式訪問(提示版) (1)
最近閑來無聊,找了本80x86的匯編教程學習學習。在對顯存直接操作的時候,發現書上說的很不清楚,
還沒有說清楚呢,就開始例子了。(感覺像我們蹩腳的英語老師,說虛擬語氣會說到不定式)所以,下面我
就來說一個簡單的使用例子。希望各位能對各位有所啟發。
首先,看一下圖形控制器,它的端口是3CEH只要對這個端口傳送參數,我們就可以將圖形控制器9個寄存
器中的一個設置為當前操作的寄存器。然后通過3CFH傳送參數給你剛才選擇的寄存器。
其次,我所說的操作是對于VGA的12H模式也就是640480 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
北斗星君(黃庠魁)
本文轉自
http://blog.csdn.net/VisionCat/archive/2005/01/12/250431.aspx
【0】README
0.1)本文轉自: 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】關于 80*25彩色字符模式顯示緩沖區(以下簡稱顯示緩沖區)結構的總結:
1.1)顯存介紹
- 1)顯示緩沖區地址空間:b8000h~bffffh,共32k 空間;
- 2)顯示緩沖區分為8個頁,每頁4k;
- 3)每頁25行,每行160B;
- 4)每行80個字符,每個字符占兩個字節,分別存儲字符本身的ascii 和 屬性值(背景色,前景色);
- 5) 一般情況下,顯示第0頁的內容,也就是說通常情況下,b8000h~b8f9fh中的4000個字節的內容將出現在顯示器上。
1.2)在一頁顯示緩沖區中:
- 偏移000~09f 對應顯示器上的第一行(80個字符占160個字節)
- 偏移0a0~13f對應顯示器上的第二行
- 依此類推,可以知道,偏移f00~f9f對應顯示器上的第25行
【3】對于一個字符占2個字節的總結:
3.1)低位字節存儲字符的ascii,高位存儲字符的屬性(一行共有80個字符,占160個字節),如:
- 00~01 單元對應顯示器上的第1列;
- 02~03 單元對應顯示器上的第2列;
- 04~05 單元對應顯示器上的第3列;
3.2)關于前景色和背景色屬性設置:
- 7 6 5 4 3 2 1 0
- BL7閃爍 rgb背景(654)I(高亮3) rgb(前景色 210)
- 可以按位設置屬性字節,從而配出各種不同的前景色和背景色。
總結
- 上一篇: 汇编语言——键盘输入字符
- 下一篇: babyos (三)——利用BIOS I