第二章 -----编写MBR主引导记录
1.8086计算机开机时,CPU的cs:ip寄存器被强制初始化为0xF000:0xFFF0,在实模式下由于CPU访问的内存是段地址+便宜地址的方式实现的,所以0xF000:0xFFF0,访问的是0xF000*16+0xFFF0
2.BIOS及其功能
BIOS 全称叫 Base Input & Output System,即基本输入输出系统。其本身也是一个程序程序要执行,就要有个入口地址才行,此入口地址便是 0xFFFF0。这个地址存放着一条指令,该指令是跳转到BIOS程序入口,共16B在开机的一瞬间,也就是接电的一瞬间,CPU 的 cs:ip 寄存器被强制初始化为 0xF000:0xFFF0。由于 开机的时候处于实模式,在实模式下的段基址要乘以16,也就是左移4位,于是0xF000:
1.硬件自检:
2.建立一些需要用到的数据结构与中断向量表
3.校验启动盘中位于0盘0道1扇区的内容,是否放着主导记录MBR,校验方法是检测这扇区最后俩个字节是不是0x55与0xaa,所以我们编写的主导引记录MBR最后俩个字节也是这俩个
4.在3.的基础上将该扇区内容加载至0x7c00内存出,这个位置是由于历史遗留导致的兼容,由最初的操作系统本身所占据内存大小与布局所决定,加载完毕后跳转过去执行
3.为什么是0x7c00?
BIOS 最后一项工作校验启动盘中位于 0 盘 0 道 1 扇区的内容。
在计算机中习惯以 0 作为起始索引的,以“相对”的概念,即偏移量来表示位置,很多指令中的操作数都是用偏移量表示的。0 盘 0 道 1 扇区本质上就相当于 0 盘 0 道 0 扇区。为什么称为 1 呢,因为硬 盘扇区的表示法有两种,我们描述 0 盘 0 道 1 扇区用的便是其中的一种:CHS 方法,即柱面 Cylinder 磁 头 Header 扇区 Sector(另外一种是 LBA 方式,暂不关心),“0 盘”说的是 0 磁头,因为一张盘是有上下 两个盘面的,一个盘面上对应一个磁头,所以用磁头 Header 来表示盘面。“0 道”是指 0 柱面,柱面 Cylinder 指的是所有盘面上、编号相同的磁道的集合,就是把很多环叠摞在一起之后是一个立体的管状。
“1 扇区”:将磁道等距划分成一段段的小区间,由于磁道是圆环状,被划分出来的小区间便是扇形,所以称为扇区。在 CHS 方式中扇区的编号是从 1 开始的,不是 0,所以 0 盘 0 道 1 扇区其实就相当于 0 盘 0 道 0 扇区,它就是磁盘上最开始的那个扇区。而 LBA 方式中, 扇区编号是从 0 开始的。只要知道 MBR 所在的位置是磁盘上最开始的那个扇区就行了。
4.MBR的任务
加载loader,由loader加载操作系统到指定的位置,然后执行加载过来的操作系统。MBR大小必须是512字节,这儿是为了占满硬盘0盘0道1扇区,且最后俩个字节是0x55与0xaa
5好用的$和$$,令人迷惑的 section
1.$和$$是编译器 NASM 预留的关键字,表示当前行和本 section 的地址,起标号的作用,它 是 NASM 提供的,并不是 CPU 原生支持的,相当于伪指令一样,对 CPU 来说是假的。伪指令是相对于 CPU 可识别的指令来说的,它(伪指令)只是编译器定义的,CPU 中并不存在这个指令,让 CPU 执行这些伪指令,CPU 会抛出“UD(未定义的操作码)”异常。伪指令是编译器为了开发人员写代码方便而提供的一些符号,这些符号在编译时,会由编译器转换成 CPU 可识别的东西,如指令或地址等。
6.代码2-1(c2/a/boot/mbr.S)解释
1.;主引导程序
2 ;------------------------------------------------------------
3 SECTION MBR vstart=0x7c00 ;作为起始地址,最后程序会加载到0x7c00处
4 mov ax,cs ;此时cs寄存器为0,将ax寄存器置0
5 mov ds,ax
6 mov es,ax
7 mov ss,ax
8 mov fs,ax
9 mov sp,0x7c00 ;sp寄存器是x86下默认的一个栈顶指针寄存器(star pointer)
10 ; 清屏利用 0x06 号功能,上卷全部行,则可清屏。
12 ; -----------------------------------------------------------
13 ;INT 0x10 功能号:0x06 功能描述:上卷窗口
14 ;------------------------------------------------------
15 ;输入:
16 ;AH 功能号= 0x06
17 ;AL = 上卷的行数(如果为 0,表示全部)
18 ;BH = 上卷行属性
19 ;(CL,CH) = 窗口左上角的(X,Y)位置
20 ;(DL,DH) = 窗口右下角的(X,Y)位置
21 ;无返回值:
11 ; 清屏利用 0x06 号功能,上卷全部行,则可清屏。
12 ; -----------------------------------------------------------
13 ;INT 0x10 功能号:0x06 功能描述:上卷窗口
14 ;------------------------------------------------------
15 ;输入:
16 ;AH 功能号= 0x06
17 ;AL = 上卷的行数(如果为 0,表示全部)
18 ;BH = 上卷行属性
19 ;(CL,CH) = 窗口左上角的(X,Y)位置
20 ;(DL,DH) = 窗口右下角的(X,Y)位置
21 ;无返回值:
22 mov ax, 0x600 ;aah中输入功能号
23 mov bx, 0x700 ;设置上卷行属性,0x70表示用黑底白字的属性填充空白行
24 mov cx, 0 ; 左上角: (0, 0)
25 mov dx, 0x184f ; 右下角: (80,25), 79,24
26 ; VGA 文本模式中,一行只能容纳 80 个字符,共 25 行。
27 ; 下标从 0 开始,所以 0x18=24,0x4f=79 (十六进制)
28 int 0x10 ; int 0x10
29
30 ;;;;;;;;; 下面这三行代码获取光标位置 ;;;;;;;;;
31 ;.get_cursor 获取当前光标位置,在光标位置处打印字符。
32 mov ah, 3 ; 输入: 3 号子功能是获取光标位置,需要存入 ah 寄存器
33 mov bh, 0 ; bh 寄存器存储的是待获取光标的页号
34
35 int 0x10 ; 输出: ch=光标开始行,cl=光标结束行
36 ; dh=光标所在行号,dl=光标所在列号
37
38 ;;;;;;;;; 获取光标位置结束 ;;;;;;;;;;;;;;;;
39
40 ;;;;;;;;; 打印字符串 ;;;;;;;;;;;
41 ;还是用 10h 中断,不过这次调用 13 号子功能打印字符串
42 mov ax, message
43 mov bp, ax ; es:bp 为串首地址,es 此时同 cs 一致,
44 ; 开头时已经为 sreg 初始化
45
46 ; 光标位置要用到 dx 寄存器中内容,cx 中的光标位置可忽略
47 mov cx, 5 ; cx 为串长度,不包括结束符 0 的字符个数
48 mov ax, 0x1301 ;子功能号 13 显示字符及属性,要存入 ah 寄存器,
49 ; al 设置写字符方式 ah=01: 显示字符串,光标跟随移动
50 mov bx, 0x2 ; bh 存储要显示的页号,此处是第 0 页,
51 ; bl 中是字符属性,属性黑底绿字(bl = 02h)
52 int 0x10 ; 执行 BIOS 0x10 号中断
53 ;;;;;;;;; 打字字符串结束 ;;;;;;;;;;;;;;;
54
55 jmp $ ; 使程序悬停在此
56
57 message db "1 MBR" ;定义一个message标号,标号就是代表后面“1 MBR”信息的地址
58 times 510-($-$$) db 0 ;重复性操作 程序大小设为510字节 不足的 补0
59 db 0x55,0xaa
功能:在屏幕上打印字符串“1 MBR”,背景色为黑色,前景色为绿色。
1.实现原理:用8086汇编语言编写显示字符的程序。该程序共512字节不足部分补0,且最后俩个字节是0x55与0xaa。程序用nasm编译后用dd命令写入bochs启动硬盘的0盘0道1扇区,BIOS会自动加载程序到内存中,然后自动跳转执行该程序
2.代码逻辑:清屏,获取光标位置,在光标位置处打印字符串
3.写代码:BIOS中断使用用法:BIOS中断大全(表格)_bios功能调用表格-CSDN博客
中断号 | 功能 | 参数 |
---|---|---|
1、显示服务(Video Service——INT 10H) | 00H —设置显示器模式 | (1)、功能00H功能描述:设置显示器模式 入口参数:AH=00H AL=显示器模式,见下表所示 出口参数:无 可用的显示模式如下所列: 显示模式 显示模式属性 显示模式 显示模式属性 00H 40×25 16色 文本 01H 40×25 16色 文本 02H 80×25 16色 文本 03H 80×25 16色 文本 04H 320×200 4色 05H 320×200 4色 06H 640×200 2色 07H 80×25 2色 文本 08H 160×200 16色 09H 320×200 16色 0AH 640×200 4色 0BH保留 0CH保留 0DH 320×200 16色 0EH 640×200 16色 0FH 640×350 2(单色) 10H 640×350 4色 10H 640×350 16色 11H 640×480 2色 12H 640×480 16色 13H 640×480 256色 对于超级VGA显示卡,我们可用AX=4F02H 和下列 BX的值 来设置其显示模式。 BX显示模式属性 BX显示模式属性 100H 640×400 256色 101H 640×480 256色 102H 800×600 16色 103H 800×600 256色 104H 1024×768 16色 105H 1024×768 256色 106H 1280×1024 16色 107H 1280×1024 256色 108H 80×60 文本模式 109H 132×25 文本模式 10AH 132×43 文本模式 10BH 132×50 文本模式 10CH 132×60 文本模式 |
01H —设置光标形状 | (2)、功能01H功能描述:设置光标形状 入口参数:AH=01H CH低四位=光标的起始行 CL低四位=光标的终止行 出口参数:无 | |
02H —设置光标位置 | (3)、功能02H功能描述:用文本坐标下设置光标位置 入口参数:AH=02H BH=显示页码 DH=行(Y坐标) DL=列(X坐标) 出口参数:无 | |
03H —读取光标信息 | (4)、功能03H功能描述:在文本坐标下,读取光标各种信息 入口参数:AH=03H BH=显示页码 出口参数:CH=光标的起始行 CL=光标的终止行 DH=行(Y坐标) DL=列(X坐标) | |
04H —读取光笔位置 | (5)、功能04H 功能描述:获取当前状态和光笔位置 入口参数:AH=04H 出口参数:AH=00h——光笔未按下/未触发,01h——光笔已按下/已触发 BX=象素列(图形X坐标) CH=象素行(图形Y坐标,显示模式:04H~06H) CX=象素行(图形Y坐标,显示模式:0DH~10H) DH=字符行(文本Y坐标) DL=字符列(文本X坐标) | |
05H —设置显示页 | (6)、功能05H 功能描述:设置显示页,即选择活动的显示页 入口参数:AH=05H AL=显示页 对于CGA、EGA、MCGA和VGA,其显示页如下表所列: 模式页数显示器类型 00H、01H0~7CGA、EGA、MCGA、VGA 02H、03H0~3CGA 02H、03H0~7EGA、MCGA、VGA 07H0~7EGA、VGA 0DH0~7EGA、VGA 0EH0~3EGA、VGA 0FH0~1EGA、VGA 10H0~1EGA、VGA 对于PCjr: AL=80H——读取CRT/CPU页寄存器 81H——设置CPU页寄存器 82H——设置CRT页寄存器 83H——设置CRT/CPU页寄存器 BH=CRT页(子功能号82H和83H) BL=CPU页(子功能号81H和83H) 出口参数:对于前者,无出口参数,但对PCjr在子功能80H~83H调用下,有:BH=CRT页寄存器,BL=CPU页寄存器 | |
06H、07H —初始化或滚屏 | (7)、功能06H和07H 功能描述:初始化屏幕或滚屏 入口参数:AH=06H——向上滚屏,07H——向下滚屏 AL=滚动行数(0——清窗口) BH=空白区域的缺省属性 (CH、CL)=窗口的左上角位置(Y坐标,X坐标) (DH、DL)=窗口的右下角位置(Y坐标,X坐标) 出口参数:无 | |
08H —读光标处的字符及其属性 | (8)、功能08H 功能描述:读光标处的字符及其属性 入口参数:AH=08H BH=显示页码 出口参数:AH=属性 AL=字符 | |
09H —在光标处按指定属性显示字符 | (9)、功能09H 功能描述:在当前光标处按指定属性显示字符 入口参数:AH=09H AL=字符 BH=显示页码 BL=属性(文本模式)或颜色(图形模式) CX=重复输出字符的次数 出口参数:无 | |
0AH —在当前光标处显示字符 | (10)、功能0AH 功能描述:在当前光标处按原有属性显示字符 入口参数:AH=0AH AL=字符 BH=显示页码 BL=颜色(图形模式,仅适用于PCjr) CX=重复输出字符的次数 出口参数:无 | |
0BH —设置调色板、背景色或边框 | (11)、功能0BH 功能描述:设置调色板、背景色或边框 入口参数:AH=0BH 设置颜色:BH=00H,BL=颜色 选择调色板:BH=01H,BL=调色板(320×200、4种颜色的图形模式) 出口参数:无 | |
0CH —写图形象素 | (12)、功能0CH 功能描述:写图形象素 入口参数:AH=0CH AL=象素值 BH=页码 (CX、DX)=图形坐标列(X)、行(Y) 出口参数:无 | |
0DH —读图形象素 | (13)、功能0DH 功能描述:读图形象素 入口参数:AH=0DH BH=页码 (CX、DX)=图形坐标列(X)、行(Y) 出口参数:AL=象素值 | |
0EH —在Teletype模式下显示字符 | (14)、功能0EH 功能描述:在Teletype模式下显示字符 入口参数:AH=0EH AL=字符 BH=页码 BL=前景色(图形模式) 出口参数:无 | |
0FH —读取显示器模式 | (15)、功能0FH 功能描述:读取显示器模式 入口参数:AH=0FH 出口参数:AH=屏幕字符的列数 AL=显示模式(参见功能00H中的说明) BH=页码 | |
10H —颜色 | (16)、功能10H 功能描述:颜色中断。其子功能说明如下: 功能号 子功能名称功能号 子功能名称 00H — 设置调色板寄存器01H — 设置边框颜色 02H — 设置调色板和边框03H — 触发闪烁/亮显位 07H — 读取调色板寄存器08H — 读取边框颜色 09H — 读取调色板和边框10H — 设置颜色寄存器 12H — 设置颜色寄存器块13H — 设置颜色页状态 15H — 读取颜色寄存器17H — 读取颜色寄存器块 1AH — 读取颜色页状态1BH — 设置灰度值 | |
11H —字体 | (17)、功能11H 功能描述:字体中断。其子功能说明如下: 子功能号子功能名称 00H装入用户字体和可编程控制器 10H装入用户字体和可编程控制器 01H装入8×14 ROM字体和可编程控制器 11H装入8×14 ROM字体和可编程控制器 02H装入8×8 ROM字体和可编程控制器 12H装入8×8 ROM字体和可编程控制器 03H设置块指示器 04H装入8×16 ROM字体和可编程控制器 14H装入8×16 ROM字体和可编程控制器 20H设置INT 1Fh字体指针 21H为用户字体设置INT 43h 22H为8×14 ROM字体设置INT 43H 23H为8×8 ROM字体设置INT 43H 24H为8×16 ROM字体设置INT 43H 30H读取字体信息 | |
12H —显示器的配置 | (18)、功能12H 功能描述:显示器的配置中断。其子功能说明如下: 功能号 功能名称 功能号 功能名称 10H — 读取配置信息20H — 选择屏幕打印 30H — 设置扫描行31H — 允许/禁止装入缺省调色板 32H — 允许/禁止显示33H — 允许/禁止灰度求和 34H — 允许/禁止光标模拟35H — 切换活动显示 36H — 允许/禁止屏幕刷新 | |
13H —在Teletype模式下显示字符串 | (19)、功能13H 功能描述:在Teletype模式下显示字符串 入口参数:AH=13H BH=页码 BL=属性(若AL=00H或01H) CX=显示字符串长度 (DH、DL)=坐标(行、列) ES:BP=显示字符串的地址 AL=显示输出方式 0——字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变 1——字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变 2——字符串中含显示字符和显示属性。显示后,光标位置不变 3——字符串中含显示字符和显示属性。显示后,光标位置改变 出口参数:无 | |
1AH —读取/设置显示组合编码 | (20)、功能1AH 功能描述:读取/设置显示组合编码,仅PS/2有效,在此从略 | |
1BH —读取功能/状态信息 | (21)、功能1BH 功能描述:读取功能/状态信息,仅PS/2有效,在此从略 | |
1CH —保存/恢复显示器状态 | (22)、功能1CH 功能描述:保存/恢复显示器状态,仅PS/2有效,在此从略 | |
2、直接磁盘服务(Direct Disk Service——INT 13H) | 00H —磁盘系统复位 | (1)、功能00H 功能描述:磁盘系统复位 入口参数:AH=00H DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明 |
01H —读取磁盘系统状态 | (2)、功能01H 功能描述:读取磁盘系统状态 入口参数:AH=01H DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘 出口参数:AH=00H,AL=状态代码,其定义如下: 00H — 无错 01H — 非法命令 02H — 地址目标未发现03H — 磁盘写保护(软盘) 04H — 扇区未发现05H — 复位失败(硬盘) 06H — 软盘取出(软盘)07H — 错误的参数表(硬盘) 08H — DMA越界(软盘)09H — DMA超过64K界限 0AH — 错误的扇区标志(硬盘)0BH — 错误的磁道标志(硬盘) 0CH — 介质类型未发现(软盘)0DH — 格式化时非法扇区号(硬盘) 0EH — 控制数据地址目标被发现(硬盘)0FH — DMA仲裁越界(硬盘) 10H — 不正确的CRC或ECC编码11H — ECC校正数据错(硬盘) CRC:Cyclic Redundancy Check code ECC:Error Checking & Correcting code 20H — 控制器失败40H — 查找失败 80H — 磁盘超时(未响应)AAH — 驱动器未准备好(硬盘) BBH — 未定义的错误(硬盘)CCH — 写错误(硬盘) E0H — 状态寄存器错(硬盘)FFH — 检测操作失败(硬盘) | |
02H —读扇区 | (3)、功能02H 功能描述:读扇区 入口参数:AH=02H AL=扇区数 CH=柱面 CL=扇区 DH=磁头 DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘 ES:BX=缓冲区的地址 出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明 | |
03H —写扇区 | (4)、功能03H 功能描述:写扇区 入口参数:AH=03H AL=扇区数 CH=柱面 CL=扇区 DH=磁头 DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘 ES:BX=缓冲区的地址 出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明 | |
04H —检验扇区 | (5)、功能04H 功能描述:检验扇区 入口参数:AH=04H AL=扇区数 CH=柱面 CL=扇区 DH=磁头 DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘 ES:BX=缓冲区的地址 出口参数:CF=0——操作成功,AH=00H,AL=被检验的扇区数,否则,AH=状态代码,参见功能号01H中的说明 | |
05H —格式化磁道 | (6)、功能05H 功能描述:格式化磁道 入口参数:AH=05H AL=交替(Interleave) CH=柱面 DH=磁头 DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘;ES:BX=地址域列表的地址 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明 | |
06H —格式化坏磁道 | (7)、功能06H 功能描述:格式化坏磁道 入口参数:AH=06H AL=交替 CH=柱面 DH=磁头 DL=80H~0FFH:硬盘 ES:BX=地址域列表的地址 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明 | |
07H —格式化驱动器 | (8)、功能07H 功能描述:格式化驱动器 入口参数:AH=07H AL=交替 CH=柱面 DL=80H~0FFH:硬盘 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明 | |
08H —读取驱动器参数 | (9)、功能08H 功能描述:读取驱动器参数 入口参数:AH=08H DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘 出口参数:CF=1——操作失败,AH=状态代码,参见功能号01H中的说明,否则, BL=01H — 360K =02H — 1.2M =03H — 720K =04H — 1.44M CH=柱面数的低8位 CL的位7-6=柱面数的该2位 CL的位5-0=扇区数 DH=磁头数 DL=驱动器数 ES:DI=磁盘驱动器参数表地址 | |
09H —初始化硬盘参数 | (10)、功能09H 功能描述:初始化硬盘参数 入口参数:AH=09H DL=80H~0FFH:硬盘(还有有关参数表问题,在此从略) 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明 | |
0AH —读长扇区 | (11)、功能0AH 功能描述:读长扇区,每个扇区随带四个字节的ECC编码 入口参数:AH=0AH AL=扇区数 CH=柱面 CL=扇区 DH=磁头 DL=80H~0FFH:硬盘 ES:BX=缓冲区的地址 出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明 | |
0BH —写长扇区 | (12)、功能0BH 功能描述:写长扇区,每个扇区随带四个字节的ECC编码 入口参数:AH=0BH AL=扇区数 CH=柱面 CL=扇区 DH=磁头 DL=80H~0FFH:硬盘 ES:BX=缓冲区的地址 出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明 | |
0CH —查寻 | (13)、功能0CH 功能描述:查寻 入口参数:AH=0CH CH=柱面的低8位 CL(7-6位)=柱面的高2位 DH=磁头 DL=80H~0FFH:硬盘 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明 | |
0DH —硬盘系统复位 | (14)、功能0DH 功能描述:硬盘系统复位 入口参数:AH=0DH DL=80H~0FFH:硬盘 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明 | |
0EH —读扇区缓冲区 | (15)、功能0EH 功能描述:读扇区缓冲区 入口参数:AH=0EH ES:BX=缓冲区的地址 出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明 | |
0FH —写扇区缓冲区 | (16)、功能0FH 功能描述:写扇区缓冲区 入口参数:AH=0FH ES:BX=缓冲区的地址 出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明 | |
10H —读取驱动器状态 | (17)、功能10H 功能描述:读取驱动器状态 入口参数:AH=10H DL=80H~0FFH:硬盘 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明 | |
11H —校准驱动器 | (18)、功能11H 功能描述:校准驱动器入口参数:AH=11H DL=80H~0FFH:硬盘 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态代码,参见功能号01H中的说明 | |
12H —控制器RAM诊断 | (19)、功能12H 功能描述:控制器RAM诊断 入口参数:AH=12H 出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明 | |
13H —控制器驱动诊断 | (20)、功能13H 功能描述:控制器驱动诊断 入口参数:AH=13H 出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明 | |
14H —控制器内部诊断 | (21)、功能14H 功能描述:控制器内部诊断 入口参数:AH=14H 出口参数:CF=0——操作成功,否则,AH=状态代码,参见功能号01H中的说明 | |
15H —读取磁盘类型 | (22)、功能15H 功能描述:读取磁盘类型 入口参数:AH=15H DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘 出口参数:CF=1——操作失败,AH=状态代码,参见功能号01H中的说明, 否则,AH=00H — 未安装驱动器 =01H — 无改变线支持的软盘驱动器 =02H — 带有改变线支持的软盘驱动器 =03H — 硬盘,CX:DX=512字节的扇区数 | |
16H —读取磁盘变化状态 | (23)、功能16H 功能描述:读取磁盘变化状态 入口参数:AH=16H DL=00H~7FH:软盘 出口参数:CF=0——磁盘未改变,AH=00H,否则,AH=06H,参见功能号01H中的说明 | |
17H —设置磁盘类型 | (24)、功能17H 功能描述:设置磁盘类型 入口参数:AH=17H DL=00H~7FH:软盘 AL=00H — 未用 =01H — 360K在360K驱动器中 =02H — 360K在1.2M驱动器中 =03H — 1.2M在1.2M驱动器中 =04H — 720K在720K驱动器中 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态编码,参见功能号01H中的说明 | |
18H —设置格式化媒体类型 | (25)、功能18H 功能描述:设置格式化媒体类型 入口参数:AH=18H CH=柱面数 CL=每磁道的扇区数 DL=00H~7FH:软盘 出口参数:CF=0——操作成功,AH=00H,ES:DI=介质类型参数表地址,否则,AH=状态编码,参见功能号01H中的说明 | |
19H —磁头保护 | (26)、功能19H 功能描述:磁头保护,仅在PS/2中有效,在此从略 | |
1AH —格式化ESDI驱动器 | (27)、功能1AH 功能描述:格式化ESDI驱动器,仅在PS/2中有效,在此从略 | |
3、串行口服务(Serial Port Service——INT 14H) | 00H —初始化通信口 | (1)、功能00H 功能描述:初始化通信口 入口参数:AH=00H DX=初始化通信口号(0=COM1,1=COM2,……) AL=初始化参数,参数的说明如下: 波特率奇偶位停止位字的位数 76543210 000 = 110X0 = None0 = 1 bit10 = 7 bits 001 = 15001 = Odd1 = 2 bits11 = 8 bits 010 = 30011 = Even 011 = 600 100 = 1200 101 = 2400 110 = 4800 111 = 9600 对于PS/2,可用INT 14H之功能04H和05H来初始化其通信速率大于9600。 出口参数:AH=通信口状态,各状态位为1时的含义如下: 位7—超时 位6—传递移位寄存器为空 位5—传递保持寄存器为空 位4—发现终止位3—发现帧错误 位2—发现奇偶错 位1—发现越界错 位0—接受数据准备好 AL=Modem状态 位7—接受单线信号诊断 位6—环指示器 位5—数据发送准备好 位4—清除数据,再发送位3—改变在接受线上的信号诊断 位2—后边界环指示器 位1—改变“数据准备好”状态 位0—改变“清除—发送”状态 |
01H —向通信口输出字符 | (2)、功能01H 功能描述:向通信口输出字符 入口参数:AH=01H AL=字符 DX=初始化通信口号(0=COM1,1=COM2,……) 出口参数:AL的值不变 AH的位7=0——操作成功,通信口状态,AH的位6~0是其状态位 | |
02H —从通信口读入字符 | (3)、功能02H 功能描述:从通信口读入字符 入口参数:AH=02H DX=初始化通信口号(0=COM1,1=COM2,……) 出口参数:AL=接受的字符 AH的位7=0——操作成功,通信口状态,AH的位6~0是其状态位 | |
03H —读取通信口状态 | (4)、功能03H 功能描述:读取通信口状态 入口参数:AH=03H DX=初始化通信口号(0=COM1,1=COM2,……) 出口参数:AH=通信口状态,AL=Modem状态,参见功能号00H中的说明 | |
04H —扩充初始化通信口 | (5)、功能04H 功能描述:扩充初始化通信口,仅在PS/2中有效,在此从略 | |
4、杂项系统服务(Miscellaneous System Service——INT 15H) | 00H —开盒式磁带机马达 | (1)、功能00H 功能描述:开盒式磁带机马达 入口参数:AH=00H 出口参数:CF=0——操作成功,否则,AH=状态(86H,若未安装盒式磁带机) |
01H —关盒式磁带机马达 | (2)、功能01H 功能描述:关盒式磁带机马达 入口参数:AH=01H 出口参数:CF=0——操作成功,否则,AH=状态(86H,若未安装盒式磁带机) | |
02H —读盒式磁带机 | (3)、功能02H 功能描述:读盒式磁带机 入口参数:AH=02H CX=读入的字节数 ES:BX=存放数据的缓冲区地址 出口参数:CF=0——操作成功,DX=实际读入的字节数,ES:BX指向最后一个字节的后面地址,否则,AH=状态码,其值含义如下: 01H —— CRC校验码错80H —— 非法命令 02H —— 位信号混乱86H —— 未安装盒式磁带机04H —— 无发现数据 | |
03H —写盒式磁带机 | (4)、功能03H 功能描述:写盒式磁带机 入口参数:AH=03H CX=要写入的字节数 ES:BX=已存数据的缓冲区地址 出口参数:CF=0——操作成功,CX=00H,ES:BX指向最后一个字节的后面地址,否则,AH=状态码,其值含义如下: 80H —— 非法命令86H —— 未安装盒式磁带机 | |
0FH —格式化ESDI驱动器定期中断 | (5)、功能0FH 功能描述:格式化ESDI驱动器定期中断,仅在PS/2中有效,在此从略 | |
21H —读/写自检(POST)错误记录 | (6)、功能21H 功能描述:读/写自检(POST)错误记录,仅在PS/2中有效,在此从略 | |
4FH —键盘截听 | (7)、功能4FH 功能描述:键盘截听,仅在PS/2中有效,在此从略 | |
80H —设备打开 | (8)、功能80H 功能描述:打开设备 入口参数:AH=80H BX=设备号 CX=进程号 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态码 | |
81H —设备关闭 | (9)、功能81H 功能描述:关闭设备 入口参数:AH=81H BX=设备号 CX=进程号 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态码 | |
82H —进程终止 | (10)、功能82H 功能描述:进程终止 入口参数:AH=81H BX=进程号 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态码 | |
83H —事件等待 | (11)、功能83H 功能描述:事件等待 入口参数:AH=83H 若需要事件等待,则:AL=00H CX:DX=千分秒 ES:BX=信号量字节的地址 否则,调用参数为AL=01H 出口参数:若调用时,AL=00H,操作成功——CF=0,否则,CF=1 | |
84H —读游戏杆 | (12)、功能84H 功能描述:读游戏杆 入口参数:AH=84H DX=00H——读取开关设置 =01H——读取阻力输入 出口参数:CF=1H——操作失败,否则, DX=00H时,AL=开关设置(位7~4) DX=01H时,AX、BX、CX和DX分别为A(x)、A(y)、B(x)和B(y)的值 | |
85H —系统请求(SysReq)键 | (13)、功能85H 功能描述:系统请求(SysReq)键 入口参数:AH=85HAL=00H——键按下 =01H——键放开 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态码 | |
86H —延迟 | (14)、功能86H 功能描述:延迟 入口参数:AH=86H CX:DX=千分秒 出口参数:CF=0——操作成功,AH=00H | |
87H —移动扩展内存块 | (15)、功能87H 功能描述:从常规内存和扩展内存之间移动扩展内存块 入口参数:AH=87H CX=移动的字数 ES:SI=GDT(Global Descriptor Table)的地址,其结构定义如下: 偏移量存储的信息 00h-0Fh保留,但现全为0 10h-11h段的长度(2CX-1或更大) 12h-14h24位源地址 15h访问权限字节(其值为93h) 16h-17h保留,但现全为0 18h-19h段的长度(2CX-1或更大) 1Ah-1Ch 24位目标源地址 1Dh访问权限字节(其值为93h) 1Eh-2Fh保留,但现全为0 出口参数:CF=0——操作成功,AH=00H,否则,AH=状态码,其含义如下: 01H —— RAM奇偶错 02H —— 异常中断错 03H —— 20号线门地址失败 | |
88H —读取扩展内存大小 | (16)、功能88H 功能描述:读取扩展内存大小 入口参数:AH=88H 出口参数:AX=扩展内存字节数(以K为单位) | |
89H —进入保护模式 | (17)、功能89H 功能描述:进入保护模式,CPU从实模式进入保护模式 入口参数:AH=89H BH=IRQ0的中断号 BL=IRQ8的中断号 ES:SI=GDT的地址(参见功能号87H) 出口参数:CF=1——操作失败,AH=0FFH,否则,AH=00H,CS、DS、ES和SS都是用户定义的选择器 | |
90H —设备等待 | (18)、功能90H 功能描述:设备等待 入口参数:AH=90H AL=驱动器类型,具体的驱动器类型定义如下: =00H~7FH——串行再重用设备 =80H~0BFH——可重入式设备 =0C0H~0FFH——等待访问设备,没有自检功能 00h — 磁盘 02h — 键盘 80h — 网络 FDh — 软盘马达启动01h — 软盘 03h — 点设备(Pointing Device) FCh — 硬盘复位 FEh — 打印机 ES:BX=对驱动器类型80H~0FFH的请求块地址 出口参数:CF=1——操作失败,否则,AH=00H | |
91H —设备加电自检 | (19)、功能91H 功能描述:设备加电自检 入口参数:AH=91H AL=00H~7FH——串行再重用设备 =80H~0BFH——可重入式设备 出口参数:AH=00H | |
C0H —读取系统环境 | (20)、功能0C0H 功能描述:读取系统环境 入口参数:AH=0C0H 出口参数:ES:BX=配置表地址,配置表的定义如下: 偏移量含义说明 00h-01h表的大小(字节数) 02h系统模型 03h系统子模型 04hBIOS版本号 05h配置标志,其各位为1时的说明如下: 位7—DMA通道3使用 位6—存在从属8259 位5—实时时钟有效 位4—键盘截听有效 位3—等待外部事件有效 位2—扩展BIOS数据区 位1—微通道设施 位0—保留 06h-09h保留 | |
C1H —读取扩展BIOS数据区地址 | (21)、功能C1H 功能描述:读取扩展BIOS数据区地址,仅在PS/2中有效,在此从略 | |
C2H —鼠标图形 | (22)、功能C2H 功能描述:鼠标图形,仅在PS/2中有效,在此从略 | |
C3H —设置WatcHdog超时 | (23)、功能C3H 功能描述:设置WatcHdog超时,仅在PS/2中有效,在此从略 | |
C4H —可编程选项选择 | (24)、功能C4H 功能描述:可编程选项选择,仅在PS/2中有效,在此从略 | |
5、键盘服务(Keyboard Service——INT 16H) | 00H、10H —从键盘读入字符 | (1)、功能00H和10H 功能描述:从键盘读入字符 入口参数:AH=00H——读键盘 =10H——读扩展键盘,可根据0000:0496H单元的内容判断:扩展键盘是否有效 出口参数:AH=键盘的扫描码 AL=字符的ASCII码 |
03H —设置重复率 | (2)、功能01H和11H 功能描述:读取键盘状态 入口参数:AH=01H——检查普通键盘 =11H——检查扩展键盘 出口参数:ZF=1——无字符输入,否则,AH=键盘的扫描码,AL=ASCII码。 | |
01H、11H —读取键盘状态 | (3)、功能02H和12H 功能描述:读取键盘标志 入口参数:AH=02H——普通键盘的移位标志 =12H——扩展键盘的移位标志 出口参数:AL=键盘标志(02H和12H都有效),其各位之值为1时的含义如下: 位7—INS开状态位3—ALT键按下 位6—CAPS LOCK开状态位2—CTRL键按下 位5—NUM LOCK开状态位1—左SHIFT键按下 位4—SCROLL LOCK开状态位0—右SHIFT键按下 AH=扩展键盘的标志(12H有效),其各位之值为1时的含义如下: 位7—SysReq键按下位3—右ALT键按下 位6—CAPS LOCK键按下位2—右CTRL键按下 位5—NUM LOCK键按下位1—左ALT键按下 位4—SCROLL键按下位0—左CTRL键按下 | |
02H, 12H —读取键盘标志 | (4)、功能03H 功能描述:设置重复率 入口参数:AH=03H 对于PC/AT和PS/2:AL=05H BH=重复延迟 BL=重复率 对于PCjr:AL=00H——装入缺省的速率和延迟 =01H——增加初始延迟 =02H——重复频率降低一半 =03H——增加延迟和降低一半重复频率 =04H——关闭键盘重复功能 出口参数:无 | |
04H —设置键盘点击 | (5)、功能04H 功能描述:设置键盘点击 入口参数:AH=04H AL=00H——关闭键盘点击功能 =01H——打开键盘点击功能 出口参数:无 | |
05H —字符及其扫描码进栈 | (6)、功能05H 功能描述:字符及其扫描码进栈 入口参数:AH=05H CH=字符的描述码 CL=字符的ASCII码 出口参数:CF=1——操作成功,AL=00H,否则,AL=01H | |
6、并行口服务(Parallel Port Service——INT 17H) | 00H —向打印机输出字符 | (1)、功能00H 功能描述:向打印机输出字符 入口参数:AH=00H AL=输出的字符 DX=打印机号(0—LPT1,1—LPT2,2—LPT3,……) 出口参数:AH=打印机状态。其各位为1时的含义如下: 位7—打印机空闲 位3—I/O错误 位6—打印机响应位2—保留 位5—无纸位1—保留 位4—打印机被选位0—打印机超时 |
01H —初始化打印机端口 | (2)、功能01H 功能描述:初始化打印机端口 入口参数:AH=01H DX=打印机号(0—LPT1,1—LPT2,2—LPT3,……) 出口参数:AH=打印机状态。各位定义如下功能00H所示 | |
02H —读取打印机状态 | (3)、功能02H 功能描述:读取打印机状态 入口参数:AH=02H DX=打印机号(0—LPT1,1—LPT2,2—LPT3,……) 出口参数:AH=打印机状态。各位定义如下功能00H所示 | |
7、时钟服务(Clock Service——INT 1AH) | 00H —读取时钟“滴答”计数 | (1)、功能00H 功能描述:读取时钟“滴答”计数 入口参数:AH=00H 出口参数:AL=00H——未过午夜,否则,表示已过午夜 CX:DX=时钟“滴答”计数 |
01H —设置时钟“滴答”计数 | (2)、功能01H 功能描述:设置时钟“滴答”计数 入口参数:AH=01H CX:DX=时钟“滴答”计数 出口参数:无 | |
02H —读取时间 | (3)、功能02H 功能描述:读取时间 入口参数:AH=02H 出口参数:CH=BCD码格式的小时 CL=BCD码格式的分钟 DH=BCD码格式的秒 DL=00H——标准时间,否则,夏令时 CF=0——时钟在走,否则,时钟停止 | |
03H —设置时间 | (4)、功能03H 功能描述:设置时间 入口参数:AH=03H CH=BCD码格式的小时 CL=BCD码格式的分钟 DH=BCD码格式的秒 DL=00H——标准时间,否则,夏令时 出口参数:无 | |
04H —读取日期 | (5)、功能04H 功能描述:读取日期 入口参数:AH=04H 出口参数:CH=BCD码格式的世纪 CL=BCD码格式的年 DH=BCD码格式的月 DL=BCD码格式的日 CF=0——时钟在走,否则,时钟停止 | |
05H —设置日期 | (6)、功能05H 功能描述:设置日期 入口参数:AH=05H CH=BCD码格式的世纪 CL=BCD码格式的年 DH=BCD码格式的月 DL=BCD码格式的日 出口参数:无 | |
06H —设置闹钟 | (7)、功能06H 功能描述:设置闹钟 入口参数:AH=06H CH=BCD码格式的小时 CL=BCD码格式的分钟 DH=BCD码格式的秒 出口参数:CF=0——操作成功,否则,闹钟已设置或时钟已停止 | |
07H —闹钟复位 | (8)、功能07H 功能描述:闹钟复位 入口参数:AH=07H 出口参数:无 | |
0AH —读取天数计数 | (9)、功能0AH 功能描述:读取天数计数,仅在PS/2有效,在此从略 | |
0BH —设置天数计数 | (10)、功能0BH 功能描述:设置天数计数,仅在PS/2有效,在此从略 | |
80H —设置声音源信息 | (11)、功能80H 功能描述:设置声音源信息 入口参数:AH=80H AL=声音源 =00H——8253可编程计时器,通道2 =01H——盒式磁带输入 =02H——I/O通道上的"Audio In" =03H——声音产生芯片 出口参数:无 | |
8、直接系统服务(Direct System Service) | INT 00H —“0”作除数 INT 01H —单步中断 INT 02H —非屏蔽中断(NMI) INT 03H —断点中断 INT 04H —算术溢出错误 INT 05H —打印屏幕和BOUND越界 INT 06H —非法指令错误 INT 07H —处理器扩展无效 INT 08H —时钟中断 INT 09H —键盘输入 INT 0BH —通信口(COM2:) INT 0CH —通信口(COM1:) INT 0EH —磁盘驱动器输入/输出 INT 11H —读取设备配置 INT 12H —读取常规内存大小(返回值AX为内存容量,以K为单位) INT 18H —ROM BASIC INT 19H —重启动系统 INT 1BH —CTRL+BREAK处理程序 INT 1CH —用户时钟服务 INT 1DH —指向显示器参数表指针 INT 1EH —指向磁盘驱动器参数表指针 INT 1FH —指向图形字符模式表指针 |
然后根据具体中断需求往所需要的所有寄存器送入值
A、指定本程序的起始地址0x7c00,告诉编译器把本程序的起始地址编译为0x7c00
B、调用BIOS中断清屏
C、调用BIOS中断获取光标位置
D、调用BIOS中断打印字符
E、死循环;填入MBR规定510字节大小剩下的0;固定结尾俩字节0x55,0xaa
然后使用nasm编译该.s文件
nasm -o mbr mbr.S
用dd命令写入bochs的虚拟硬盘
dd if=/home/qiji-9923/bochs/mbr of=/home/qiji-9923/bochs/hd60M.img bs=512 count=1 conv=notrunc
of之前是输入文件mbr的路径,of之后是输出文件路径
命令整体功能
dd 是一个在类 Unix 系统(如 Linux、macOS 等)中用于复制文件并对内容进行转换和格式化的强大命令。该命令的主要功能是将指定输入文件的前 512 字节复制到指定的输出文件中,同时不截断输出文件的原有内容。 各参数解释
if=/home/qiji-9923/bochs/mbr if 是 input file 的缩写,用于指定输入文件的路径。这里指定的输入文件是 /home/qiji-9923/bochs/mbr,即从该文件读取数据。 of=/home/qiji-9923/bochs/hd60M.img of 是 output file 的缩写,用于指定输出文件的路径。这里指定的输出文件是 /home/qiji-9923/bochs/hd60M.img,即把从输入文件读取的数据写入到该文件中。bs=512bs 是 block size 的缩写,用于指定每次读写操作的数据块大小。这里设置为 512 字节,意味着 dd 命令每次从输入文件读取 512 字节的数据,然后将这 512 字节的数据写入到输出文件中。 count=1count 用于指定读取的数据块数量。这里设置为 1,表示只读取 1 个数据块,结合 bs=512,也就是总共读取 512 字节的数据。 conv=notrunc conv 用于指定数据转换的方式,notrunc 是其中一个转换选项。notrunc 表示不截断输出文件,即写入数据时不会清除输出文件中原有内容,而是将新数据追加或覆盖到相应位置。