首页 > 代码库 > 使用BIOS中断显示字符串笔记(int 10h 13号中断)
使用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
运行效果为(静态截图无法看到闪烁效果):
使用BIOS中断显示字符串笔记(int 10h 13号中断)