实验九 根据材料编程(改变字体颜色)
編程:在屏幕中間分別顯示 綠色、綠底紅色、白底藍(lán)色的字符串’welcome to masm!'
一個(gè)字符在屏幕上占用兩個(gè)字節(jié) 低地址存放ASCII碼,高地址存放字符的屬性
偶數(shù)地址都是存放字符的ASCII碼,奇數(shù)地址都是存放字符的顏色
編程所需要的的知識(shí):
80*25彩色字符模式顯示緩沖區(qū)(以下簡(jiǎn)稱為顯示緩沖區(qū))的結(jié)構(gòu):
內(nèi)存地址中,B8000H~BFFFFH共32kb的空間,為80 * 25彩色字符模式的顯示緩沖區(qū)。向這個(gè)地址空間寫(xiě)入數(shù)據(jù),寫(xiě)入的內(nèi)容將立即出現(xiàn)在顯示器上。
在80*25彩色字符模式下,顯示器可以顯示25行,每行80個(gè)字符,每個(gè)字符可以有256種屬性(背景色、前景色、閃爍、高亮等組合信息)
這樣,一個(gè)字符在顯示緩沖區(qū)中就要占兩個(gè)字節(jié),分別存放ASCII和屬性。80*25模式下,一屏的內(nèi)容在顯示緩沖區(qū)中共占4000個(gè)字節(jié)
顯示緩沖區(qū)分為八頁(yè),每頁(yè)4KB(約等于4000B),顯示器可以顯示任意一頁(yè)的內(nèi)容。一般情況下,顯示第0頁(yè)的內(nèi)容。也就是說(shuō)通常情況下,B8000H~B8F9FH中的4000個(gè)字節(jié)的內(nèi)容將出現(xiàn)在顯示器上。
在一頁(yè)顯示緩沖區(qū)中:
偏移000~09F對(duì)應(yīng)顯示器上的第一行(80個(gè)字符占160個(gè)字節(jié))
偏移0A0~13F對(duì)應(yīng)顯示器上的第二行
偏移140~1DF對(duì)應(yīng)顯示器上的第三行
以此類推,可知,偏移F00~F9F對(duì)應(yīng)顯示器上第25行
第1行最后一個(gè)是第158個(gè)字節(jié)(9EH)因?yàn)閺牧汩_(kāi)始
第二行最后一個(gè)字符的地址是(158+160=318——》13E)
在一行中,一個(gè)字符占兩個(gè)字節(jié)的存儲(chǔ)空間(一個(gè)字),低位字節(jié)存儲(chǔ)ASCII碼,高位字節(jié)存儲(chǔ)字符的屬性。一行共有80個(gè)字符,占160個(gè)字節(jié)。*
處理第一行
先處理一行:
;實(shí)驗(yàn)九 ;編程:在屏幕中間分別顯示 綠色、綠底紅色、白底藍(lán)色的字符串'welcome to masm!' ;數(shù)據(jù)的組織 ;數(shù)據(jù)的處理 一個(gè)字符在屏幕上占用兩個(gè)字節(jié) 低(偶數(shù))地址存放ASCII碼,高(奇數(shù))地址存放字符的屬性 assume cs:code,ds:data,ss:stack data segment; '0123456789ABCDEF'db 'welcome to masm!' ;等會(huì)用ds:[si]去訪問(wèn)它;0000 0000 前四位是背景,后四位是前景db 00000010B;綠色 ; rgb rgb db 00100100B;綠底紅色 等會(huì)用ds:[bx]去訪問(wèn)顏色db 01110001B;白底藍(lán)色 data endsstack segment stackdb 128 dup (0) stack endscode segment start:mov ax,datamov ds,axmov ax,stackmov ss,axmov sp,128mov bx,0B800h ;數(shù)據(jù)寫(xiě)到哪里去mov es,bxmov si,0mov di,160*10+30*2 ;di設(shè)置在屏幕上的位置 這是一個(gè)偶數(shù)地址(存放ASCII)mov bx,16mov dx,0 ; 用一個(gè)十六位寄存器去保存字符(因?yàn)橐粋€(gè)字符占用兩個(gè)字節(jié));先處理一行mov cx,16mov dh,ds:[bx] ; mov es:[di] es:[di+0],dl es:[di+1],dh showRow:mov dl,ds:[si] ;讀取字符數(shù)據(jù)mov es:[di],dxadd di,2inc siloop showRow總共要顯示三行,總共是三種顏色,完整代碼:
總代碼
;實(shí)驗(yàn)九 ;編程:在屏幕中間分別顯示 綠色、綠底紅色、白底藍(lán)色的字符串'welcome to masm!' ;數(shù)據(jù)的組織 ;數(shù)據(jù)的處理 一個(gè)字符在屏幕上占用兩個(gè)字節(jié) 低地址存放ASCII碼,高地址存放字符的屬性 assume cs:code,ds:data,ss:stack data segment; '0123456789ABCDEF'db 'welcome to masm!' ;等會(huì)用ds:[si]去訪問(wèn)它;0000 0000 前四位是背景,后四位是前景db 00000010B;綠色 ; rgb rgb db 00100100B;綠底紅色 等會(huì)用ds:[bx]去訪問(wèn)顏色db 01110001B;白底藍(lán)色 data endsstack segment stackdb 128 dup (0) stack endscode segment start:mov ax,datamov ds,axmov ax,stackmov ss,axmov sp,128mov bx,0B800h ;數(shù)據(jù)寫(xiě)到哪里去mov es,bxmov si,0mov di,160*10+30*2 ;di設(shè)置在屏幕上的位置 這是一個(gè)偶數(shù)地址(存放ASCII)mov bx,16mov dx,0 ; 用一個(gè)十六位寄存器去保存字符(因?yàn)橐粋€(gè)字符占用兩個(gè)字節(jié))mov cx,3;處理三行;編程習(xí)慣:按照順序來(lái)push showMasm:push bxpush cxpush sipush di;先處理一行mov cx,16mov dh,ds:[bx] ; mov es:[di] es:[di+0],dl es:[di+1],dh showRow:mov dl,ds:[si] ;讀取字符數(shù)據(jù)mov es:[di],dxadd di,2inc siloop showRowpop dipop sipop cxpop bxadd di,160//換一行inc bxloop showMasmmov ax,4c00hint 21hcode ends end start代碼雜糅,但是容易理解的代碼
assume cs:code,ds:data,ss:stack data segment; '0123456789ABCDEF'db 'welcome to masm!' ;用ds:[si]去訪問(wèn)它 data endscode segment start: ;手動(dòng)設(shè)置dsmov ax,datamov ds,ax ;設(shè)置顯示緩沖區(qū),用es設(shè)置 ,向es記錄的內(nèi)存中寫(xiě)入數(shù)據(jù)mov bx,0B800h ;數(shù)據(jù)寫(xiě)到哪里去mov es,bx ;初始化si和di,si要指向要復(fù)制的字符,di指向目的空間;mov si,0 mov di,10*160+60;從這個(gè)地方開(kāi)始顯示 ;設(shè)置循環(huán)次數(shù)mov cx,16 s1:mov al,ds:[si];設(shè)置顯示字符mov ah,00000010B;設(shè)置顯示屬性 mov es:[di],ax inc si inc diinc diloop s1 ;---------------------復(fù)制上面代碼再來(lái)一遍------------------------ ;初始化si和di,si要指向要復(fù)制的字符,di指向目的空間;mov si,0 mov di,11*160+60;從這個(gè)地方開(kāi)始顯示 這里是第11行,寫(xiě)成11*160+60;設(shè)置循環(huán)次數(shù)mov cx,16 s2:mov al,ds:[si];設(shè)置顯示字符mov ah,00100100B;設(shè)置顯示屬性 mov es:[di],ax inc si inc diinc diloop s2 ;---------------------復(fù)制上面代碼再來(lái)一遍------------------------ ;初始化si和di,si要指向要復(fù)制的字符,di指向目的空間;mov si,0 mov di,12*160+60;從這個(gè)地方開(kāi)始顯示 這里是第12行,寫(xiě)成12*160+60;設(shè)置循環(huán)次數(shù)mov cx,16 s3:mov al,ds:[si];設(shè)置顯示字符mov ah,01110001B;設(shè)置顯示屬性 mov es:[di],ax inc si inc diinc diloop s3;正常結(jié)束 mov ax,4c00hint 21h code ends end start總結(jié)
以上是生活随笔為你收集整理的实验九 根据材料编程(改变字体颜色)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux部署jar项目报错_Sprin
- 下一篇: BUUCTF-Reverce:不一样的f