控制显卡
文章目錄
- 1 顯卡和顯存
- 1.1 顯卡和顯存
- 1.2 顯存的顯示模式
- 1.3 8086中顯存的地址
- 2 控制顯卡顯示內(nèi)容
- 2.1 需求分析
- 2.2 匯編代碼實(shí)現(xiàn)
- 2.3 更精簡(jiǎn)的代碼實(shí)現(xiàn)
1 顯卡和顯存
1.1 顯卡和顯存
先搞清楚如下幾個(gè)概念:
顯卡: 為顯示器提供內(nèi)容。
顯示器: 將顯卡所提供的內(nèi)容呈現(xiàn)在屏幕上。
集成顯卡: 集成在主板上,和主板是一體的。
獨(dú)立顯卡: 獨(dú)立生產(chǎn)和銷(xiāo)售的一個(gè)獨(dú)立的部件。
顯示存儲(chǔ)器: 簡(jiǎn)稱(chēng)“顯存”,每個(gè)顯卡都有自己的存儲(chǔ)器。
1.2 顯存的顯示模式
圖形模式:
文本模式:
實(shí)際上還包含屬性字節(jié):
屬性字節(jié)的含義:
1.3 8086中顯存的地址
2 控制顯卡顯示內(nèi)容
2.1 需求分析
我們需要在屏幕上顯示一個(gè)標(biāo)號(hào)的地址,顯示內(nèi)容類(lèi)似:“l(fā)abel offset:256”。
顯示標(biāo)號(hào)的步驟如下:
2.2 匯編代碼實(shí)現(xiàn)
匯編代碼如下:
mov ax,0xb800 ;將b800傳送到ax寄存器中 mov es,ax ;將ax寄存器中的值,也就是b800傳送到附加段寄存器es中 ;為什么不寫(xiě)成 mov es,b800 ? ;因?yàn)閕ntel處理器不允許,它只允許:mov 段寄存器,通用寄存器/內(nèi)存單元 ;b800這個(gè)數(shù)是干什么用的?---顯存的段地址 ;----------------------------------------------------------------- mov byte [es:0x00],'L' ;將"字符L的ASCII碼"存儲(chǔ)到顯存的第1個(gè)存儲(chǔ)單元中 ;mov byte [es:0x00],0100 1100b / 76 / 0x4C ;地址必須使用方括號(hào)括起來(lái) ;byte/word:明確的告訴編譯器這條指令的數(shù)據(jù)寬度 ;不需要修飾:Mov [00],AL / Mov AX,[00] mov byte [es:0x01],0x07 ;將"字符L的屬性"存儲(chǔ)到顯存的第2個(gè)存儲(chǔ)單元中 ;屬性值07:黑底白字、無(wú)閃爍、無(wú)加亮mov byte [es:0x02],'a' mov byte [es:0x03],0x07mov byte [es:0x04],'b' mov byte [es:0x05],0x07mov byte [es:0x06],'e' mov byte [es:0x07],0x07mov byte [es:0x08],'l' mov byte [es:0x09],0x07mov byte [es:0x0a],' ' mov byte [es:0x0b],0x07mov byte [es:0x0c],"o" mov byte [es:0x0d],0x07mov byte [es:0x0e],'f' mov byte [es:0x0f],0x07mov byte [es:0x10],'f' mov byte [es:0x11],0x07mov byte [es:0x12],'s' mov byte [es:0x13],0x07mov byte [es:0x14],'e' mov byte [es:0x15],0x07mov byte [es:0x16],'t' mov byte [es:0x17],0x07mov byte [es:0x18],':' mov byte [es:0x19],0x07 ;----------------------------------------------------------------- mov ax,number ;將"標(biāo)號(hào)"存儲(chǔ)到ax寄存器中,作為下面除法運(yùn)算的:被除數(shù)的低16位 ;編譯器在編譯的時(shí)候會(huì)將number替換為其所對(duì)應(yīng)的的匯編地址 mov dx,0 ;將0存儲(chǔ)到dx寄存器中,作為下面除法運(yùn)算的:被除數(shù)的高16位 mov bx,10 ;將10,也就是二進(jìn)制的1010存儲(chǔ)到bx寄存器中,作為下面除法運(yùn)算的:除數(shù) ;以上三條指令為第2個(gè)步驟的除法運(yùn)算做好了準(zhǔn)備工作 ;----------------------------------------------------------------- mov cx,cs ;將代碼段寄存器cs中的值,也就是0x000,傳送到cx寄存器中 mov ds,cx ;將cx寄存器中的值,也就是0x000傳送到數(shù)據(jù)段寄存器ds中 ;ds寄存器中存儲(chǔ)的是本程序在內(nèi)存中的段地址 ;----------------------------------------------------------------- div bx ;對(duì)應(yīng)第1次除法運(yùn)算 ;商存儲(chǔ)在ax寄存器中,作為下次運(yùn)算的被除數(shù) ;余數(shù),也就是標(biāo)號(hào)的個(gè)位上的值存儲(chǔ)在dx寄存器中 mov [0x7c00+number+0x00],dl ;將第1次除法運(yùn)算所得到的標(biāo)號(hào)個(gè)位上的值 ;存入了我們使用db所聲明的第1個(gè)存儲(chǔ)單元中 xor dx,dx ;異或指令:對(duì)兩個(gè)數(shù)進(jìn)行異或運(yùn)算,并將結(jié)果存儲(chǔ)到目的操作數(shù)中 ;異或運(yùn)算的特點(diǎn):相同為0,不同為1 ;這條指令的作用:將dx寄存器中的值清零 ;為第2次除法運(yùn)算做準(zhǔn)備 div bx ;對(duì)應(yīng)第2次除法運(yùn)算 mov [0x7c00+number+0x01],dl ;將第2次除法運(yùn)算所得到的標(biāo)號(hào)十位上的值 ;存入了我們使用db所聲明的第2個(gè)存儲(chǔ)單元中xor dx,dx ;為第3次除法運(yùn)算做準(zhǔn)備 div bx ;對(duì)應(yīng)第3次除法運(yùn)算 mov [0x7c00+number+0x02],dl ;將第3次除法運(yùn)算所得到的標(biāo)號(hào)百位上的值 ;存入了我們使用db所聲明的第3個(gè)存儲(chǔ)單元中 ;----------------------------------------------------------------- mov al,[0x7c00+number+0x02] ;將標(biāo)號(hào)百位上的數(shù)值傳送給al寄存器 add al,0x30 ;獲得標(biāo)號(hào)百位上數(shù)值的ASCII碼 mov [es:0x1a],al ;將標(biāo)號(hào)百位上數(shù)值的ASCII碼存入顯存 mov byte [es:0x1b],0x04 ;將0x04存入顯存中偏移地址為0x1b的存儲(chǔ)單元 ;字符屬性04:黑底、紅字、無(wú)閃爍、無(wú)加亮mov al,[0x7c00+number+0x01] ;將標(biāo)號(hào)十位上的數(shù)值傳送給al寄存器 add al,0x30 ;獲得標(biāo)號(hào)十位上數(shù)值的ASCII碼 mov [es:0x1c],al ;將標(biāo)號(hào)十位上數(shù)值的ASCII碼存入顯存 mov byte [es:0x1d],0x04mov al,[0x7c00+number+0x00] ;將標(biāo)號(hào)個(gè)位上的數(shù)值傳送給al寄存器 add al,0x30 ;獲得標(biāo)號(hào)個(gè)位上數(shù)值的ASCII碼 mov [es:0x1e],al ;將標(biāo)號(hào)個(gè)位上數(shù)值的ASCII碼存入顯存 mov byte [es:0x1f],0x04mov byte [es:0x20],'D' ;將字符D的ASCII碼存入顯存 mov byte [es:0x21],0x07 ;字符屬性07:黑底白字、無(wú)閃爍、無(wú)加亮 ;----------------------------------------------------------------- infi jmp near infi ;無(wú)限循環(huán) ;----------------------------------------------------------------- number db 0,0,0,0,0 ;標(biāo)號(hào):number = 匯編地址 = 0x0100 ;書(shū)寫(xiě)規(guī)范:以字母開(kāi)頭 ;db:聲明并初始化數(shù)據(jù) ;聲明數(shù)據(jù)的本質(zhì)就是:在內(nèi)存中占用一塊空間 ;初始化數(shù)據(jù)的本質(zhì)就是:給這個(gè)空間賦予一個(gè)值 ;在內(nèi)存中占用了5個(gè)字節(jié)的空間,這5個(gè)字節(jié)的值都是0 ;----------------------------------------------------------------- times 249 db 0 ;讓編譯器重復(fù)生成db 0 ---- 249次 db 0x55,0xaa ;硬盤(pán)主引導(dǎo)扇區(qū)的有效標(biāo)志2.3 更精簡(jiǎn)的代碼實(shí)現(xiàn)
jmp near start;跳過(guò)下面的數(shù)據(jù)區(qū) mytext db 'L',0x07,'a',0x07,'b',0x07,'e',0x07,'l',0x07,' ',0x07,'o',0x07,\'f',0x07,'f',0x07,'s',0x07,'e',0x07,'t',0x07,':',0x07number db 0,0,0,0,0;-------------------------------------------------------------------- start: mov ax,0x07c0 mov ds,axmov ax,0xb800 mov es,ax;--------------------------------------------------------------------cld;作用:將方向標(biāo)志位清0 :正向 ;std指令:將方向標(biāo)志位置1:反向 mov si,mytext;所要傳送的數(shù)據(jù),它的偏移地址 mov di,0 ;所要傳送的位置,它的偏移地址 mov cx,(number-mytext)/2 ;所要傳送的次數(shù) rep movsw ;--------------------------------------------------------------------mov ax,number;AX:被除數(shù)的低16位;目的:讓它參與運(yùn)算,以得到標(biāo)號(hào)各個(gè)數(shù)位上的值 mov bx,ax;目的,將來(lái)存儲(chǔ)計(jì)算所得到的標(biāo)號(hào)各個(gè)數(shù)位上的值mov cx,5 ;運(yùn)算的次數(shù) mov si,10 ;除數(shù) ;-------------------------------------------------------------------- digit: xor dx,dxdiv simov [bx],dl;[bx]:指向了第2條DB指令所聲明的第1個(gè)存儲(chǔ)單元 inc bx;將bx寄存器中的值+1 ;目的:下一個(gè)循環(huán)中,讓[bx]指向第2條DB指令所聲明的第2個(gè)存儲(chǔ)單元 ;Dec:將bx寄存器中的值-1 loop digit;循環(huán) ;--------------------------------------------------------------------mov bx,number;bx:基址寄存器 mov si,4 ;SI:源變址寄存器 show:mov al,[bx+si];第1次循環(huán),將標(biāo)號(hào)萬(wàn)位上的值存儲(chǔ)到了al寄存器中;第2次循環(huán),將標(biāo)號(hào)千位上的值存儲(chǔ)到了al寄存器中add al,0x30 ;獲取標(biāo)號(hào)各個(gè)數(shù)位值的ASCII碼 mov ah,0x04 ;0x04:字符屬性 mov [es:di],ax ;將標(biāo)號(hào)的ASCII碼及其屬性存入顯存中;第1次循環(huán)-->萬(wàn)位 第2次循環(huán)-->千位 add di,2;為我們后面的循環(huán),存儲(chǔ)標(biāo)號(hào)數(shù)位上值的ASCII碼及其屬性做準(zhǔn)備 dec si;為我們后面的循環(huán),訪問(wèn)標(biāo)號(hào)各個(gè)數(shù)位的值做準(zhǔn)備 jns show ;jns:條件轉(zhuǎn)移指令 SF=0跳轉(zhuǎn) SF=1不跳轉(zhuǎn) ;--------------------------------------------------------------------mov word [es:di],0x0744;高字節(jié)07:字符屬性 低字節(jié)44:字符D的ASCII碼 jmp near $ ; == $ jmp near $;執(zhí)行效果 == infi jmp near infi ;$:當(dāng)做標(biāo)號(hào)來(lái)用 times 510-($-$$) db 0 ; == $ times 510-($-$$) db 0 ;$ = 當(dāng)前指令的匯編地址;$$ = 當(dāng)前段($$所在的段)的起始匯編地址 ;510-($-$$) = 為保證0x55和0xaa的位置,所需要添加的字節(jié)數(shù) db 0x55,0xaa參考資料:
總結(jié)
- 上一篇: 数组的本质分析
- 下一篇: 数据库与数据库管理系统的基本概念