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
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