加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2015-07-22 10:31:59)
标签:

股票

分类: 设计操作系统

 

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

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


编译方法:nasm test.asm -o test.bin


bochs的配置文件为:
  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:  
  7. log: bochsout.txt  
  8. mouse: enabled=0  
  9. cpu:count=1,ips=15000000  
  10. vga_update_interval: 150000  
  11. i440fxsupport: enabled=1  

运行效果为(静态截图无法看到闪烁效果):

http://img.blog.csdn.net/2015020123145369310h 13号中断)" />


最后,记录一下直接写入显存以显示字符串的代码:

[plain] view plaincopy
  1. mov ax, 0x7c0  
  2. mov ds, ax  
  3.   
  4. mov ax, 0xb800  
  5. mov es, ax  
  6. mov ax, text  
  7. mov si, ax  
  8.   
  9. mov cx, textlen  
  10. mov ah, 0x7c  
  11. cld  
  12. DispStr:  
  13.     lodsb  
  14.     stosw  
  15.     loop DispStr  
  16. jmp  
  17.   
  18. text: db "this is test"  
  19. textlen equ $-text  
  20. times 510-($-$$) db  
  21. dw 0xaa55  

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有