1. 程式人生 > >組合語言實現在80*25彩色字元模式下顯示字串

組合語言實現在80*25彩色字元模式下顯示字串

記得大一剛接觸c語言的時候,用c語言打印出了彩色的字串,但感覺很神奇,轉眼間,已經成為大三狗了,哈哈^^. 好了,不說廢話了,今天,就來看看怎樣用匯編語言列印彩色的字串.

80*25彩色字元模式

在記憶體地址空間中,B8000H~BFFFFH共32KB的空間,為80*25彩色字元模式的顯示緩衝區,向這個地址空間寫資料,寫入的內容將立即出現在顯示器上.
在80*25彩色字元模式下,顯示器可以顯示25行,每行80個字元,每個字元可以有256種屬性(背景色,閃爍,高亮等組合資訊). 
這樣一個字元在顯示緩衝區中就要佔兩個位元組,分別存放字元的ASCII碼和屬性,80*25模式下,一屛內容在顯示緩衝區中佔4000個位元組.
顯示緩衝區分為8頁,每頁4KB,顯示器可以任意顯示任意一頁的內容,一般情況下,顯示第0頁的內容,也就是B8000~B8F9FH中的4000個位元組.  
然後大家可以想想第一頁的第一行是地址是從B8000H~???(ps:答案在最後給出)

tip:一行80個字元,一個字元佔2個位元組. 偶地址存放字元。
在顯示緩衝區中,偶地址存放字串,及地址存放字元的顏色屬性.
舉個例子:
場景:用匯編把”ABCD”以彩色的形式打印出來。(假設以80*25顯示緩衝區的第一頁開始存,)A的ASCII在B8000H(偶地址),顏色屬性在B800001(奇地址) .
一個在螢幕上顯示的字元,具有前景色(字元顏色),背景色,高亮度和閃爍的方式顯示,前景色、背景色、閃爍、高亮等資訊被記錄在顏色屬性的每一位中,
顏色屬性位元組格式:
7 6 5 4 3 2 1 0
含義: BL R G B

I R G B
閃   背景 前景

把”welocome to masm!”;用三種不同的顏色顯示在螢幕上.
程式碼如下:

assume cs:code,ds:data,ss:stack
data segment 
    db 'welcome to masm!' ;定義要顯示的字串(共16個位元組)
    db 02h,24h,71h  ;定義了三種顏色
data ends
stack segment 
    dw 8 dup(0
) ;定義棧段,儲存相關暫存器的值 stack ends code segment start: mov ax,data  mov ds,ax ;ds中存放data段的段地址  mov ax,stack mov ss,ax ;ss中存放stack段的段地址 mov sp,10h ;把sp指標指向棧頂的下一個地址. mov bx,0 ;存偏移地址,用來取每個字元 mov di,0 ; mov ax,0b872h;算出螢幕12行中間的視訊記憶體的段起始位置放入ax mov cx,3; 外迴圈為3次,因為要顯示三個w字串 s3: push cx push ax push di ;三個進棧操作作為外迴圈s3儲存相關暫存器的值,以防它們的值在內迴圈中被破壞 mov es,ax mov si,0 mov di,0 mov cx,10h s1: mov al,ds:[bx+si] mov es:[bx+di],al inc si ;讀下一個字元 add di,2 ;每存一個字元,空一個位元組,在下一個迴圈中存放顏色屬性值. loop s1;此迴圈實現在偶地址中存放字串 mov si,1 ;將si置為1,為在奇地址中存放字元的顏色. pop di ;將di的值恢復成進入內迴圈之前的時候的值 mov al,ds:10h[bx+di] ;取顏色屬性 mov cx,10h ;第二個內迴圈也為10h次 s2: mov es:[bx+si],al add si,2 loop s2 ;此迴圈實現奇地址存放字元的顏色屬性. inc di ;取第二種顏色 pop ax  add ax,0ah ; 將視訊記憶體的段起始地址設為當前行的下一行 pop cx loop s3 mov ax,4c00h int 21h code ends end start

執行結果:
這裡寫圖片描述