代码、内容参考来自于包括《操作系统真象还原》、《一个64位操作系统的设计与实现》以及《ORANGE’S:一个操作系统的实现》。
1.概述
BIOS(Basic Input Output System),即基本输入输出系统。存在主板的ROM区,负责计算机的启动自检。
BIOS的主要功能包括:
- POST(Power-On Self-Test):开机自检,检测计算机硬件是否正常工作。
- 引导操作系统:从启动设备(如硬盘、光驱等)加载操作系统。
- 提供系统设置:允许用户设置计算机的日期、时间、启动顺序等参数。
BIOS有自动寻找硬件功能,只要是0x55aa结尾,那么,我们就能把它当作引导扇区使用。同时,BIOS 在实际的物理内存中是由布局的我们必须小心,不要破坏这个结构。
BIOS自检设备开始。当BIOS自检结束后会根据启动选项设置(这里指软驱启动)去选择启动设备,即检测软盘的第0磁头第0磁道第1扇区,是否以数值0x55和0xaa两字节作为结尾。如果是,那么BIOS就认为这个扇区是一个Boot Sector (引导扇区),进而把此扇区的数据复制到物理内存地址0x7c00处,随后将处理器的执行权移交给这段程序(跳转至0x7c00地址处执行)。
内存中,一个容量只有512 B的引导扇区是无法容纳操作系统的,甚至连获取硬件信息的检测程序都容纳不下。鉴于如此苛刻的容量限制, Boot引导程序仅能作为一级助推器,将功能更强大的引导加载程序Loader装载到内存中,这也可以看做是硬件设备向软件移交控制权。一旦Loader引导加载程序开始执行,那么一切都交由我们编写的软件来控制。
这里我们先使用实模式来演示。
这是实模式下1MB的结构。

可以看到MBR在7c00地址加载。这也是为什么之前我们要在7c00开始。
2.常见参数解释
在写一个简单的MBR程序之前,先解释一下常用的参数。
下面的代码通过BIOS中断服务程序int 10h实现屏幕信息显示相关操作。INT 10h中断服务程序要求在调用时,必须向AH寄存器传入服务程序的主功能编号,再向其他寄存器传入参数。
以下是完整程序实现。
;====== clear screem mov ax,0600h mov bx,0700h mov cx,0 mov dx,0184fh int 10h ;====== set focus mov ax,0200h mov bx,0000h mov dx,0000h int 10h ;====== display on screen : Start Booting mov ax,1301h mov bx,000fh mov dx,0000h mov cx,10 push ax mov ax,ds mov es,ax pop ax mov bp,StartBootMessage int 10h
清空屏幕
;====== clear screem mov ax,0600h mov bx,0700h mov cx,0 mov dx,0184fh int 10h
解释:
- mov ax, 0600h:设置 BIOS 视频功能 06h,用于清空屏幕。
- mov bx, 0700h:设置屏幕文本的属性字节(文字颜色和背景颜色)07h 表示白色背景黑色前景。
- mov cx, 0 和 mov dx, 0184fh:设置要清空的屏幕区域,从左上角(第0行第0列)到右下角(第24行第79列)。
- int 10h:调用 BIOS 视频中断服务以执行清屏操作。
BIOS中断服务程序INT 10h的主功能号AH-06h可以实现按指定范围滚动窗口的功能,同时也具备清屏功能,具体寄存器参数说明如下。
INT 10h, AH=06h功能:按指定范围滚动窗口。
AL:滚动的列数,若为0则实现清空屏幕功能;
BH:滚动后空出位置放入的属性;
CH:滚动范围的左上角坐标列号;
CL:滚动范围的左上角坐标行号;
DH:滚动范围的右下角坐标列号;
DL:滚动范围的右下角坐标行号;
BH:颜色属性:
- bit0-2:字体颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。
- bit3:字体亮度(0:字体正常,1:字体高亮度)。
- bit4-6:背景颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。
- bit 7:字体闪烁(0:不闪烁,1:字体闪烁)。
BH的显示举个例子:0x07 表示白色字体、字体正常、白色背景、不闪烁

这条命令主要用于按指定范围滚动窗口,但是如果AL=0的话,则执行清屏功能。在使用清屏功能时(AL寄存器为0),其他BX、 CX、 DX寄存器参数将不起作用,无需纠结它们的数值。
设置光标位置
;====== set focus mov ax,0200h mov bx,0000h mov dx,0000h int 10h
解释:
- mov ax, 0200h:设置 BIOS 视频功能 02h,用于设置光标位置。
- mov bx, 0000h:指定页面号(在文本模式下通常为0)表示文本模式。
- mov dx, 0000h:将光标位置设置为第0行第0列(屏幕左上角)。
- int 10h:调用 BIOS 视频中断服务以设置光标位置。
设置屏幕光标位置BIOS中断服务程序INT 10h的主功能号AH=02h可以实现屏幕光标位置的设置功能,具体寄存器参数说明如下。
INT 10h,AH=02h功能:设定光标位置。
DH=游标的列数;
DL=游标的行数;
BH=页码。
这条语句的目的是,将屏幕的光标位置设置在屏幕的左上角(0,0)处。不论是行号还是列号,它们皆从0开始计数,屏幕的列坐标0点和行坐标0点位于屏幕的左上角,纵、横坐标分别向下和向右两个方向延伸,或者说坐标原点位于屏幕左上角。
显示 “Start Booting” 消息
;====== display on screen : Start Booting mov ax,1301h mov bx,000fh mov dx,0000h mov cx,10 push ax mov ax,ds mov es,ax pop ax mov bp,StartBootMessage int 10h
解释:
- mov ax, 1301h:设置 BIOS 视频功能 13h,用于显示字符串。
- mov bx, 000fh:指定字符串的属性字节(文本颜色和背景色,0Fh 表示白色背景黑色前景)。
- mov dx, 0000h:设置字符串的起始位置为第0行第0列。
- mov cx, 10:指定要显示的字符串长度(假设消息长度为10个字符)。
- push ax : 将 AX 寄存器保存在堆栈中
- mov ax, ds : 获取当前数据段
- mov es, ax :将 ES 寄存器设置为当前数据段
- pop ax :从堆栈中恢复 AX 寄存器
- push ax、mov ax, ds、mov es, ax、pop ax:这些指令用于设置显示字符串时的段地址。
- mov bp, StartBootMessage:将字符串 StartBootMessage 的偏移地址加载到 BP 寄存器中。
- int 10h:调用 BIOS 视频中断服务以在指定位置显示带有指定属性的字符串。
BIOS中断服务程序INT 10h的主功能号AH=13h可以实现字符串的显示功能,具体寄存器参数说明如下。
INT 10h,AH=13h 功能:显示一行字符串。
AL:写入模式。
- AL=00h:字符串的属性由BL寄存器提供,而CX寄存器提供字符串长度(以B为单位),显示后光标位置不变,即显示前的光标位置。
- AL=01h:同AL=00h,但光标会移动至字符串尾端位置。
- AL=02h:字符串属性由每个字符后面紧跟的字节提供,故CX寄存器提供的字符串长度改成以Word为单位,显示后光标位置不变。
- AL=03h:同AL=02h,但光标会移动至字符串尾端位置。
CX:字符串的长度。
DH:游标的坐标行号。
DL:游标的坐标列号。
ES:BP=>要显示字符串的内存地址。
BH=页码。
BL=字符属性/颜色属性:
- bit0-2:字体颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。
- bit3:字体亮度(0:字体正常,1:字体高亮度)。
- bit4-6:背景颜色(0:黑,1:蓝,2:绿,3:青,4:红,5:紫,6:综,7:白)。
- bit 7:字体闪烁(0:不闪烁,1:字体闪烁)。
用于显示字符串、设定字体的前景色和背景色,还可以设置待显示字符串的坐标位置。
上面的代码暂时不需要执行,了解一下参数的使用,后面会频繁用到。
3.参考
郑钢著操作系统真象还原
田宇著一个64位操作系统的设计与实现
丁渊著ORANGE’S:一个操作系统的实现


