概述
section和segment的区别
-
section 称为节,是指在汇编源码中经由关键字 section 或 segment 修饰
-
segment 称为段,是链接器根据目标文件中属性相同的多个 section 合并后的 section 集合
MBR主引导程序
MBR步骤:
1、清屏、验证
2、载入loader
载入内存:
(1)程序被加载器(软件或硬件)加载到内存某个区域。
(2)CPU 的 cs:ip 寄存器被指向这个程序的起始地址。
完善MBR
载入loader步骤:
1、指定loader所在扇区
2、将loader转移到LOADER_BASE_ADDR
读取loader步骤:
(1)先选择通道,往该通道的 sector count 寄存器中写入待操作的扇区数。
(2)往该通道上的三个 LBA 寄存器写入扇区起始地址的低 24 位。
(3)往 device 寄存器中写入 LBA 地址的 24~27 位,并置第 6 位为 1,使其为 LBA 模式,设置第 4 位,选择操作的硬盘(master 硬盘或 slave 硬盘)。
(4)往该通道上的 command 寄存器写入操作命令。
(5)读取该通道上的 status 寄存器,判断硬盘工作是否完成。
(6)如果以上步骤是读硬盘,进入下一个步骤。否则,完工。
(7)将硬盘数据读出。
数据传送方式:
(1)无条件传送方式。 (应用此方式的数据源设备一定是随时准备好了数据)
(2)查询传送方式。(传输之前, 由程序先去检测设备的状态)
(3)中断传送方式。(当数据源设备准备好数据后,通过发中断来通知 CPU 来拿数据)
(4)直接存储器存取方式(DMA)。 (需要 DMA 控制器)
(5)I/O 处理机传送方式。(I/O 处理机)
command寄存器的命令码
(1)identify:0xEC,即硬盘识别。
(2)read sector:0x20,即读扇区。
(3)write sector:0x30,即写扇区。
端口可以被分为两组,Command Block registers 和 Control Block registers。Command Block registers 用于向硬盘驱动器写入命令字或者从硬盘控制器获得硬盘状态,Control Block registers 用于控制硬盘工作状态。
端口是按照通道给出的
data 寄存器在名字上我们就知道它是负责管理数据的,它相当于数据的门,数据能进,也能出,所以其 作用是读取或写入数据。
读硬盘时,端口 0x171 或 0x1F1 的寄存器名字叫 Error 寄存器,只在读取硬盘失败时有用,里面才会 记录失败的信息,尚未读取的扇区数在 Sector count 寄存器中。
Sector count 寄存器用来指定待读取或待写入的扇区数。
LBA 的定义,这是一 种逻辑上为扇区址的方法,全称为逻辑块地址(Logical Block Address)
保护模式
进入保护模式需要三个步骤。
(1)打开 A20。
(2)加载 gdt。
(3)将 cr0 的 pe 位置 1。
A20
步骤:
将端口 0x92 的第 1 位置 1
在保护模式下, 我们需要突破第 20 条地址线(A20)去访问更大的内存空间,而这一切,只有关闭了地址回绕才能实现。 而关闭地址回绕,就是打开 A20Gate
GDT
实际的段界限边界值= (描述符中段界限+1)*(段界限的粒度大小:4KB 或者 1)-1
如果 G 位为 0,表示段界限粒度大小为 1 字节;
如果 G 位为 1,表示段界限粒度大小为 4KB 字节
DPL 字段,Descriptor Privilege Level,即描述符特权级,这两位能表示 4 种特权级,分别是 0、1、2、3 级特权,数字越小,特权级越大
P 字段,Present,即段是否存在。
S 为 0 时表示系统段,S 为 1 时表示数据段
AVL 字段,AVaiLable,可用的,对硬件来说,它没有专门的用途
D/B 字段,用来指示有效地址(段内偏移地址)及操作数的大小
L 字段,用来设置是否是 64 位代码段
表中的 A 位表示 Accessed 位,这是由 CPU 来设置的,每当该段被 CPU 访问过后,CPU 就将此位置 1。
C 表示一致性代码段,也称为依从代码段,如果其是转移的目标段,特权级一定要高于当前特权级,转移后的特权级不与自己的 DPL 为主, 而是与转移前的低特权级一致,也就是听从、依从转移前的低特权级
R 表示可读,R 为 1 表示可读,R 为 0 表示不可读
X 表示该段是否可执行
E 是用来标识段的扩展方向,Extend。E 为 0 表示向上扩展,即地址越来越高,通常用于代码段和数 据段。E 为 1 表示向下扩展,地址越来越低,通常用于栈段
W 是指段是否可写,Writable。W 为 1 表示可写,通常用于数据段。
由于 GDT 的大小是 16 位二进制,其表示的范围是 2 的16次方等于65536字节。每个描述符大小是8字节,故,GDT中最多可容纳的描述符数量是65536/8=8192 个,即 GDT 中可容纳 8192 个段或门
低 2 位存储 RPL,即请求特权级
第 2 位是 TI 位,即 Table Indicator,用来指示选择子是在 GDT 中,还是 LDT 中索引描述符
段基址在段描述符中,用给出的选择子(LDT)索引到描述符后,CPU 自动从段描述符中取出段基址,这样再加上段内偏移地址,便凑成 了“段基址:段内偏移地址”的形式
保护模式的开关,CR0 寄存器的 PE 位
PE 为 0 表示在实模式下运行,PE 为 1 表示在保护模式下运行
保护模式->内核
步骤:
1、检查物理内存容量(实模式检测,检测后进保护模式)
2、启用内存分页
3、加载内核
检测内存容量
BIOS 中断 0x15 的 3 个子功能
EAX=0xE820:遍历主机上全部内存。
AX=0xE801: 分别检测低 15MB 和 16MB~4GB 的内存,最大支持 4GB。
AH=0x88:最多检测出 64MB 内存,实际内存超过此容量也按照 64MB 返回。
EAX=0xE820
EAX、ES:DI、ECX、CF
内存信息的内容是用地址范围描述符来描述的,用于存 储这种描述符的结构称之为地址范围描述符(Address Range Descriptor Structure,ARDS
由于我们在 32 位环境下工作,所以在 ARDS 结构属性中,我们只用到低 32 位属性。 BaseAddrLow+LengthLow 是一片内存区域上限,单位是字节。
AX=0xE801
AX、CF、AXx1024+BXx64x1024
有一些 ISA 设备要用到地址 15MB 以上的内存作为缓冲区,也就是此缓冲区为 1MB 大小
AH=0x88
启用内存分页
步骤:
(1)准备好页目录表及页表。
(2)将页表地址写入控制寄存器cr3。
(3)寄存器cr0的PG位置1。
二级页表地址转换
(1)用虚拟地址的高10 位乘以 4,作为页目录表内的偏移地址,加上页目录表的物理地址,所得的和,便是页目录项的物理地址。读取该页目录项,从中获取到页表的物理地址。
(2)用虚拟地址的中间10位乘以4,作为页表内的偏移地址,加上在第1步中得到的页表物理地址, 所得的和,便是页表项的物理地址。读取该页表项,从中获取到分配的物理页地址。
(3)虚拟地址的高10位和中间10位分别是PDE和PTE的索引值,所以它们需要乘以4。但低12位 就不是索引值啦,其表示的范围是0~0xfff,作为页内偏移最合适,所以虚拟地址的低12位加上第2步 中得到的物理页地址,所得的和便是最终转换的物理地址。
Linux的作法,在用户进程4GB虚拟地址空间的 高3GB 以上的部分划分给操作系统,0~3GB 是用户进程自己的虚拟空间。为了实现共享操作系统,让所有用 户进程3GB~4GB的虚拟地址空间都指向同一个操作系统,也就是所有进程的虚拟地址3GB~4GB本质上都是 指向的同一片物理页地址,这片物理页上是操作系统的实体代码。
由于标准页大小为4K,因此页目录项的前20位即可表示全部的物理地址
【下面的位全部为0】
P,Present,意为存在位。若为1表示该页存在于物理内存中,若为0表示该表不在物理内存中。操作系统的页式虚拟内存管理便是通过P位和相应的pagefault异常来实现的。
RW,Read/Write,意为读写位。若为1表示可读可写,若为0表示可读不可写。
US,User/Supervisor,意为普通用户/超级用户位。若为1时,表示处于User级,任意级别(0、1、2、 3)特权的程序都可以访问该页。若为0,表示处于Supervisor级,特权级别为3的程序不允许访问该页, 该页只允许特权级别为0、1、2的程序可以访问。
PWT,Page-level Write-Through,意为页级通写位,也称页级写透位。若为1表示此项采用通写方式, 表示该页不仅是普通内存,还是高速缓存。此项和高速缓存有关,“通写”是高速缓存的一种工作方式, 本位用来间接决定是否用此方式改善该页的访问效率。这里直接置为0就可以。
PCD,Page-level Cache Disable,意为页级高速缓存禁止位。若为1表示该页启用高速缓存,为0表 示禁止将该页缓存。这里将其置为0。
A,Accessed,意为访问位。若为1表示该页被CPU访问过啦,所以该位是由CPU设置的。
D,Dirty,意为脏页位。当 CPU 对一个页面执行写操作时,就会设置对应页表项的D位为1。此项 仅针对页表项有效,并不会修改页目录项中的D位。
PAT,Page Attribute Table,意为页属性表位,能够在页面一级的粒度上设置内存属性。比较复杂,将 此位置0即可。
G,Global,意为全局位。为了提高获取物理地址的速度,将虚拟地址与物理地址转换结果存储在 TLB(Translation Lookaside Buffer)中。 此G位用来指定该页是否为全局页,为1表示是全局页,为0表示不是全局页。若为全局页,该页将在高速缓存TLB中一直保存,给出虚拟地址直接对应出物理地址,无需那三步骤转换。由于TLB容量比较小,所以这里面就存放使用频率较高的页面。顺便说一句,清空TLB有两种 方式,一是用invlpg指令针对单独虚拟地址条目清理,或者是重新加载cr3寄存器,这将直接清空TLB。
AVL,意为Available 位,表示可用
其他
知识点
MBR Main Boot Record、 Master Boot Record 主引导扇区记录
IVT Interrupt Vector Table 中断向量表
CHS方法,即柱面Cylinder 磁 头Header 扇区Sector,另外一种是LBA方式
在CHS方式中扇区的编号是从1开始的,而LBA方式中, 扇区编号是从0开始的
linux命令:dd用于磁盘操作,man dd查看帮助文件



BIOS 中断向量表
中断 | 描述 |
---|---|
INT 00h | CPU:除零错,或商不合法时触发 |
INT 01h | CPU:单步陷阱,TF标记为打开状态时,每条指令执行后触发 |
INT 02h | CPU:非可屏蔽中断,如引导自我测试时发生内存错误。 |
INT 03h | CPU:第一个未定义的中断向量,约定俗成仅用于调试程序 |
INT 04h | CPU:算数溢出。通常由INTO指令在置溢出位时触发。 |
INT 05h | 在按下Shift-Print Screen或BOUND指令检测到范围异常时触发。 |
INT 06h | CPU:非法指令。 |
INT 07h | CPU:没有数学协处理器时尝试执行浮点指令触发。 |
INT 08h | IRQ0:可编程中断控制器每 55 毫秒触发一次,即每秒 18.2 次。 |
INT 09h | IRQ1:每次键盘按下、按住、释放。 |
INT 0Ah | IRQ2: |
INT 0Bh | IRQ3:COM2/COM4。 |
INT 0Ch | IRQ4:COM1/COM3。 |
INT 0Dh | IRQ5:硬盘控制器(PC/XT 下)或 LPT2。 |
INT 0Eh | IRQ6:需要时由软盘控制器调用。 |
INT 0Fh | IRQ7:LPT1。 |
INT 10h | 显示服务 - 由BIOS或操作系统设定以供软件调用。 |
AH=00h设定显示模式 | |
AH=01h设定游标形态 | |
AH=02h设置光标位置 | |
AH=03h获取光标位置与形态 | |
AH=04h获取光标位置 | |
AH=05h设置显示页 | |
AH=06h清除或滚动栏画面(上) | |
AH=07h清除或滚动栏画面(下) | |
AH=08h读取游标处字符与属性 | |
AH=09h更改游标处字符与属性 | |
AH=0Ah更改游标处字符 | |
AH=0Bh设定边界颜色 | |
AH=0Eh在TTY模式下写字符 | |
AH=0Fh获取当前显示模式 | |
AH=13h写字符串 | |
INT 11h | 返回设备列表。 |
INT 12h | 获取常规内存容量。 |
INT 13h | 低级磁盘服务。 |
AH=00h复位磁盘驱动器 | |
AH=01h检查磁盘驱动器状态 | |
AH=02h读扇区 | |
AH=03h写扇区 | |
AH=04h校验扇区 | |
AH=05h格式化磁道 | |
AH=08h获取驱动器参数 | |
AH=09h初始化硬盘驱动器参数 | |
AH=0Ch寻道 | |
AH=0Dh复位硬盘控制器 | |
AH=15h获取驱动器类型 | |
AH=16h获取软驱中盘片的状态 | |
INT 14h | 串口通信例程。 |
AH=00h初始化串口 | |
AH=01h写出字符 | |
AH=02h读入字符 | |
AH=03h状态 | |
INT 15h | 其它(系统支持例程)。 |
AH=4FH键盘拦截 | |
AH=83H事件等待 | |
AH=84H读游戏杆 | |
AH=85HSysRq 键 | |
AH=86H等待 | |
AH=87H块移动 | |
AH=88H获取扩展内存容量 | |
AH=C0H获取系统参数 | |
AH=C1H获取扩展 BIOS 数据区块 | |
AH=C2H指针设备功能 | |
AH=E8h, AL=01h (AX = E801h)获取扩展内存容量(自从 1994 年引入的新功能),可获取到 64MB 以上的内存容量。 | |
AH=E8h, AL=20h (AX = E820h)查询系统地址映射。该功能取代了 AX=E801h 和 AH=88h。 | |
INT 16h | 键盘通信例程。 |
AH=00h读字符 | |
AH=01h读输入状态 | |
AH=02h读 Shift 键(修改键)状态 | |
AH=10h读字符(增强版) | |
AH=11h读输入状态(增强版) | |
AH=12h读 Shift 键(修改键)状态(增强版) | |
INT 17h | 打印服务。 |
AH=00h打印字符 | |
AH=01h初始化打印机 | |
AH=02h检查打印机状态 | |
INT 18h | 执行磁带上的 BASIC 程序:“真正的”IBM 兼容机在 ROM 里内置 BASIC 程序,当引导失败时由 BIOS 调用此例程解释执行。 |
INT 19h | 加电自检之后加载操作系统。 |
INT 1Ah | 实时钟服务。 |
AH=00h读取实时钟 | |
AH=01h设置实时钟 | |
AH=02h读取实时钟时间 | |
AH=03h设置实时钟时间 | |
AH=04h读取实时钟日期 | |
AH=05h设置实时钟日期 | |
AH=06h设置实时钟闹铃 | |
AH=07h重置实时钟闹铃 | |
INT 1Bh | Ctrl+Break,由 IRQ 9 自动调用。 |
INT 1Ch | 预留,由 IRQ 8 自动调用。 |
INT 1Dh | 不可调用:指向视频参数表(包含视频模式的数据)的指针。 |
INT 1Eh | 不可调用:指向软盘模式表(包含关于软驱的大量信息)的指针。 |
INT 1Fh | 不可调用:指向视频图形字符表(包含从 80h 到 FFh 的 ASCII 字符的数据)的信息。 |
INT 41h | 地址指针:硬盘参数表(第一硬盘)。 |
INT 46h | 地址指针:硬盘参数表(第二硬盘)。 |
INT 4Ah | 实时钟在闹铃时调用。 |
INT 70h | IRQ8:由实时钟调用。 |
INT 74h | IRQ12:由鼠标调用 |
INT 75h | IRQ13:由数学协处理器调用。 |
INT 76h | IRQ14:由第一个 IDE 控制器所调用 |
INT 77h | IRQ15:由第二个 IDE 控制器所调用 |
|
INT | AH | 功能 | 调用参数 | 返回参数 |
---|---|---|---|---|
10 | 0 | 设置显示方式 | AL=00 40×25黑白方式 AL=01 40×25彩色方式 AL=02 80×25黑白方式 AL=03 80×25彩色方式 AL=04 320×200彩色图形方式 AL=05 320×200黑白图形方式 AL=06 320×200黑白图形方式 AL=07 80×25单色文本方式 AL=08 160×200 16色图形 (PCjr) AL=09 320×200 16色图形 (PCjr) AL=0A 640×200 16色图形 (PCjr) AL=0B 保留(EGA) AL=0C 保留(EGA) AL=0D 320×200 彩色图形 (EGA) AL=0E 640×200 彩色图形 (EGA) AL=0F 640×350 黑白图形 (EGA) AL=10 640×350 彩色图形 (EGA) AL=11 640×480 单色图形 (EGA) AL=12 640×480 16色图形 (EGA) AL=13 320×200 256色图形 (EGA) AL=40 80×30 彩色文本(CGE400) AL=41 80×50 彩色文本(CGE400) AL=42 640×400 彩色图形(CGE400)对于超级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文本模式 | |
10 | 1 | 置光标类型 | (CH)0-3=光标起始行 {CH低四位=光标的起始行} (CL)0-3=光标结束行 {CL低四位=光标的终止行} | |
10 | 2 | 置光标位置 | BH=页号 DH=行(X坐标),DL=列(Y坐标) | |
10 | 3 | 读光标位置(在文本坐标下,读取光标各种信息) | BH=页号 | CH=光标起始行 DH=行,DL=列 |
10 | 4 | 读光笔位置(获取当前状态和光笔位置) | AH=0 光笔未触发 =1 光笔触发 CH=象素行 (图形Y坐标,显示模式:04H | |
10 | 5 | 置显示页(即选择活动的显示页) | AL=页号AL=显示页 对于CGA、EGA、MCGA和VGA,其显示页如下表所列: 模式页数显示器类型 00H、01H 0 | 对PCjr在子功能80H~83H调用下,有: BH=CRT页寄存器, BL=CPU页寄存器 |
10 | 6 | 屏幕初始化或上卷 | AL=上卷行数 AL=0 整个窗口空白 BH=卷入行属性 CH=左上角行号 (CH、CL)=窗口的左上角位置(Y坐标,X坐标) CL=左上角列号 DH=右下角行号 (DH、DL)=窗口的右下角位置(Y坐标,X坐标) DL=右下角列号 | |
10 | 7 | 屏幕初始化或下卷 | AL=下卷行数 AL=0 整个窗口空白 BH=卷入行属性 CH=左上角行号 (CH、CL)=窗口的左上角位置(Y坐标,X坐标) CL=左上角列号 DH=右下角行号 (CH、CL)=窗口的左上角位置(Y坐标,X坐标) DL=右下角列号 | |
10 | 8 | 读光标位置的字符和属性 | BH=显示页 | AH=属性 AL=字符 |
10 | 9 | 在光标位置显示字符及属性 | BH=显示页 AL=字符 BL=属性 属性(文本模式)或颜色(图形模式) CX=字符重复次数(重复输出字符的次数) | |
10 | A | 在光标位置显示字符 | BH=显示页 BL=颜色(图形模式,仅适用于PCjr) AL=字符 CX=字符重复次数(重复输出字符的次数) | |
10 | B | 置彩色调板(320×200图形) | BH=彩色调板ID BL=和ID配套使用的颜色设置颜色: BH=00H,BL=颜色 选择调色板: BH=01H,BL=调色板(320×200、4种颜色的图形模式) | |
10 | C | 写象素 | DX=行(0-199) CX=列(0-639) AL=象素值 BH=页码 | |
10 | D | 读象素 | DX=行(0-199) CX=列(0-639) BH=页码 | AL=象素值 |
10 | E | 显示字符 (光标前移) | AL=字符 BL=前景色(图形模式) BH=页码 | |
10 | F | 取当前显示方式 | AH=字符列数 AL=显示方式(参见功能00H中的说明) | |
10 | 10 | 颜色中断 | 00H — 设置调色板寄存器 01H — 设置边框颜色 02H — 设置调色板和边框 03H — 触发闪烁/亮显位 07H — 读取调色板寄存器 08H — 读取边框颜色 09H — 读取调色板和边框 10H — 设置颜色寄存器 12H — 设置颜色寄存器块 13H — 设置颜色页状态 15H — 读取颜色寄存器 17H — 读取颜色寄存器块 1AH — 读取颜色页状态 1BH — 设置灰度值 | |
10 | 11 | 字体中断 | 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 读取字体信息 | |
10 | 12 | 显示器的配置中断 | 10H — 读取配置信息 20H — 选择屏幕打印 30H — 设置扫描行 31H — 允许/禁止装入缺省调色板 32H — 允许/禁止显示 33H — 允许/禁止灰度求和 34H — 允许/禁止光标模拟 35H — 切换活动显示 36H — 允许/禁止屏幕刷新 | |
10 | 13 | 显示字符串(适用AT) | ES:BP=串地址 CX=串长度 DH,DL=起始行,列 BH=页号 AL=0,BL=属性(闪烁1位,背景色3位,高亮1位,前景色3位.共8位) 串:char,char,... AL=1,BL=属性(闪烁1位,背景色3位,高亮1位,前景色3位.共8位) 串:char,char,... AL=2 串:char,attr,char,attr,... AL=3 串:char,attr,char,attr,... | 光标返回起始位置 光标跟随移动 光标返回起始位置 光标跟随移动 |
10 | 1A | 读取/设置显示组合编码,仅PS/2有效 | 略 | |
10 | 1B | 读取功能/状态信息,仅PS/2有效 | 略 | |
10 | 1C | 保存/恢复显示器状态,仅PS/2有效 | 略 | |
11 | 设备检验 | AX=返回值 bit0=1,配有磁盘 bit1=1,80287协处理器 bit4,5=01,40×25BW(彩色板) =10,80×25BW(彩色板) =11,80×25BW(黑白板) bit6,7=罗盘驱动器 bit9,10,11=RS-232板号 bit12=游戏适配器 bit13=串行打印机 bit14,15=打印机号 | ||
12 | 测定存储器容量 | AX=字节数(KB) | ||
13 | 0 | 软盘系统复位(磁盘系统复位) | DL=驱动器, 00H | CF=0——操作成功,AH=00H, 否则,AH=状态代码,参见功能号01H中的说明 |
13 | 1 | 读软盘状态 | DL=驱动器, 00H | 成功:CF=0 (13中断都可以依靠这个判断) 失败:CF=1 (13中断都可以依靠这个判断)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 — 检测操作失败(硬盘) |
13 | 2 | 读磁盘 | AL=扇区数 CH,CL=磁盘号,扇区号 DH=磁头号 ES:BX=数据缓冲区地址 DL:驱动器号 00H | 读成功:CF=0,AH=0 AL=读取的扇区数 读失败:CF=1,AH=出错代码 (参见功能号01H中的说明) |
13 | 3 | 写磁盘 | 同上 | 写成功:CF=0,AH=0 AL=写入的扇区数 写失败:CF=1,AH=出错代码 |
13 | 4 | 检验磁盘扇区 | 同上(ES:BX不设置) | 成功:CF=0,AH=0 AL=检验的扇区数 失败:CF=1,AH=出错代码 |
13 | 5 | 格式化盘磁道 | ES:BX=磁道地址AL=交替(Interleave) CH=柱面 DH=磁头 DL=驱动器, 00H | 成功:CF=0,AH=0 失败:CF=1,AH=出错代码 |
13 | 6 | 格式化坏磁道 | AL=交替 CH=柱面 DH=磁头 DL=80H~0FFH:硬盘 ES:BX=地址域列表的地址 | 成功:CF=0,AH=0 失败:CF=1,AH=状态代码,参见功能号01H中的说明 |
13 | 7 | 格式化驱动器 | AL=交替 CH=柱面 DL=80H~0FFH:硬盘 | 成功:CF=0,AH=00H, 失败:CF=1,AH=状态代码,参见功能号01H中的说明 |
13 | 8 | 读取驱动器参数 | DL=驱动器: 00H | 失败:CF=1,AH=状态代码,参见功能号01H中的说明 成功:CF=0, BL=01H — 360K =02H — 1.2M =03H — 720K =04H — 1.44M CH=柱面数的低8位 CL的位7-6=柱面数的该2位 CL的位5-0=扇区数 DH=磁头数 DL=驱动器数 ES:DI=磁盘驱动器参数表地址 |
13 | 9 | 初始化硬盘参数 | DL=80H~0FFH:硬盘(还有有关参数表问题,在此从略) | 操作成功,CF=0,AH=00H, 否则,CF=1,AH=状态代码,参见功能号01H中的说明 |
13 | A | 读长扇区,每个扇区随带四个字节的ECC编码 | AL=扇区数 CH=柱面 CL=扇区 DH=磁头 DL=80H~0FFH:硬盘 ES:BX=缓冲区的地址 | 成功:CF=0,AH=00H,AL=传输的扇区数, 否则:CF=1,AH=状态代码,参见功能号01H中的说明 |
13 | B | 写长扇区,每个扇区随带四个字节的ECC编码 | AL=扇区数 CH=柱面 CL=扇区 DH=磁头 DL=80H~0FFH:硬盘 ES:BX=缓冲区的地址 | 成功,CF=0,AH=00H,AL=传输的扇区数, 否则,CF=1,AH=状态代码,参见功能号01H中的说明 |
13 | C | 查寻 | CH=柱面的低8位 CL(7-6位)=柱面的高2位 DH=磁头 DL=80H~0FFH:硬盘 | 成功,CF=0,AH=00H, 否则,CF=1,AH=状态代码,参见功能号01H中的说明 |
13 | D | 硬盘系统复位 | DL=80H~0FFH:硬盘 | 成功,CF=0,AH=00H, 失败,CF=1,AH=状态代码,参见功能号01H中的说明 |
13 | E | 读扇区缓冲区 | ES:BX=缓冲区的地址 | 操作成功,CF=0, 否则,CF=1,AH=状态代码,参见功能号01H中的说明 |
13 | F | 写扇区缓冲区 | ES:BX=缓冲区的地址 | 操作成功,CF=0, 否则,CF=1,AH=状态代码,参见功能号01H中的说明 |
13 | 10 | 读取驱动器状态 | DL=80H~0FFH:硬盘 | 操作成功,CF=0,AH=00H, 否则,CF=1,AH=状态代码,参见功能号01H中的说明 |
13 | 11 | 校准驱动器 | DL=80H~0FFH:硬盘 | 操作成功,CF=0,AH=00H, 否则,CF=1,AH=状态代码,参见功能号01H中的说明 |
13 | 12 | 控制器RAM诊断 | 成功:CF=0, 否则,CF=1,AH=状态代码,参见功能号01H中的说明 | |
13 | 13 | 控制器驱动诊断 | AH=状态代码,参见功能号01H中的说明 | |
13 | 14 | 控制器内部诊断 | AH=状态代码,参见功能号01H中的说明 | |
13 | 15 | 读取磁盘类型 | DL=驱动器, 00H | 失败,CF=1,AH=状态代码,参见功能号01H中的说明 否则,CF=0,AH=00H — 未安装驱动器 =01H — 无改变线支持的软盘驱动器 =02H — 带有改变线支持的软盘驱动器 =03H — 硬盘,CX:DX=512字节的扇区数 |
13 | 16 | 读取磁盘变化状态 | DL=00H~7FH:软盘 | 磁盘未改变,CF=0,AH=00H, 否则,CF=1,AH=06H,参见功能号01H中的说明 |
13 | 17 | 设置磁盘类型 | DL=00H~7FH:软盘 AL=00H — 未用 =01H — 360K在360K驱动器中 =02H — 360K在1.2M驱动器中 =03H — 1.2M在1.2M驱动器中 =04H — 720K在720K驱动器中 | 操作成功,CF=0,AH=00H, 否则,CF=1,AH=状态编码,参见功能号01H中的说明 |
13 | 18 | 设置格式化媒体类型 | CH=柱面数 CL=每磁道的扇区数 DL=00H~7FH:软盘 | 操作成功,CF=0,AH=00H, ES:DI=介质类型参数表地址, 否则,CF=1,AH=状态编码,参见功能号01H中的说明 |
13 | 19 | 磁头保护(仅在PS/2中有效) | ||
13 | 1A | 格式化ESDI驱动器(仅在PS/2中有效) | ||
13 | 41 | 检验扩展功能是否存在(是否为扩展8.46GB硬盘) | BX = 55AAh DL = 驱动器号 | CF=0, AH = 扩展功能的主版本号 AL = 内部使用 BX = AA55h CX = API 子集支持位图 CF=1, AH = 错误码 01h,无效命令 这个调用检验对特定的驱动器是否存在扩展功能。 如果进位标志置 1则此驱动器不支持扩展功能。 如果进位标志为 0,同时 BX = AA55h,则存在扩展功能。 此时 CX 的 0 位表示是否支持第一个子集, 1位表示是否支持第二个子集. 对于 1.x 版的扩展 Int13H 来说,主版本号 AH = 1。 AL 是副版本号,但这仅限于 BIOS 内部使用, 任何软件不得检查 AL 的值。 |
13 | 42 | 扩展读 (大于8.46GB硬盘专用) | DL = 驱动器号 DS:DI = 磁盘地址数据包(Disk Address Packet) | 成功:CF=0,AH = 0 失败:CF=1,AH = 错误码这个调用将磁盘上的数据读入内存。如果出现错误,DAP 的 BlockCount项中则记录了出错前实际读取的数据块个数 |
14 | 0 | 初始化串行通讯口 | AL=初始化参数 DX=通讯口号(COM0,COM1,...) 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=通读口状态 AL=调制解调器状态AH=通信口状态, 各状态位为1时的含义如下: 位7—超时 位6—传递移位寄存器为空 位5—传递保持寄存器为空 位4—发现终止位3—发现帧错误 位2—发现奇偶错 位1—发现越界错 位0—接受数据准备好 AL=Modem状态 位7—接受单线信号诊断 位6—环指示器 位5—数据发送准备好 位4—清除数据,再发送位3—改变在接受线上的信号诊断 位2—后边界环指示器 位1—改变“数据准备好”状态 位0—改变“清除—发送”状态 |
14 | 1 | 向串行通讯口写字符 | AL=字符 DX=通讯口号(COM0,COM1...) | 写成功:(AH)7=0 写失败:(AH)7=1 (AH)0-6=通讯口状态 |
14 | 2 | 从串行通讯口读字符 | DX=通讯口号(COM0,COM1...) | 读成功:(AH)7=0 (AL)=字符 写失败:(AH)7=1 (AH)0-6=通讯口状态 |
14 | 3 | 取通讯口状态 | DX=通讯口号(COM0,COM1...) | AH=通讯口状态 AL=调制解调器状态(参见功能号00H中的说明) |
14 | 4 | 扩充初始化通信口(仅在PS/2中有效) | ||
15 | 0 | 启动盒式磁带马达 | AH=状态(86H,若未安装盒式磁带机) | |
15 | 1 | 停止盒式磁带马达 | AH=状态(86H,若未安装盒式磁带机) | |
15 | 2 | 磁带分块读 | ES:BX=数据传输区地址 CX=字节数 | AH=状态字节 AH=00 读成功 =01 冗余检验错 =02 无数据传输 =04 无引导操作成功, DX=实际读入的字节数, ES:BX指向最后一个字节的后面地址, 否则, AH=状态码,其值含义如下: 01H —— CRC校验码错 80H —— 非法命令 02H —— 位信号混乱 86H —— 未安装盒式磁带机 04H —— 无发现数据 |
15 | 3 | 磁带分块写 | DS:BX=数据传输区地址 CX=字节数 | 同上 |
15 | F | 格式化ESDI驱动器定期中断(仅在PS/2中有效) | ||
15 | 21 | 读/写自检(POST)错误记录(仅在PS/2中有效) | ||
15 | 4F | 键盘截听(仅在PS/2中有效) | ||
15 | 80 | 打开设备 | BX=设备号 CX=进程号 | 操作成功,AH=00H, 否则,AH=状态码 |
15 | 81 | 关闭设备 | BX=设备号 CX=进程号 | 操作成功,AH=00H, 否则,AH=状态码 |
15 | 82 | 进程终止 | BX=进程号 | 操作成功,AH=00H, 否则,AH=状态码 |
15 | 83 | 事件等待 | 若需要事件等待,则: AL=00H CX:DX=千分秒 ES:BX=信号量字节的地址 否则,调用参数为 AL=01H | 成功:CF=0, 否则:CF=1 |
15 | 84 | 读游戏杆 | DX=00H——读取开关设置 =01H——读取阻力输入 | CF=1H——操作失败, 否则, DX=00H时,AL=开关设置(位7~4) DX=01H时, AX:A(x) BX:A(y) CX:B(x) DX:B(y) |
15 | 85 | 系统请求(SysReq)键 | AL =00H——键按下 =01H——键放开 | 操作成功,AH=00H, 否则,AH=状态码 |
15 | 86 | 延迟 | CX:DX=千分秒 | 操作成功,AH=00H |
15 | 87 | 从常规内存和扩展内存之间移动扩展内存块 | 偏移量存储的信息 00h-0Fh 保留,但现全为0 10h-11h 段的长度(2CX-1或更大) 12h-14h 24位源地址 15h 访问权限字节(其值为93h) 16h-17h 保留,但现全为0 18h-19h 段的长度(2CX-1或更大) 1Ah-1Ch 24位目标源地址 1Dh 访问权限字节(其值为93h) 1Eh-2Fh 保留,但现全为0 | 操作成功,AH=00H, 否则,AH=状态码,其含义如下: 01H —— RAM奇偶错 02H —— 异常中断错 03H —— 20号线门地址失败 |
15 | 88 | 读取扩展内存大小 | AX=扩展内存字节数(以K为单位) | |
15 | 89 | 进入保护模式,CPU从实模式进入保护模式 | BH=IRQ0的中断号 BL=IRQ8的中断号 ES:SI=GDT的地址(参见功能号87H) | 操作失败,AH=0FFH, 否则 ,AH=00H,CS、DS、ES和SS都是用户定义的选择器 |
15 | 90 | 设备等待 | AL=驱动器类型,具体的驱动器类型定义如下: =00H | 操作失败, 否则,AH=00H |
15 | 91 | 设备加电自检 | AL=00H | AH=00H |
15 | C0 | 读取系统环境 | 入口参数: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保留 | |
15 | C1 | 读取扩展BIOS数据区地址(仅在PS/2中有效) | ||
15 | C2 | 鼠标图形(仅在PS/2中有效) | ||
15 | C3 | 设置WatcHdog超时(仅在PS/2中有效) | ||
15 | C4 | 可编程选项选择,仅在PS/2中有效 | ||
16 | 0 | 从键盘读字符 | AL=字符码(ASCII码) AH=扫描码 | |
16 | 10 | 从键盘读字符(扩展) | 根据0000:0496H单元的内容判断:扩展键盘是否有效 | AL=字符码(ASCII码) AH=扫描码 |
16 | 1 | 读键盘缓冲区字符 | ZF=0 AL=字符码(ASCII码) AH=扫描码 ZF=1 缓冲区空 | |
16 | 11 | 读键盘缓冲区字符(扩展) | 根据0000:0496H单元的内容判断:扩展键盘是否有效 | ZF=0 AL=字符码(ASCII码) AH=扫描码 ZF=1 缓冲区空 |
16 | 2 | 读键盘状态字节 | AL=键盘状态字节AL=键盘标志(02H和12H都有效), 其各位之值为1时的含义如下: 位7—INS开状态 位3—ALT键按下 位6—CAPS LOCK开状态 位2—CTRL键按下 位5—NUM LOCK开状态 位1—左SHIFT键按下 位4—SCROLL LOCK开状态 位0—右SHIFT键按下 | |
16 | 12 | 读键盘状态字节(扩展) | 根据0000:0496H单元的内容判断:扩展键盘是否有效 | AL=键盘状态字节AL=键盘标志, 其各位之值为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键按下 |
16 | 3 | 设置重复率 | 对于PC/AT和PS/2: AL=05H BH=重复延迟 BL=重复率 对于PCjr: AL=00H——装入缺省的速率和延迟 =01H——增加初始延迟 =02H——重复频率降低一半 =03H——增加延迟和降低一半重复频率 =04H——关闭键盘重复功能 | |
16 | 4 | 设置键盘点击 | AL=00H——关闭键盘点击功能 AL=01H——打开键盘点击功能 | |
16 | 5 | 字符及其扫描码进栈 | CH=字符的描述码 CL=字符的ASCII码 | 操作成功,AL=00H, 否则,AL=01H |
17 | 0 | 打印字符 回送状态字节 | AL=字符 DX=打印机号(0—LPT1,1—LPT2,2—LPT3,……) | AH=打印机状态字节位7—打印机空闲 位6—打印机响应 位5—无纸 位4—打印机被选 位3—I/O错误 位2—保留 位1—保留 位0—打印机超时 |
17 | 1 | 初始化打印机 回送状态字节 | DX=打印机号(0—LPT1,1—LPT2,2—LPT3,……) | AH=打印机状态字节 |
17 | 2 | 取状态字节 | DX=打印机号(0—LPT1,1—LPT2,2—LPT3,……) | AH=打印机状态字节 |
1A | 0 | 读时钟 | CH:CL=时:分 DH:DL=秒:1/100秒 | |
1A | 1 | 置时钟 | CH:CL=时:分 DH:DL=秒:1/100秒 | |
1A | 2 | 读实时钟 | CH:CL=时:分(BCD码格式) DH:DL=秒:1/100秒(BCD码格式) | |
1A | 3 | 设置时间 | ||
1A | 4 | 读取日期 | CH=BCD码格式的世纪 CL=BCD码格式的年 DH=BCD码格式的月 DL=BCD码格式的日 CF=0——时钟在走,否则,时钟停止 | |
1A | 5 | 设置日期 | CH=BCD码格式的世纪 CL=BCD码格式的年 DH=BCD码格式的月 DL=BCD码格式的日 | |
1A | 6 | 置报警时间 | CH:CL=时:分(BCD) DH:DL=秒:1/100秒(BCD) | CF=0——操作成功, 否则,闹钟已设置或时钟已停止 |
1A | 7 | 清除报警(闹钟复位) | ||
1A | A | 读取天数计数(仅在PS/2有效) | ||
1A | B | 设置天数计数(仅在PS/2有效) | ||
1A | 80 | 设置声音源信息 | AL=声音源 =00H——8253可编程计时器,通道2 =01H——盒式磁带输入 =02H——I/O通道上的"Audio In" =03H——声音产生芯片 | |
0 | “0”作除数 | |||
1 | 单步中断 | |||
2 | 非屏蔽中断(NMI) | |||
3 | 断点中断 | |||
4 | 算术溢出错误 | |||
5 | 打印屏幕和BOUND越界 | |||
6 | 非法指令错误 | |||
7 | 处理器扩展无效 | |||
8 | 时钟中断 | |||
9 | 键盘输入 | |||
B | 通信口(COM2:) | |||
C | 通信口(COM1:) | |||
E | 磁盘驱动器输入/输出 | |||
11 | 读取设备配置 | |||
12 | 读取常规内存大小(返回值AX为内存容量,以K为单位) | |||
18 | ROM BASIC | 很多BIOS显示"PRESS A KEY TO REBOOT" | ||
19 | 重启动系统 | |||
1B | CTRL+BREAK处理程序 | |||
1C | 用户时钟服务 | |||
1D | 指向显示器参数表指针 | |||
1E | 指向磁盘驱动器参数表指针 | |||
1F | 指向图形字符模式表指针 |
评论