概述

section和segment的区别
  • section 称为节,是指在汇编源码中经由关键字 section 或 segment 修饰

  • segment 称为段,是链接器根据目标文件中属性相同的多个 section 合并后的 section 集合

MBR主引导程序

MBR步骤:

1、清屏、验证

2、载入loader

载入内存:

(1)程序被加载器(软件或硬件)加载到内存某个区域。

(2)CPU 的 cs:ip 寄存器被指向这个程序的起始地址。

image-20240916170201765

image-20250215142238753

image-20240916170243834

完善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)

image-20240917182059166

image-20240917182037875

image-20240917233700801

保护模式

image-20250215193858128

image-20240917220859458

进入保护模式需要三个步骤。

(1)打开 A20。

(2)加载 gdt。

(3)将 cr0 的 pe 位置 1。

A20

步骤:

将端口 0x92 的第 1 位置 1

在保护模式下, 我们需要突破第 20 条地址线(A20)去访问更大的内存空间,而这一切,只有关闭了地址回绕才能实现。 而关闭地址回绕,就是打开 A20Gate

image-20240917230514678

GDT

image-20240917221722887

实际的段界限边界值= (描述符中段界限+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 位代码段

image-20240917222547812

表中的 A 位表示 Accessed 位,这是由 CPU 来设置的,每当该段被 CPU 访问过后,CPU 就将此位置 1。

C 表示一致性代码段,也称为依从代码段,如果其是转移的目标段,特权级一定要高于当前特权级,转移后的特权级不与自己的 DPL 为主, 而是与转移前的低特权级一致,也就是听从、依从转移前的低特权级

R 表示可读,R 为 1 表示可读,R 为 0 表示不可读

X 表示该段是否可执行

E 是用来标识段的扩展方向,Extend。E 为 0 表示向上扩展,即地址越来越高,通常用于代码段和数 据段。E 为 1 表示向下扩展,地址越来越低,通常用于栈段

W 是指段是否可写,Writable。W 为 1 表示可写,通常用于数据段。

image-20240917223627314

由于 GDT 的大小是 16 位二进制,其表示的范围是 2 的16次方等于65536字节。每个描述符大小是8字节,故,GDT中最多可容纳的描述符数量是65536/8=8192 个,即 GDT 中可容纳 8192 个段或门

image-20240917224753740

低 2 位存储 RPL,即请求特权级

第 2 位是 TI 位,即 Table Indicator,用来指示选择子是在 GDT 中,还是 LDT 中索引描述符

段基址在段描述符中,用给出的选择子(LDT)索引到描述符后,CPU 自动从段描述符中取出段基址,这样再加上段内偏移地址,便凑成 了“段基址:段内偏移地址”的形式

保护模式的开关,CR0 寄存器的 PE 位

image-20240917230857470

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

image-20240924130338026

image-20240924130406839

内存信息的内容是用地址范围描述符来描述的,用于存 储这种描述符的结构称之为地址范围描述符(Address Range Descriptor Structure,ARDS

由于我们在 32 位环境下工作,所以在 ARDS 结构属性中,我们只用到低 32 位属性。 BaseAddrLow+LengthLow 是一片内存区域上限,单位是字节。

image-20240924130542673

image-20240924130601161

AX=0xE801

AX、CF、AXx1024+BXx64x1024

image-20240924131000390

有一些 ISA 设备要用到地址 15MB 以上的内存作为缓冲区,也就是此缓冲区为 1MB 大小

AH=0x88

image-20240924132019997

启用内存分页

步骤:

(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 位,表示可用

image-20250216210014474

image-20250216210047430

其他

知识点

MBR Main Boot Record、 Master Boot Record 主引导扇区记录

IVT Interrupt Vector Table 中断向量表

CHS方法,即柱面Cylinder 磁 头Header 扇区Sector,另外一种是LBA方式

在CHS方式中扇区的编号是从1开始的,而LBA方式中, 扇区编号是从0开始的

linux命令:dd用于磁盘操作,man dd查看帮助文件

image-20250215131220253

image-20250215140513571

image-20250215142855526

image-20250215142947198

image-20250215182616883

BIOS 中断向量表

中断描述
INT 00hCPU:除零错,或商不合法时触发
INT 01hCPU:单步陷阱,TF标记为打开状态时,每条指令执行后触发
INT 02hCPU:非可屏蔽中断,如引导自我测试时发生内存错误。
INT 03hCPU:第一个未定义的中断向量,约定俗成仅用于调试程序
INT 04hCPU:算数溢出。通常由INTO指令在置溢出位时触发。
INT 05h在按下Shift-Print Screen或BOUND指令检测到范围异常时触发。
INT 06hCPU:非法指令。
INT 07hCPU:没有数学协处理器时尝试执行浮点指令触发。
INT 08hIRQ0:可编程中断控制器每 55 毫秒触发一次,即每秒 18.2 次。
INT 09hIRQ1:每次键盘按下、按住、释放。
INT 0AhIRQ2:
INT 0BhIRQ3:COM2/COM4
INT 0ChIRQ4:COM1/COM3
INT 0DhIRQ5:硬盘控制器(PC/XT 下)或 LPT2
INT 0EhIRQ6:需要时由软盘控制器调用。
INT 0FhIRQ7: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 1BhCtrl+Break,由 IRQ 9 自动调用。
INT 1Ch预留,由 IRQ 8 自动调用。
INT 1Dh不可调用:指向视频参数表(包含视频模式的数据)的指针。
INT 1Eh不可调用:指向软盘模式表(包含关于软驱的大量信息)的指针。
INT 1Fh不可调用:指向视频图形字符表(包含从 80h 到 FFh 的 ASCII 字符的数据)的信息。
INT 41h地址指针:硬盘参数表(第一硬盘)。
INT 46h地址指针:硬盘参数表(第二硬盘)。
INT 4Ah实时钟在闹铃时调用。
INT 70hIRQ8:由实时钟调用。
INT 74hIRQ12:由鼠标调用
INT 75hIRQ13:由数学协处理器调用。
INT 76hIRQ14:由第一个 IDE 控制器所调用
INT 77hIRQ15:由第二个 IDE 控制器所调用

|

INTAH功能调用参数返回参数
100设置显示方式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文本模式
101置光标类型(CH)0-3=光标起始行 {CH低四位=光标的起始行} (CL)0-3=光标结束行 {CL低四位=光标的终止行}
102置光标位置BH=页号 DH=行(X坐标),DL=列(Y坐标)
103读光标位置(在文本坐标下,读取光标各种信息)BH=页号CH=光标起始行 DH=行,DL=列
104读光笔位置(获取当前状态和光笔位置)AH=0 光笔未触发 =1 光笔触发 CH=象素行 (图形Y坐标,显示模式:04H06H) BX=象素列 (图形Y坐标,显示模式:0DH10H) DH=字符行 (文本Y坐标) DL=字符列 (文本X坐标)
105置显示页(即选择活动的显示页)AL=页号AL=显示页 对于CGA、EGA、MCGA和VGA,其显示页如下表所列: 模式页数显示器类型 00H、01H 07CGA、EGA、MCGA、VGA 02H、03H 03CGA 02H、03H 07EGA、MCGA、VGA 07H 07EGA、VGA 0DH 07EGA、VGA 0EH 03EGA、VGA 0FH 01EGA、VGA 10H 01EGA、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页寄存器
106屏幕初始化或上卷AL=上卷行数 AL=0 整个窗口空白 BH=卷入行属性 CH=左上角行号 (CH、CL)=窗口的左上角位置(Y坐标,X坐标) CL=左上角列号 DH=右下角行号 (DH、DL)=窗口的右下角位置(Y坐标,X坐标) DL=右下角列号
107屏幕初始化或下卷AL=下卷行数 AL=0 整个窗口空白 BH=卷入行属性 CH=左上角行号 (CH、CL)=窗口的左上角位置(Y坐标,X坐标) CL=左上角列号 DH=右下角行号 (CH、CL)=窗口的左上角位置(Y坐标,X坐标) DL=右下角列号
108读光标位置的字符和属性BH=显示页AH=属性 AL=字符
109在光标位置显示字符及属性BH=显示页 AL=字符 BL=属性 属性(文本模式)或颜色(图形模式) CX=字符重复次数(重复输出字符的次数)
10A在光标位置显示字符BH=显示页 BL=颜色(图形模式,仅适用于PCjr) AL=字符 CX=字符重复次数(重复输出字符的次数)
10B置彩色调板(320×200图形)BH=彩色调板ID BL=和ID配套使用的颜色设置颜色: BH=00H,BL=颜色 选择调色板: BH=01H,BL=调色板(320×200、4种颜色的图形模式)
10C写象素DX=行(0-199) CX=列(0-639) AL=象素值 BH=页码
10D读象素DX=行(0-199) CX=列(0-639) BH=页码AL=象素值
10E显示字符 (光标前移)AL=字符 BL=前景色(图形模式) BH=页码
10F取当前显示方式AH=字符列数 AL=显示方式(参见功能00H中的说明)
1010颜色中断00H — 设置调色板寄存器 01H — 设置边框颜色 02H — 设置调色板和边框 03H — 触发闪烁/亮显位 07H — 读取调色板寄存器 08H — 读取边框颜色 09H — 读取调色板和边框 10H — 设置颜色寄存器 12H — 设置颜色寄存器块 13H — 设置颜色页状态 15H — 读取颜色寄存器 17H — 读取颜色寄存器块 1AH — 读取颜色页状态 1BH — 设置灰度值
1011字体中断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 读取字体信息
1012显示器的配置中断10H — 读取配置信息 20H — 选择屏幕打印 30H — 设置扫描行 31H — 允许/禁止装入缺省调色板 32H — 允许/禁止显示 33H — 允许/禁止灰度求和 34H — 允许/禁止光标模拟 35H — 切换活动显示 36H — 允许/禁止屏幕刷新
1013显示字符串(适用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,...光标返回起始位置 光标跟随移动 光标返回起始位置 光标跟随移动
101A读取/设置显示组合编码,仅PS/2有效
101B读取功能/状态信息,仅PS/2有效
101C保存/恢复显示器状态,仅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)
130软盘系统复位(磁盘系统复位)DL=驱动器, 00H7FH:软盘; 80H0FFH:硬盘CF=0——操作成功,AH=00H, 否则,AH=状态代码,参见功能号01H中的说明
131读软盘状态DL=驱动器, 00H7FH:软盘; 80H0FFH:硬盘成功: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 — 检测操作失败(硬盘)
132读磁盘AL=扇区数 CH,CL=磁盘号,扇区号 DH=磁头号 ES:BX=数据缓冲区地址 DL:驱动器号 00H7FH:软盘; 80H0FFH:硬盘读成功:CF=0,AH=0 AL=读取的扇区数 读失败:CF=1,AH=出错代码 (参见功能号01H中的说明)
133写磁盘同上写成功:CF=0,AH=0 AL=写入的扇区数 写失败:CF=1,AH=出错代码
134检验磁盘扇区同上(ES:BX不设置)成功:CF=0,AH=0 AL=检验的扇区数 失败:CF=1,AH=出错代码
135格式化盘磁道ES:BX=磁道地址AL=交替(Interleave) CH=柱面 DH=磁头 DL=驱动器, 00H7FH:软盘; 80H0FFH:硬盘 ES:BX=地址域列表的地址成功:CF=0,AH=0 失败:CF=1,AH=出错代码
136格式化坏磁道AL=交替 CH=柱面 DH=磁头 DL=80H~0FFH:硬盘 ES:BX=地址域列表的地址成功:CF=0,AH=0 失败:CF=1,AH=状态代码,参见功能号01H中的说明
137格式化驱动器AL=交替 CH=柱面 DL=80H~0FFH:硬盘成功:CF=0,AH=00H, 失败:CF=1,AH=状态代码,参见功能号01H中的说明
138读取驱动器参数DL=驱动器: 00H7FH:软盘; 80H0FFH:硬盘失败: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=磁盘驱动器参数表地址
139初始化硬盘参数DL=80H~0FFH:硬盘(还有有关参数表问题,在此从略)操作成功,CF=0,AH=00H, 否则,CF=1,AH=状态代码,参见功能号01H中的说明
13A读长扇区,每个扇区随带四个字节的ECC编码AL=扇区数 CH=柱面 CL=扇区 DH=磁头 DL=80H~0FFH:硬盘 ES:BX=缓冲区的地址成功:CF=0,AH=00H,AL=传输的扇区数, 否则:CF=1,AH=状态代码,参见功能号01H中的说明
13B写长扇区,每个扇区随带四个字节的ECC编码AL=扇区数 CH=柱面 CL=扇区 DH=磁头 DL=80H~0FFH:硬盘 ES:BX=缓冲区的地址成功,CF=0,AH=00H,AL=传输的扇区数, 否则,CF=1,AH=状态代码,参见功能号01H中的说明
13C查寻CH=柱面的低8位 CL(7-6位)=柱面的高2位 DH=磁头 DL=80H~0FFH:硬盘成功,CF=0,AH=00H, 否则,CF=1,AH=状态代码,参见功能号01H中的说明
13D硬盘系统复位DL=80H~0FFH:硬盘成功,CF=0,AH=00H, 失败,CF=1,AH=状态代码,参见功能号01H中的说明
13E读扇区缓冲区ES:BX=缓冲区的地址操作成功,CF=0, 否则,CF=1,AH=状态代码,参见功能号01H中的说明
13F写扇区缓冲区ES:BX=缓冲区的地址操作成功,CF=0, 否则,CF=1,AH=状态代码,参见功能号01H中的说明
1310读取驱动器状态DL=80H~0FFH:硬盘操作成功,CF=0,AH=00H, 否则,CF=1,AH=状态代码,参见功能号01H中的说明
1311校准驱动器DL=80H~0FFH:硬盘操作成功,CF=0,AH=00H, 否则,CF=1,AH=状态代码,参见功能号01H中的说明
1312控制器RAM诊断成功:CF=0, 否则,CF=1,AH=状态代码,参见功能号01H中的说明
1313控制器驱动诊断AH=状态代码,参见功能号01H中的说明
1314控制器内部诊断AH=状态代码,参见功能号01H中的说明
1315读取磁盘类型DL=驱动器, 00H7FH:软盘; 80H0FFH:硬盘失败,CF=1,AH=状态代码,参见功能号01H中的说明 否则,CF=0,AH=00H — 未安装驱动器 =01H — 无改变线支持的软盘驱动器 =02H — 带有改变线支持的软盘驱动器 =03H — 硬盘,CX:DX=512字节的扇区数
1316读取磁盘变化状态DL=00H~7FH:软盘磁盘未改变,CF=0,AH=00H, 否则,CF=1,AH=06H,参见功能号01H中的说明
1317设置磁盘类型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中的说明
1318设置格式化媒体类型CH=柱面数 CL=每磁道的扇区数 DL=00H~7FH:软盘操作成功,CF=0,AH=00H, ES:DI=介质类型参数表地址, 否则,CF=1,AH=状态编码,参见功能号01H中的说明
1319磁头保护(仅在PS/2中有效)
131A格式化ESDI驱动器(仅在PS/2中有效)
1341检验扩展功能是否存在(是否为扩展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 的值。
1342扩展读 (大于8.46GB硬盘专用)DL = 驱动器号 DS:DI = 磁盘地址数据包(Disk Address Packet)成功:CF=0,AH = 0 失败:CF=1,AH = 错误码这个调用将磁盘上的数据读入内存。如果出现错误,DAP 的 BlockCount项中则记录了出错前实际读取的数据块个数
140初始化串行通讯口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—改变“清除—发送”状态
141向串行通讯口写字符AL=字符 DX=通讯口号(COM0,COM1...)写成功:(AH)7=0 写失败:(AH)7=1 (AH)0-6=通讯口状态
142从串行通讯口读字符DX=通讯口号(COM0,COM1...)读成功:(AH)7=0 (AL)=字符 写失败:(AH)7=1 (AH)0-6=通讯口状态
143取通讯口状态DX=通讯口号(COM0,COM1...)AH=通讯口状态 AL=调制解调器状态(参见功能号00H中的说明)
144扩充初始化通信口(仅在PS/2中有效)
150启动盒式磁带马达AH=状态(86H,若未安装盒式磁带机)
151停止盒式磁带马达AH=状态(86H,若未安装盒式磁带机)
152磁带分块读ES:BX=数据传输区地址 CX=字节数AH=状态字节 AH=00 读成功 =01 冗余检验错 =02 无数据传输 =04 无引导操作成功, DX=实际读入的字节数, ES:BX指向最后一个字节的后面地址, 否则, AH=状态码,其值含义如下: 01H —— CRC校验码错 80H —— 非法命令 02H —— 位信号混乱 86H —— 未安装盒式磁带机 04H —— 无发现数据
153磁带分块写DS:BX=数据传输区地址 CX=字节数同上
15F格式化ESDI驱动器定期中断(仅在PS/2中有效)
1521读/写自检(POST)错误记录(仅在PS/2中有效)
154F键盘截听(仅在PS/2中有效)
1580打开设备BX=设备号 CX=进程号操作成功,AH=00H, 否则,AH=状态码
1581关闭设备BX=设备号 CX=进程号操作成功,AH=00H, 否则,AH=状态码
1582进程终止BX=进程号操作成功,AH=00H, 否则,AH=状态码
1583事件等待若需要事件等待,则: AL=00H CX:DX=千分秒 ES:BX=信号量字节的地址 否则,调用参数为 AL=01H成功:CF=0, 否则:CF=1
1584读游戏杆DX=00H——读取开关设置 =01H——读取阻力输入CF=1H——操作失败, 否则, DX=00H时,AL=开关设置(位7~4) DX=01H时, AX:A(x) BX:A(y) CX:B(x) DX:B(y)
1585系统请求(SysReq)键AL =00H——键按下 =01H——键放开操作成功,AH=00H, 否则,AH=状态码
1586延迟CX:DX=千分秒操作成功,AH=00H
1587从常规内存和扩展内存之间移动扩展内存块偏移量存储的信息 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号线门地址失败
1588读取扩展内存大小AX=扩展内存字节数(以K为单位)
1589进入保护模式,CPU从实模式进入保护模式BH=IRQ0的中断号 BL=IRQ8的中断号 ES:SI=GDT的地址(参见功能号87H)操作失败,AH=0FFH, 否则 ,AH=00H,CS、DS、ES和SS都是用户定义的选择器
1590设备等待AL=驱动器类型,具体的驱动器类型定义如下: =00H7FH——串行再重用设备 =80H0BFH——可重入式设备 =0C0H0FFH——等待访问设备,没有自检功能 00h — 磁盘 02h — 键盘 80h — 网络 FDh — 软盘马达启动01h — 软盘 03h — 点设备(Pointing Device) FCh — 硬盘复位 FEh — 打印机 ES:BX=对驱动器类型80H0FFH的请求块地址操作失败, 否则,AH=00H
1591设备加电自检AL=00H7FH——串行再重用设备 =80H0BFH——可重入式设备AH=00H
15C0读取系统环境入口参数: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保留
15C1读取扩展BIOS数据区地址(仅在PS/2中有效)
15C2鼠标图形(仅在PS/2中有效)
15C3设置WatcHdog超时(仅在PS/2中有效)
15C4可编程选项选择,仅在PS/2中有效
160从键盘读字符AL=字符码(ASCII码) AH=扫描码
1610从键盘读字符(扩展)根据0000:0496H单元的内容判断:扩展键盘是否有效AL=字符码(ASCII码) AH=扫描码
161读键盘缓冲区字符ZF=0 AL=字符码(ASCII码) AH=扫描码 ZF=1 缓冲区空
1611读键盘缓冲区字符(扩展)根据0000:0496H单元的内容判断:扩展键盘是否有效ZF=0 AL=字符码(ASCII码) AH=扫描码 ZF=1 缓冲区空
162读键盘状态字节AL=键盘状态字节AL=键盘标志(02H和12H都有效), 其各位之值为1时的含义如下: 位7—INS开状态 位3—ALT键按下 位6—CAPS LOCK开状态 位2—CTRL键按下 位5—NUM LOCK开状态 位1—左SHIFT键按下 位4—SCROLL LOCK开状态 位0—右SHIFT键按下
1612读键盘状态字节(扩展)根据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键按下
163设置重复率对于PC/AT和PS/2: AL=05H BH=重复延迟 BL=重复率 对于PCjr: AL=00H——装入缺省的速率和延迟 =01H——增加初始延迟 =02H——重复频率降低一半 =03H——增加延迟和降低一半重复频率 =04H——关闭键盘重复功能
164设置键盘点击AL=00H——关闭键盘点击功能 AL=01H——打开键盘点击功能
165字符及其扫描码进栈CH=字符的描述码 CL=字符的ASCII码操作成功,AL=00H, 否则,AL=01H
170打印字符 回送状态字节AL=字符 DX=打印机号(0—LPT1,1—LPT2,2—LPT3,……)AH=打印机状态字节位7—打印机空闲 位6—打印机响应 位5—无纸 位4—打印机被选 位3—I/O错误 位2—保留 位1—保留 位0—打印机超时
171初始化打印机 回送状态字节DX=打印机号(0—LPT1,1—LPT2,2—LPT3,……)AH=打印机状态字节
172取状态字节DX=打印机号(0—LPT1,1—LPT2,2—LPT3,……)AH=打印机状态字节
1A0读时钟CH:CL=时:分 DH:DL=秒:1/100秒
1A1置时钟CH:CL=时:分 DH:DL=秒:1/100秒
1A2读实时钟CH:CL=时:分(BCD码格式) DH:DL=秒:1/100秒(BCD码格式)
1A3设置时间
1A4读取日期CH=BCD码格式的世纪 CL=BCD码格式的年 DH=BCD码格式的月 DL=BCD码格式的日 CF=0——时钟在走,否则,时钟停止
1A5设置日期CH=BCD码格式的世纪 CL=BCD码格式的年 DH=BCD码格式的月 DL=BCD码格式的日
1A6置报警时间CH:CL=时:分(BCD) DH:DL=秒:1/100秒(BCD)CF=0——操作成功, 否则,闹钟已设置或时钟已停止
1A7清除报警(闹钟复位)
1AA读取天数计数(仅在PS/2有效)
1AB设置天数计数(仅在PS/2有效)
1A80设置声音源信息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为单位)
18ROM BASIC很多BIOS显示"PRESS A KEY TO REBOOT"
19重启动系统
1BCTRL+BREAK处理程序
1C用户时钟服务
1D指向显示器参数表指针
1E指向磁盘驱动器参数表指针
1F指向图形字符模式表指针