使用BIOS中斷顯示字符串筆記(int 10h 13號中斷)

BIOS的10H中斷的13號中斷用於顯示字符串,參數爲:

1、AH=13H

2、AL=顯示方式

      如果AL=0,表示目標字符串僅僅包含字符,屬性在BL中包含,不移動光標

      如果AL=1,表示目標字符串僅僅包含字符,屬性在BL中包含,移動光標

      如果AL=2,表示目標字符串包含字符和屬性,不移動光標

      如果AL=3,表示目標字符串包含字符和屬性,移動光標

      總之,可以歸納爲:    

           |BIT7|BIT6|BIT5|BIT4|BIT3|BIT2|BIT1|BIT0| AL

             BIT0爲0表示不移動光標,爲1表示移動光標

             BIT1爲0表示字符串僅包含字符,爲1表示字符串包含屬性

             BIT2~BIT7未使用


3、BH表示視頻區頁數

4、如果AL的BIT1爲0,則BL表示顯示屬性。屬性爲:

      |BIT7|BIT6|BIT5|BIT4|BIT3|BIT2|BIT1|BIT0| BL

         BIT7:背景是否閃爍。0不閃爍,1閃爍

         BIT6~BIT4爲背景色,分別爲RGB,000爲黑色,111爲白色

         BIT3爲1,則前景色加亮,爲0則不加亮

         BIT2-BIT0爲前景色,意義同背景色

5、CX爲字符串長度

6、DH表示在第幾行顯示(0爲第一行)

7、DL表示在第幾列顯示(0爲第一列)

8、ES:BP指向字符串


以下是一段測試代碼,顯示爲閃爍白色背景,紅色前景。

這是一段扇區引導程序,使用NASM語法編寫,在windows環境下測試通過。使用bochs或者virtualbox 等虛擬機可以看到運行結果。

test.asm:

mov ax, 0x7c0                         ; BIOS將代碼加載到內存0x7c00處,因此段地址爲0x7c
mov ds, ax                            ; 初始化數據段
mov es, ax                            ; 用於指向字符串

mov ax, Message                       ; es:bp指向要顯示的字符串
mov bp, ax
mov ah, 0x13                          ; ah爲0x13,調用13號中斷
mov al, 0                             ; al爲0,不移動光標,字符串中沒有屬性內容
mov bh, 0                             ; 第0頁顯示
mov bl, 0xFC                          ; 閃爍白色背景,紅色加亮前景
mov cx, MessageLen                    ; 字符串長度
mov dx, 0                             ; dh=0, dl=0, 即第0行,第0列
int 10h                               ; 調用10H中斷

jmp $                                 ; 無限循環,防止代碼進入數據區

Message db "This is a test!"
MessageLen equ $ - Message
times 510-($-$$) db 0                 ; 在中間填充0
    db 0x55, 0xaa                     ; 在第511和512字節處寫入引導程序標誌位


編譯方法:nasm test.asm -o test.bin


bochs的配置文件爲:

megs: 32
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
vga: extension=vbe
floppya: 1_44=test.bin, status=inserted
boot: a
log: bochsout.txt
mouse: enabled=0
cpu:count=1,ips=15000000
vga_update_interval: 150000
i440fxsupport: enabled=1

運行效果爲(靜態截圖無法看到閃爍效果):


最後,記錄一下直接寫入顯存以顯示字符串的代碼:

mov ax, 0x7c0
mov ds, ax

mov ax, 0xb800
mov es, ax
mov ax, text
mov si, ax

mov cx, textlen
mov ah, 0x7c
cld
DispStr:
	lodsb
	stosw
	loop DispStr
jmp $

text: db "this is a test"
textlen equ $-text
times 510-($-$$) db 0
dw 0xaa55


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章