新浪博客

使用BIOS中断显示字符串笔记(int 10h 13号中断)

2015-07-22 10:31阅读:

使用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:
[plain] view plaincopy 在CODE上查看代码片 派生到我的代码片
  1. mov ax, 0x7c0 ; BIOS将代码加载到内存0x7c00处,因此段地址为0x7c
  2. mov ds, ax ; 初始化数据段
  3. mov es, ax ; 用于指向字符串
  4. mov ax, Message ; es:bp指向要显示的字符串
  5. mov bp, ax
  6. mov ah, 0x13 ; ah为0x13,调用13号中断
  7. mov al, 0 ; al为0,不移动光标,字符串中没有属性内容
  8. mov bh, 0 ; 第0页显示
  9. mov bl, 0xFC ; 闪烁白色背景,红色加亮前景
  10. mov cx, MessageLen ; 字符串长度
  11. mov dx, 0 ; dh=0, dl=0, 即第0行,第0列
  12. int 10h ; 调用10H中断
  13. jmp $ ; 无限循环,防止代码进入数据区
  14. Message db 'This is a test!'
  15. MessageLen equ $ - Message
  16. times 510-($-$$) db 0 ; 在中间填充0
  17. db 0x55, 0xaa ; 在第511和512字节处写入引导程序标志位



编译方法:nasm test.asm -o test.bin
bochs的配置文件为: [plain] view plaincopy 在CODE上查看代码片 派生到我的代码片
  1. megs: 32
  2. romimage: file=$BXSHARE/BIOS-bochs-latest
  3. vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
  4. vga: extension=vbe
  5. floppya: 1_44=test.bin, status=inserted
  6. boot: a
  7. log: bochsout.txt
  8. mouse: enabled=0
  9. cpu:count=1,ips=15000000
  10. vga_update_interval: 150000
  11. i440fxsupport: enabled=1

运行效果为(静态截图无法看到闪烁效果):
最后,记录一下直接写入显存以显示字符串的代码:
[plain] view plaincopy
  1. mov ax, 0x7c0
  2. mov ds, ax
  3. mov ax, 0xb800
  4. mov es, ax
  5. mov ax, text
  6. mov si, ax
  7. mov cx, textlen
  8. mov ah, 0x7c
  9. cld
  10. DispStr:
  11. lodsb
  12. stosw
  13. loop DispStr
  14. jmp $
  15. text: db 'this is a test'
  16. textlen equ $-text
  17. times 510-($-$$) db 0
  18. dw 0xaa55

我的更多文章

下载客户端阅读体验更佳

APP专享