使用BIOS中断显示字符串笔记(int 10h 13号中断)
2015-07-22 10:31阅读:
: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:
[plain] view
plaincopy
- 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的配置文件为:
[plain] view
plaincopy
- 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
运行效果为(静态截图无法看到闪烁效果):

最后,记录一下直接写入显存以显示字符串的代码:
[plain] view
plaincopy
- 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