2017年8月

BIOS 中断

BIOS 中断调用( BIOS interrupt calls),为一些软件提供使用BIOS 上的一些功能.一些操作系统在系统引导时也使用BIOS以检测并初始化硬件资源.

需要使用的中断

主要使用INT 10h 中断,是一个视频服务中断.

The BIOS receives requests to perform functions through software interrupts. Software interrupts, generated by the operating system or by a user application, are generated with INT nnh instructions, where nnh is a number that is assigned to a specific type of service, such as 16h for keyboard input, 10h for video output, or 13h for disk I/O.

BIOS通过软件中断接收执行功能的请求。软件使用INT nnh生成由操作系统或用户应用程序生成的中断指令,其中nnh是分配给特定类型服务的数字,例如16h键盘输入,10h用于视频输出,或13h用于磁盘I / O.

INT 10h 中断工作原理

EMBEDDED BIOS actually begins handling an INT 10h request in its CONIO module, which determines whether the video should be redirected over a serial link.

If CONIO determines that the INT 10h service should not be redirected to a serial device, then it passes control to one of the modules that handle video controllers, such as module VIDEO, which manipulates the 6845 CRT controller registers directly to manage the display. Actual writing of data to the video screen and reading characters from the screen is accomplished by memory reads and writes to video regeneration memory.

EMBEDDED BIOS实际上开始在其CONIO模块中处理INT 10h请求时,将确定视频是否应通过串行链接重定向。如果CONIO确定INT 10h服务不应重定向到串行设备,那么它会将控制,传递到处理视频控制器的模块之一,例如模块VIDEO.其中直接操作6845 CRT控制器寄存器来管理显示器.实际通过读取寄存器中被写入的数来实现视频屏幕的数据读取或在屏幕打印字符,读入的数据会存在视频的寄存器中.

这个中断调用正是我们需要的.具体的函数BIOS 会根据AH 寄存器中的值来调用相关的函数.
如下表

中断   描述
INT 10hAH=0x13 写字符串
AH=0x03 获取游标位置和形态

Write String (0x13, BIOS versions from 1/10/86)

输入参数:

  • AH - 0x13, 指定打印字符串功能
  • AL - 打印模式 (为1 时,光标移动,字符串属性放在BL 寄存器)
  • BH - 视频页码, (用来干啥的还不清楚...)
  • BL - 如果AL寄存器为 1 或者 0,设置属性
  • CX - 存放字符串长度
  • DH - 行坐标
  • DL - 纵坐标
  • ES:BP - 指向字符串的指针

当DH 寄存器和DL 寄存器为0x00时,光标会在屏幕的左上角打印.(为了漂亮)因此我们需要在打印之前获取光标的位置.
返回:

  • Nothing...

AL寄存器存放数据图示:

    |7|6|5|4|3|2|1|0|  AL
     | | | | | | | `---- 0=don't move cursor, 1=move cursor
     | | | | | | `----- 0=BL has attributes, 1=string has attributes
     `---------------- unused

Read Cursor Position and Size(0x03)

输入参数:

  • AH - 0x03 指定获取光标位置的功能
  • AL - 视频页码

返回:

  • CH - 光标开始扫描线
  • CL - 光标结束扫描线
  • DH - 行
  • DL - 列

AT&T Assembly

.code16
.equ BOOTSEC, 0x07c0

.global _start
.text
ljmp $BOOTSEC, $_start
_start:
    movb $0x03, %ah
    int $0x10

    movw $BOOTSEC, %ax
    movw %ax, %es
    movw $string, %bp
    movw $0x1301, %ax
    movw $0x0003, %bx          # 0x03 蓝绿色,就它了!
    movw $13, %cx
    int $0x10

loop:
    jmp loop                   # 不设置死循环基本看不见...
string:
    .ascii "Hello world"
    .byte 13, 10               # ascii码,\r\n

.= 510
boot_flag:
.word 0xaa55

编写连接脚本用来提取.text段..略略略

截图
3992685213.png


参考资料: