第 8 章
使用 C 的磁盘 BIOS 功能和中断处理
介绍
在本章中,我们将讨论 Disk-BIOS 的重要特性以及其他重要特性,这些特性使我们能够以简单、简短的方法在 C 程序中自由地使用和处理中断。这些功能是数据恢复和磁盘故障排除编程的基础。这些特点使得C 语言成为“高级汇编语言” 。
biosdisk 和 _bios_disk 的功能
这两个功能对于我们进行数据恢复和磁盘故障排除编程的目的是最重要的。我们大多数时候都会用到这些功能。
这两个函数是 BIOS 磁盘驱动器服务,在 bios.h 中定义,其中 biosdisk 在原始扇区上的文件级别以下进行操作。如果使用这些功能时稍有不慎,都可能破坏硬盘上文件和目录的内容。 biosdisk 和 _bios_disk 函数都使用中断 0x13 将磁盘操作直接传递给 BIOS。 _bios_disk函数在程序中声明如下:
无符号_bios_disk(无符号命令,struct diskinfo_t *dinfo);
BIOS 磁盘功能的声明如下所示:
int biosdisk(int cmd,int 驱动器,int 磁头,int 磁道,
int 扇区,int nsects,void *缓冲区);
这些参数的含义如下表所示:
范围 |
功能 |
它是什么或它有什么作用 |
命令 |
两个都 |
指定要执行的操作,如读取、写入、检查等(见下面cmd的说明) |
信息 |
_bios_磁盘 |
指向包含操作所需的其余参数的diskinfo_t结构。 (参见下面diskinfo_t结构的描述) |
开车 |
BIOS磁盘 |
指定将使用哪个磁盘(0 表示 a:、1 表示 b:、0x80 表示第一个物理硬盘、0x81 表示第二个物理硬盘,等等) |
头部
轨迹区
|
BIOS磁盘 |
它们定义了操作开始的起始扇区的位置。 |
昆虫 |
BIOS磁盘 |
要读取、写入、检查等的扇区数。 |
缓冲 |
BIOS磁盘 |
需要读取或写入数据的内存地址。 |
在这两个函数中,数据都被读写到每个扇区 512 字节的缓冲区中,这是硬盘的逻辑扇区大小,两个函数的返回值都是 BIOS 调用 INT 0x13H 设置的 AX 寄存器的值。
如果该功能成功,则高字节 = 0,表示成功完成,低字节包含读取、写入或验证的扇区数等。
但如果发生任何错误,导致函数没有执行成功,那么高字节的值将对应下列错误代码之一,如下表所述:
价值 |
描述 |
0x00 |
成功完成(不是错误!!) |
0x01 |
糟糕的团队 |
0x02 |
未找到地址标签 |
0x03 |
尝试写入写保护的磁盘 |
0x04 |
未找到扇区 |
0x05 |
重置失败(硬盘) |
0x06 |
自上次操作以来,磁盘已被修改。 |
0x07 |
执行驱动器参数操作失败 |
0x08 |
直接内存访问 (DMA) 溢出 |
0x09 |
尝试跨 64K 边界执行 DMA(数据边界错误或扇区 >80H) |
0x0A |
检测到坏扇区 |
0x0B |
检测到坏道 |
0x0C |
不受支持的轨道 |
0x0D |
格式化时扇区数不正确(PS/2 硬盘) |
0x0E |
检测到控制数据地址标记(硬盘) |
0x0F |
DMA 仲裁级别超出范围(硬盘) |
0x10 |
读取磁盘时 CRC/ECC 不正确 |
0x11 |
CRC/ECC 数据校正错误(不是真正的错误) |
0x20 |
控制器故障 |
0x31 |
驱动器中没有介质(IBM/MS INT 13 扩展) |
0x32 |
CMOS 中存储了错误的磁盘类型(Compaq) |
0x40 |
搜索操作失败。 |
0x80 |
附件没有响应 |
0xAA |
磁盘未准备好(仅硬盘) |
0xB0 |
卷未锁定到磁盘(INT 13 扩展) |
0xB1 |
磁盘上的卷锁定(INT 13 扩展) |
0xB2 |
不可移动卷(INT 13 扩展) |
0xB3 |
使用量(INT 13 扩展) |
0xB4 |
锁的数量超出 (INT 13 扩展) |
0xB5 |
无法执行有效的抛出请求(INT 扩展 13) |
0xBB |
发生未指定的错误(仅限硬盘) |
0xCC |
录制有误 |
0xE0 |
状态寄存器错误 |
0xFF |
操作感知失败 |
下表列出了cmd参数要执行的操作命令。首先,我们来看一下这两个函数的一般操作。
BIOS磁盘 |
_bios_磁盘 |
他在做什么? |
0 |
_磁盘_重置 |
重置磁盘系统,强制驱动器控制器进行硬重置。忽略所有其他参数 |
1 |
_磁盘_状态 |
返回最后一个磁盘操作的状态。忽略所有其他参数 |
2 |
_磁盘_读取 |
将一个或多个磁盘扇区读入内存 |
3 |
_磁盘_写入 |
从内存中写入一个或多个磁盘扇区 |
4 |
_磁盘_验证 |
验证一个或多个扇区 |
5 |
_磁盘_格式 |
格式化曲目 |
虽然您可以自由使用 cmd = 0、1、2、3、4、5 或 cmd = _DISK_RESET、_DISK_STATUS、_DISK_READ、_DISK_WRITE、_DISK_VARIFY 和 _DISK_FORMAT,并且两个选项具有相同的效果,但建议您养成使用诸如 cmd = _DISK_FORMAT 而不是 cmd = 5 之类的单词选项的习惯,因为它可以帮助您避免因输入错误的 cmd 命令编号而可能发生的错误。
在 biosdisk 或 _bios_disk 函数的声明中,如果我们给出 cmd = _DISK_RESET,该函数将忽略所有其他参数重置磁盘系统,而 _DISK_STATUS 将忽略所有其他参数返回最后一个磁盘操作的状态
对于 cmd =_DISK_READ、_DISK_WRITE 或 _DISK_VERIFY(2、3 或 4),biosdisk 和 _bios_disk 函数还使用如下所示的其他参数:
范围 |
它的作用 |
头部
轨迹
区 |
这三个指定了指定操作的起始扇区的位置。(最小可能值可能是磁头 = 0、磁道 = 0 和扇区 =1) |
部门 |
这指定要读取或写入的扇区数 |
缓冲 |
它指向要读取和写入数据的缓冲区 |
如果 cmd 的值 = 5 (_DISK_FORMAT),biosdisk 和 _bios_disk 将根据表中的描述使用以下参数。始终建议您在使用 _DISK_FORMAT 时要小心谨慎,并且您应该知道要做什么。缺乏知识甚至一个小错误都可能让您面临大量数据丢失。
范围 |
它的作用 |
头部
轨迹 |
这些指定要格式化的轨道的位置 |
缓冲 |
它指向要写入指定磁道的扇区头表 |
cmd 还有一些其他值仅供 biosdisk 函数使用。这些 cmd 值仅允许用于 XT、AT、PS/2 和兼容机。下表中描述了这些值:
命令 |
它的作用 |
6 |
格式化磁道并设置坏扇区标志 |
7 |
从特定磁道开始格式化驱动器 |
8 |
返回缓冲区前 4 个字节中的当前驱动器参数 |
9 |
初始化驱动对特性 |
10 |
执行长时间读取(每个扇区 512 加 4 个额外字节) |
11 |
执行长写入(每个扇区 512 加 4 个额外字节) |
12 |
磁盘寻道 |
十三 |
备用磁盘重置 |
14 |
读取扇区缓冲区 |
15 |
写入扇区缓冲区 |
16 |
测试指定驱动器是否已准备就绪 |
17 |
重新校准驱动器 |
18 |
控制器 RAM 诊断 |
19 |
驱动器诊断 |
20 |
控制器内部诊断 |
diskinfo_t 结构
diskinfo_t结构体被_bios_disk函数使用,该结构体描述如下:
结构磁盘信息_t {
未签名的驱动器,磁头,磁道,扇区,nsectors;
空远*缓冲区;
};
其中 drive 指定要使用的磁盘驱动器。请始终记住,对于硬盘,指定的是物理驱动器,而不是磁盘分区。如果要操作分区,应用程序还必须解释该磁盘本身的分区表信息。
head、track 和 sector 的值指定操作的起始扇区的位置。nsectors 指定要读取或写入的扇区数,buffer 指向读取和写入数据的缓冲区。根据 cmd 的值,diskinfo_t 结构中的其他参数可能需要也可能不需要。
下表给出了 biosdisk 和 _bios_disk 函数中使用的磁盘驱动器规范的值:
驱动价值 |
要使用的磁盘驱动器 |
0 |
第一个软盘驱动器 |
1 |
第二个软盘驱动器 |
2 |
第三个软盘驱动器 |
.... |
(等等) |
0x80 |
第一个硬盘驱动器 |
0x81 |
第二块硬盘 |
0x82 |
第三个硬盘驱动器 |
.... |
(等等) |
理论讲得够多了!现在让我们看一些实际的东西和这些函数的例子。下面的例子读取软盘四条磁道两侧的扇区,并将内容存储到用户指定的文件中。如果您从磁盘中删除了文件,这也没关系,因为程序直接读取磁盘表面。
要查看已删除的数据,最好使用完全格式化的软盘并复制一些文本文件,例如 .c 程序编码或其他文本文件(以便您了解文件的内容),占用大约 73KB(数据存储在四个轨道、两个侧面和每个轨道中的 18 个扇区中。每个扇区为 512 字节)。该程序已开发用于演示示例。但是,您可以对其进行修改和开发,以准备恢复数据。
/* 程序读取软盘的 4 个磁道 (0、1、2 和 3) 并将内容写入指定文件 */
#包括 <bios.h>
#包括 <stdio.h>
#包括<conio.h>
无效主要(无效)
{
int 头部,轨道;
int 结果,i,部门;
char 文件名[80];
字符*缓冲区;
结构diskinfo_t dinfo;
静态字符 dbuf[512];
文件*tt;
clrscr();
/// 检查驱动器是否准备就绪 \\\
如果(!(biosdisk(4,0,0,0,0,1,缓冲区)&0x02))
{
printf(" 驱动器 A:未就绪:\n 将磁盘插入驱动器 A:
并按任意键\n”);
获取();
}
/* 获取存储磁盘扇区数据的文件名 */
printf("\n输入目标文件名及其完整路径
存储数据\n\n >”);
获取(文件名);
如果((tt = fopen(文件名,“wb”))==NULL)
{
printf("无法打开文件!!!");
获取();
}
对于(轨道=0;轨道<4;轨道++)
{
对于(头部=0;头部<=1;头部++)
{
对于(扇区=1;扇区<=18;扇区++)
{
dinfo.drive = 0; /* A 的驱动器号: */
dinfo.head = head; /* 磁盘头号 */
dinfo.track = track; /* 轨道号 */
dinfo.sector = sector; /* 扇区号 */
dinfo.nsectors = 1; /* 扇区数 */
dinfo.buffer = dbuf; /* 数据缓冲区 */
/// 显示状态 \\\
gotoxy(10,10); printf("读取数据来自: Head=%d
磁道=%d 扇区=%d",
磁头、磁道、扇区)
fprintf(tt,"\n 数据读取自: 磁头=%d 磁道=%d 扇区=%d\n",
磁头、磁道、扇区)
/// 读取指定扇区 \\\
结果 = _bios_disk(_DISK_READ,&dinfo);
/// 将内容存储在指定的文件中 \\\
如果 ((结果 & 0xff00) == 0)
{
对于(i = 0;i < 512;i ++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* 在屏幕上和文件中打印读取扇区时出错的错误消息 */
别的
{
printf("\n 无法读取 Head= %d Track= %d
扇区= %d\n",磁头,磁道,扇区);
fprintf(tt,"\n 无法读取 Head= %d Track= %d
扇区=%d\n",磁头,磁道,扇区);
}
}
}
}
fclose(tt);
}
该示例显示了 biosdisk 和 _bios_disk 函数的使用。biosdisk 函数检查磁盘是否已就绪并找到地址标记。_bios_disk 函数读取两侧最多四个磁道的扇区。
磁盘表面读取(或写入)的顺序应如下:
absread 和 abswrite 函数
这些函数已在Dos.h中定义。 absread 函数读取绝对磁盘扇区,而 abswrite 函数写入绝对磁盘扇区。 absread 函数使用 DOS 中断 0x25 读取特定磁盘扇区,而 abswrite 函数使用 DOS 中断 0x26 写入特定磁盘扇区。
绝对读取或写入操作以顺序方式进行,通过逐步增加扇区,完全不受磁头和轨道号等的影响。计算机 BIOS 的工作是将绝对扇区转换为相应的轨道、磁头和扇区号。
在我们要对整个磁盘执行读/写操作的程序中,建议使用绝对读写操作,并且我们希望避免在程序中使用额外的编码和循环,以将程序速度提高到最快。
absread 和 abswrite 这两个函数都忽略了磁盘的逻辑结构,不关注文件、FAT 或目录。这些函数直接在磁盘表面执行绝对读取和绝对写入操作,这就是为什么如果使用不当,abswrite 可能会覆盖文件、目录和 FAT。
absread函数的声明如下:
int absread(int drive,int nsects,long lsect,
无效*缓冲区);
abswrite函数声明如下:
int abswrite(int drive,int nsects,long lsect,
无效*缓冲区);
其中参数含义如下:
参数。 |
它是什么/做什么 |
驾驶 |
要读取(或写入)的驱动器号:0 = A、1 = B,等等。 |
昆虫 |
要读取(或写入)的扇区数 |
部分 |
起始逻辑扇区号 |
缓冲 |
需要读取(或写入)数据的内存地址 |
成功时,两个函数都返回 0。出现任何错误时,都返回 -1,并将错误号设置为系统调用返回的 AX 寄存器的值。
读写操作的扇区数限制为 64K 或缓冲区大小,以较小者为准。不过,我们将在下一章中学习如何使用超大内存来超越 64K 的内存限制,从而开发出非常快速的程序。
|
使用 C 语言进行中断处理
C 有时被称为高级汇编语言,因为它可以使用其定义的一些函数来调用不同的中断。一些重要函数如下:
- int86:调用 MS-DOS 中断。
- int86x:使用段寄存器值调用 MS-DOS 中断。
- intdos:使用 DX 和 AL 以外的寄存器调用 MS-DOS 服务
- intdosx:使用段寄存器值调用 MS-DOS 服务。
- segread:读取段寄存器
我们将详细讨论这些函数。首先,我们讨论一些经常或必须与这些函数一起使用的预定义结构和联合。
SREGS 结构
这个结构在 dos.h 中定义,它是传递给函数 int86x、intdosx 和 segread 并由它们填充的段寄存器的结构。该结构的声明如下:
结构SREGS {
无符号整数;
无符号整数cs;
无符号整数 ss;
无符号整数 ds;
};
REGS 联盟
REGS 是两个结构的联合。联合 REGS 已在 dos.h 中定义,用于向函数 int86、int86x、intdos 和 intdosx 传递信息。联合的声明如下:
工会条例 {
结构WORDREGS x;
结构 BYTEREGS h;
};
BYTEREGS 和 WORDREGS 结构
BYTEREGES 和 WORDREGS 结构已在 dos.h 中定义,它们用于存储字节和字寄存器。WORGREGS 结构允许用户以 16 位数访问 CPU 的寄存器,而 BYTEREGES 结构允许访问单独的 8 位寄存器。
BITEREGS结构声明如下:
结构 BYTEREGS {
无符号字符 al,ah,bl,bh;
无符号字符 cl,ch,dl,dh;
};
WORDREGS结构声明如下:
结构 WORDREGS {
无符号整数 ax,bx,cx,dx;
无符号 int 是,的,cflag,标志;
};
int86 和 int86x 函数
这些函数是 dos.h 中定义的通用 8086 软件中断接口。寄存器被设置为所需的值,并调用这些函数来调用 MS-DOS 中断。int86 函数的声明如下:
int int86(int intno, union REGS * inregs,
联合 REGS *outregs);
int86x 是 int86 函数的变体。其声明如下:
int int86x(int intno, union REGS *inregs,
联合 REGS *outregs,结构 SREGS *segregs);
函数 int86 和 int86x 都执行由参数 intno 指定的 8086 软件中断,或者我们可以说要生成的中断由 intno 指定。
使用 int86x 函数只能访问 ES 和 DS,而不能访问 CS 和 SS,因此您可以调用 8086 软件中断,该中断采用与默认数据段不同的 DS 值和/或采用 ES 中的参数。
这些函数在执行软件中断之前将寄存器值从 inregs 复制到寄存器中。函数 int86x 还在执行软件中断之前将 segregs->ds 和 segregs->es 值复制到相应的寄存器中。此功能允许使用远指针或大型数据内存模型的程序指定哪个段用于软件中断。
软件中断返回后,函数将当前寄存器值复制到 outregs,将进位标志的状态复制到 outregs 中的 x.cflag 字段,将 8086 标志寄存器的值复制到 outregs 中的 x.flags 字段。函数 int86x 还恢复 DS,并将 segregs->es 和 segregs->ds 字段设置为相应段寄存器的值。
在这两个函数中,inregs 和 outregs 可以指向相同的结构,并且这两个函数在软件中断完成后都返回 AX 的值。如果设置了进位标志,通常表示发生了错误。
C 语言中使用的 REGS 联合元素(相当于汇编语言)如下表所示:
16 位 |
8 位 |
C 语言 |
汇编语言 |
C 语言 |
汇编语言 |
注册表项.x.ax |
斧头 |
韋斯特 |
艾尔 |
|
|
註冊 |
啊 |
注册表文件 |
贝克 |
韋斯特 |
基本法 |
|
|
inregs.h.bh |
波黑 |
注册表文件 |
CX |
注册表文件 |
氯 |
|
|
英格斯 |
中 |
注册表文件 |
远程控制 |
注册表文件 |
深度学习 |
|
|
注册表文件 |
DH |
注册表文件 |
和 |
|
|
注册表项.x.of |
从 |
|
|
inregs.x.cflag |
CF |
|
|
让我们看一下 int86 和 int86x 函数的示例。以下程序扫描软盘的每个扇区并在屏幕上打印每个扇区的状态。
/* 程序扫描软盘的每个扇区并打印状态 */
#include<dos.h>
#包括<conio.h>
空主()
{
int 磁头,磁道,扇区,i;
字符 *buf;
联合 REGS inregs,outregs;
结构 SREGS sregs;
clrscr();
/// 通过重置磁盘系统初始化磁盘 \\\
gotoxy(10,2); printf("正在初始化磁盘...");
对于(i = 0;i < 3;i ++)
{
inregs.h.ah=0x00; // 功能编号
inregs.h.dl=0x00; //软盘
int86(0x13,&inregs,&outregs);
}
gotoxy(10,2); printf("磁盘的状态为....\n");
/* 扫描软盘从 0 到 79 个磁道 (总共 80 个磁道) */
对于(轨道=0;轨道<=79;轨道++)
对于(头部=0;头部<=1;头部++)
对于(扇区=1;扇区<=18;扇区++)
{
inregs.h.ah = 0x04; /// 函数编号
inregs.h.al = 1; /// 扇区数
inregs.h.dl = 0x00; /// 软盘
inregs.h.ch = 轨道;
inregs.h.dh = 头部;
inregs.h.cl = 部门;
传入buf
sregs.es = FP_SEG(缓冲区);
int86x(0x13,&inregs,&outregs,&sregs);
//// 打印扫描扇区的状态 \\\\
开关(outregs.h.ah)
{
情况 0x00:
cprintf("状态: 无错误!!");
休息;
案例 0x01:
cprintf("状态: 错误命令");
休息;
案例 0x02:
cprintf("STATUS: 未找到地址标记");
休息;
案例 0x03:
cprintf(“状态: 尝试写入
写保护磁盘”);
休息;
案例 0x04:
cprintf("状态: 未找到扇区");
休息;
案例 0x05:
cprintf("STATUS: 重置失败(硬盘) ");
休息;
案例 0x06:
cprintf(“状态: 自上次以来磁盘发生变化
手术”);
休息;
案例 0x07:
cprintf("STATUS: 驱动器参数活动
失败的”) ;
休息;
案例 0x08:
cprintf("状态: 直接内存访问(DMA)
超出范围”);
休息;
案例 0x09:
cprintf(“状态: 尝试执行 DMA
64K边界”);
休息;
案例 0x0A:
cprintf("状态: 检测到坏扇区");
休息;
案例 0x0B:
cprintf("状态: 检测到坏道");
休息;
案例 0x0C:
cprintf("状态: 未找到媒体类型");
休息;
情况 0x0D:
cprintf(“状态: 扇区数无效
格式化(硬盘) ”);
休息;
情况 0x0E:
cprintf("STATUS: 控制数据地址标记
检测到(硬盘) ”);
休息;
情况 0x0F:
cprintf(“状态: DMA仲裁级别超出
范围(硬盘) ”);
休息;
案例 0x10:
cprintf("状态: 磁盘读取时 CRC/ECC 错误");
休息;
案例 0x11:
cprintf("状态: CRC/ECC 已更正数据错误");
休息;
案例 0x20:
cprintf("状态: 控制器故障");
休息;
案例 0x31:
cprintf("状态: 驱动器中没有介质 (IBM/MS INT 13H
扩展) ”);
休息;
案例 0x32:
cprintf(“状态: 存储在
CMOS(康柏) ”);
休息;
案例 0x40:
cprintf("状态: 查找操作失败");
休息;
案例 0x80:
cprintf("状态: 附件响应失败
(磁盘超时) ”);
休息;
情况 0xAA:
cprintf(“状态: 驱动器未准备好(硬盘
仅有的) ”);
休息;
情况 0xB0:
cprintf("状态: 卷未锁定在驱动器中(INT
13H扩展) ”);
休息;
案例 0xB1:
cprintf("状态: 卷已锁定在驱动器中(INT 13H 扩展) ");
休息;
案例 0xB2:
cprintf(“状态: 卷不可移动(INT 13H
扩展) ”);
休息;
案例 0xB3:
cprintf(“状态: 卷正在使用(INT 13H
扩展) ”);
休息;
案例 0xB4:
cprintf(“状态: 锁定计数超出(INT 13H
扩展) ”);
休息;
案例 0xB5:
cprintf(“STATUS: 有效弹出请求失败(INT
13H扩展) ”);
休息;
情况 0xBB:
cprintf(“STATUS: 发生未定义的错误(硬件)
磁盘专用) ”);
休息;
情况 0xCC:
cprintf("状态: 发生写入错误");
休息;
情况 0xE0:
cprintf("STATUS: 状态寄存器错误");
休息;
情况 0xFF:
cprintf("状态: 感知操作失败");
休息;
默认值:cprintf(“状态: 未知状态代码”);
}
printf("\n当前位置= 磁道:%d 磁头:%d 扇区:%d \n",
磁道、磁头、扇区);
}
gotoxy(10,24);printf("扫描完成!!按任意键即可
出口..”);
获取();
}
该程序显示了 int86 和 int86x 函数的使用示例。在此程序中,int86 函数通过重置磁盘系统来初始化磁盘,使用 INT 13H 的函数 00H。int86x 函数使用 INT 13H 的函数 04H 从两侧验证软盘(1.44Mb,3½ 软盘)的每个扇区,最多 0 到 79 个磁道(总共 80 个磁道)。
segread 函数
此函数已在 dos.h 中定义。此函数读取段寄存器。函数声明如下:
无效 segread(结构 SREGS * segp);
其中 segread 将段寄存器的当前值放入结构 *segp 中。该函数不返回任何内容,并且该调用旨在与 intdosx 和 int86x 一起使用。让我们看一个例子
#包括 <stdio.h>
#包括 <dos.h>
空主()
{
结构 SREGS 段;
segread(&segs);
printf("当前段寄存器设置\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segs.es, segs.ss);
获取();
}
该程序的输出将会像这样:
当前段寄存器设置
CS:EED DS:10BA
东南:10BA 南南:10BA
intdos 和 intdosx 函数
这些函数已在 dos.h 中定义。这些是通用 DOS 中断接口。函数 intdos 调用 MS-DOS 服务寄存器,然后调用 DX 和 AL,函数 intdosx 使用段寄存器值调用 MS-DOS 服务。
intdos函数声明如下:
int intdos(联合 REGS *inregs,联合 REGS *outregs);
intdosx 函数声明如下:
int intdosx(union REGS *inregs, union REGS *outregs,
结构 SREGS *segregs);
函数intdos和intdosx执行 DOS 中断 0x21,调用指定的 DOS 函数。inregs->h.ah 的值指定要调用的 DOS 函数。函数 intdosx在调用 DOS 函数前还会将 segregs ->ds 和 segregs ->es 的值复制到相应寄存器中,然后恢复 DS。
该函数的这一特性允许使用远指针或大型数据内存模型的程序指定将使用哪个段来执行函数。使用 intdosx 函数,您可以调用一个 DOS 函数,该函数采用与默认数据段不同的 DS 值和/或采用 ES 中的参数。
两个函数在 DOS 函数调用完成后均返回 AX 的值,如果设置了进位标志(outregs -> x.cflag != 0),则表示发生了错误。
中断 0x21 返回后,函数将当前寄存器值复制到 outregs,将进位标志的状态复制到 outregs 中的 x.cflag 字段,将 8086 标志寄存器的值复制到 outregs 中的 x.flags 字段。inregs 和 outregs 都可以指向同一个结构。让我们看看这些函数的示例。
下面给出了使用intdos 函数的示例。此程序获取有关软盘(1.44Mb,3½ 英寸软盘)磁盘驱动器的选定信息。此程序提供软盘的分配信息。
/* 获取磁盘使用的驱动器分配信息 */
#include <dos.h> /* 用于 intdos() 和 union REGS */
#include <stdio.h> /* 用于 printf() */
联合 REGS inregs,outregs;
空主()
{
inregs.h.ah = 0x36; /*获取磁盘可用空间
功能编号 */
inregs.h.dl = 0x01; /* 驱动器 A: */
intdos(&inregs,&outregs);
printf("%d 个扇区/簇,\n%d 个簇,\n%d 个字节/扇区,
\n%d 个簇”,
outregs.x.ax,outregs.x.bx,
输出寄存器.x.cx,输出寄存器.x.dx);
获取();
}
程序的输出将会是这样的:
1 个扇区/簇,
1933 年集群,
512 字节/扇区,
共 2843 个集群
现在让我们看一个函数 intdosx的例子。以下示例显示了intdosx 函数的用法。该程序将字符串输出到标准输出。
/* 将“字符串”输出到标准输出的程序。 */
#包括 <dos.h>
联合 REGS inregs,outregs;
结构 SREGS 隔离;
char far *string = "此字符串不在
默认数据段$”;
空主()
{
inregs.h.ah = 0x09; /* 功能编号 */
inregs.x.dx = FP_OFF(string);/*DS:DX 很远
字符串的地址 */
segregs.ds = FP_SEG(字符串);
intdosx(&inregs,&outregs,&segregs);
获取();
}
程序的输出如下:
这里我们使用函数 intdosx 打印给定的字符串,通过 INT 21H 的函数 09H。应始终记住,给定的字符串应始终以字符“$”结尾。
如何知道物理硬盘编号
物理硬盘驱动器号非常重要,应准确书写。非法驱动器规范可能会导致重大数据丢失。在数据恢复或磁盘故障排除编程期间,我们必须对驱动器号有信心。如何知道具有不同磁盘排列的任何磁盘的驱动器号可以通过下面给出的示例来估算。
根据最普遍的误解,物理驱动器编号是根据磁盘的附件状态提供的,但在某些特殊情况下,它可能取决于操作系统的启动过程或启动设置。
这里给出了 BIOS 提供的物理驱动器号的最通用概念,但即便如此,您仍必须借助任何磁盘编辑工具或下一章中提供的程序来确认磁盘的配置。确定之后,您才应该决定是否运行此类程序,因为如果非法使用或缺乏知识,这些程序可能会损坏或损害数据。
一般来说,如果系统中安装了两个磁盘,一个是主磁盘,一个是辅磁盘,那么将首先优先考虑主磁盘(如果可用,则优先考虑主从磁盘),然后是辅磁盘(如果可用,则优先考虑辅从磁盘,依此类推),并且将根据它们的偏好给出物理编号。
假设您的系统一次最多支持 4 个硬盘。所有 4 个硬盘可以按以下方式连接:
现在让我们考虑一些物理驱动器的驱动器号的情况。这里我假设您已使用磁盘制造商提到的正确跳线设置连接了磁盘,并且使用了正确的主从设置:
- 如果所有四个硬盘都连接到系统:如果所有四个磁盘都连接到系统,则物理驱动器编号将如下所示:
主/次(主/从) |
地位 |
物理驱动器编号和描述 |
小学老师 |
磁盘存在 |
物理驱动器号将为80H。在这种情况下,硬盘被称为第一硬盘。 |
主从 |
磁盘存在 |
物理驱动器号将为81H。在这种情况下,硬盘被称为第二硬盘。 |
中学硕士 |
磁盘存在 |
物理驱动器号将为82H。在这种情况下,硬盘被称为第三硬盘。 |
次要从属 |
磁盘存在 |
物理驱动器号将为83H。在这种情况下,硬盘被称为第四硬盘。 |
- 如果系统连接了三块硬盘:如果系统连接了三块硬盘,则物理驱动器编号将根据其连接首选项确定。以下示例代表了一些安排:
主/次(主/从) |
地位 |
物理驱动器编号和描述 |
小学老师 |
磁盘存在 |
物理驱动器号将为80H。在这种情况下,硬盘被称为第一硬盘。 |
主从 |
磁盘存在 |
物理驱动器号将为81H。在这种情况下,硬盘被称为第二硬盘。 |
中学硕士 |
磁盘存在 |
物理驱动器号将为82H。在这种情况下,硬盘被称为第三硬盘。 |
次要从属 |
磁盘不存在 |
------------------- |
主/次(主/从) |
地位 |
物理驱动器编号和描述 |
小学老师 |
磁盘不存在 |
------------------- |
主从 |
磁盘存在 |
物理驱动器号将为80H。在这种情况下,硬盘被称为第一硬盘。 |
中学硕士 |
磁盘存在 |
物理驱动器号将为81H。在这种情况下,硬盘被称为第二硬盘。 |
次要从属 |
磁盘存在 |
物理驱动器号将为82H。在这种情况下,硬盘被称为第三硬盘。 |
主/次(主/从) |
地位 |
物理驱动器编号和描述 |
小学老师 |
磁盘存在 |
物理驱动器号将为80H。在这种情况下,硬盘被称为第一硬盘。 |
主从 |
磁盘不存在 |
------------------- |
中学硕士 |
磁盘存在 |
物理驱动器号将为81H。在这种情况下,硬盘被称为第二硬盘。 |
次要从属 |
磁盘存在 |
物理驱动器号将为82H。在这种情况下,硬盘被称为第三硬盘。 |
主/次(主/从) |
地位 |
物理驱动器编号和描述 |
小学老师 |
磁盘存在 |
物理驱动器号将为80H。在这种情况下,硬盘被称为第一硬盘。 |
主从 |
磁盘存在 |
物理驱动器号将为81H。在这种情况下,硬盘被称为第二硬盘。 |
中学硕士 |
磁盘不存在 |
------------------- |
次要从属 |
磁盘存在 |
物理驱动器号将为82H。在这种情况下,硬盘被称为第三硬盘。 |
- 如果两个硬盘连接到系统:同样,如果两个硬盘连接到系统,则物理驱动器编号将根据其连接首选项确定。以下示例说明了这一点:
主/次(主/从) |
地位 |
物理驱动器编号和描述 |
小学老师 |
磁盘存在 |
物理驱动器号将为80H。在这种情况下,硬盘被称为第一硬盘。 |
主从 |
磁盘不存在 |
------------------- |
中学硕士 |
磁盘不存在 |
------------------- |
次要从属 |
磁盘存在 |
物理驱动器号将为81H。在这种情况下,硬盘被称为第二硬盘。 |
- 如果单硬盘连接到系统:不用想,如果只有一个磁盘可用,则物理驱动器号将为 80H。
中断 13H (INT 13H),ROM BIOS 磁盘驱动程序功能
此处给出了 INT 13H 函数的描述。学习这些函数时应小心谨慎,因为误用这些函数或因疏忽或缺乏知识而使用可能会导致大量数据丢失或出现许多其他问题。但是,如果以适当和正确的方式使用这些函数,则有助于最大限度地减少程序编码并使编程变得简单易行。
INT 13H (0x13)
功能 00H (0x00) 重置磁盘系统
使用AH = 00H进行调用
DL = 驱动器
00H-7FH 软盘
80H-FFH固定盘
返回:如果函数成功
进位标志 = 清除
AH = 00H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
重置磁盘控制器,重新校准其连接的驱动器。读写臂移至柱面 0 并准备进行磁盘 I/O。
在软盘读取、写入、验证或格式化请求失败后,应在重试操作之前调用此函数。如果使用固定磁盘驱动器调用此函数(即选择 DL>=80H),则软盘控制器和固定磁盘控制器将被重置。
INT 13H (0x13)
功能01H(0x01)获取磁盘系统状态
调用: AH = 01H
DL = 驱动器
00H-7FH 软盘
80H-FFH固定盘
返回: AH = 00H
AL = 前一个磁盘操作的状态
(请参阅前面给出的表格以了解错误
和状态代码描述)。
评论:
返回最近的磁盘操作的状态
INT 13H (0x13)
功能02H(0x02)读取扇区
呼叫: AH = 02H
AL = 扇区数
CH = 气缸
CL = 部门
DH=头部
DL = 驱动器
00H-7FH 软盘
80H-FFH固定盘
ES:BX = 段:缓冲区的偏移量
返回:如果函数成功
进位标志 = 清除
AH = 00H
AL = 已传输的扇区数
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数将磁盘上的一个或多个扇区读入内存。在固定磁盘上,10 位柱面号的高 2 位放置在寄存器 CL 的高 2 位中。
INT 13H (0x13)
功能03H(0x03) 写入扇区
呼叫: AH = 03H
AL = 扇区数
CH = 气缸
CL = 部门
DH=头部
DL = 驱动器
00H-7FH 软盘
80H-FFH固定盘
ES:BX = 段:缓冲区的偏移量
返回:如果函数成功
进位标志 = 清除
AH = 00H
AL = 传输的扇区数
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数将一个或多个扇区从内存写入磁盘。在固定磁盘上,10 位柱面号的高 2 位放置在寄存器 CL 的高 2 位中。
INT 13H (0x13)
功能 04H (0x04) >> 验证扇区
调用: AH = 04H
AL = 扇区数
CH = 气缸
CL = 部门
DH = 驱动
00H-7FH 软盘
80H-FFH固定驱动器
ES:BX = 段:缓冲区的偏移量
返回:如果函数成功
进位标志 = 清除
AH = 00H
AL = 已验证的扇区数量
如果功能失败
进位标志 = 设置
AH = 状态
注释:
该函数验证一个或多个扇区的地址字段。此操作不会将数据传输到内存或从内存传输数据。在固定磁盘上,10 位磁柱号的高 2 位被替换在寄存器 CL 的高 2 位中。
此功能可用于测试软盘驱动器中是否有可读介质。请求程序应重置软盘系统(INT 13H 功能 00H)并重试该操作三次,然后才认为不存在可读软盘。在大多数软盘初始化操作中都建议这样做。
INT 13H (0x13)
功能 05H (0x05) >> 格式化轨道
呼叫: AH = 05H
AL = 交错(PC/XT 固定磁盘)
CH = 气缸
DH=头部
DL = 驱动器
00H-7FH 软盘
80H-FFH固定盘
ES:BX = 段:地址字段列表的偏移量
(PC/XT固定磁盘除外)
返回:如果函数成功
进位标志 = 清除
AH = 00H
如果功能失败
进位标志 = 设置
AH = 状态(参见给出的状态表
更早)
注释:
初始化磁盘扇区和指定磁道上的磁道地址字段。在软盘上,地址字段列表由一系列 4 字节条目组成,每个扇区一个条目。格式如下表所示。
在固定磁盘上,10 位柱面号的高 2 位放置在寄存器 CL 的高 2 位中。
字节 |
内容 |
0 |
圆柱 |
1 |
头 |
2 |
部门 |
3
|
扇区大小代码
价值 |
描述 |
00小时 |
每扇区 128 字节 |
01小时 |
每扇区 256 字节 |
02小时 |
每扇区 512 字节 |
03小时 |
每扇区 1024 字节 |
|
INT 13H (0x13)
功能06H(0x06)>>格式化坏道
呼叫: AH = 06H
AL = 交错
CH = 气缸
DH=头部
DL = 驱动器
80H-FFH固定盘
返回:如果函数成功
进位标志 = 清除
AH = 00H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数仅针对 PC/XT 固定磁盘驱动器定义。它初始化磁道、写入磁盘地址字段和数据扇区并设置坏扇区标志。
INT 13H (0x13)
功能 07H (0x07) >> 格式化驱动器
呼叫: AH = 07H
AL = 交错
CH = 气缸
DL = 驱动器
80H-FFH固定盘
返回:如果函数成功
进位标志 = 清除
AH = 00H
如果功能失败
进位标志 = 设置
AH = 状态(参见给出的状态表
更早)
注释:
该函数仅针对 PC/XT 固定磁盘驱动器定义。它格式化整个驱动器,从指定磁柱开始写入磁盘地址字段和数据扇区。
INT 13H (0x13)
功能 08H (0x08) >> 获取驱动器参数
呼叫: AH = 08H
DL = 驱动器
00H-7FH 软盘
80H-FFH固定盘
返回:如果函数成功
进位标志 = 清除
BL = 驱动器类型(PC/AT 和 PS/2 软盘
磁盘)
价值 |
描述 |
01小时 |
360KB,40轨,5.25英寸 |
02小时 |
1.2MB,80 磁道,5.25 英寸 |
03小时 |
720KB,80磁道,3.5英寸 |
04 小时 |
1.44MB,80磁道,3.5英寸 |
CH = 最大气缸的低 8 位
数字
CL = 位 6-7 高 2 位最大值
柱面编号 最大位 0-5
扇区号
DH = 最大头数
DL = 驱动器数量
ES:DI = 段:磁盘驱动器的偏移量
参数表
如果功能失败
进位标志 = 设置
AH = 状态
注释:
此函数返回指定驱动器的各种参数。寄存器 DL 中返回的值反映了连接到所请求驱动器的适配器的物理驱动器的真实数量。
INT 13H (0x13)
功能09H(0x09)>>初始化固定磁盘特性
呼叫: AH = 09H
DL = 驱动器
80H-FFH固定盘
关于 INT 41H 的 PC/XT 向量
必须指向磁盘参数块,或者在 PC/AT 和 PS/2 上
INT 41H 的向量必须指向磁盘
驱动器 0 的参数块
INT 46H 的向量必须指向磁盘
驱动器 1 的参数块
返回:如果函数成功
进位标志 = 清除
AH = 00H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数使用 ROM BIOS 磁盘参数块中的值初始化固定磁盘控制器以进行后续 I/O 操作。此功能仅在固定磁盘上受支持。PC 和 PC/XT 固定磁盘的参数块格式如下:
变更 |
内容 |
00H-01H |
最大汽缸数 |
02小时 |
最大磁头数 |
03时至04时 |
启动减少写入电流的磁柱 |
05时至06时 |
启动写预补偿缸 |
07H |
最大 ECC 突发长度 |
08小时
|
驱动选项
位 |
重要性(如果设置) |
0 – 2 |
驱动选项 |
3 – 5 |
保留 (0) |
6 |
禁用 ECC 条目 |
7 |
禁用磁盘访问重试 |
|
09H |
标准超时值 |
0AH |
格式化驱动器的超时值 |
0BH |
检查驱动器的超时值 |
0CH-0FH |
预订的 |
PC/AT和PS/2固定磁盘的参数块格式如下:
变更 |
内容 |
00H_01H |
最大气缸数 |
02小时 |
最大磁头数 |
03时至04时 |
预订的 |
05时至06时 |
启动写预补偿缸 |
07H |
最大 ECC 突发长度 |
08小时 |
驱动器选项
位 |
重要性(如果设置) |
0 – 2 |
未使用 |
3 |
8头以上 |
4 |
未使用 |
5 |
制造商缺陷图出现在
最大气缸 +1 |
6 – 8 |
如果禁用重试,则为非零(10、01 或 11) |
|
09H-0BH |
预订的 |
0CH-0DH |
着陆区气缸 |
0EH |
每磁道扇区数 |
0FH |
预订的 |
INT 13H (0x13)
函数 0A H(0x0A 或 10)>> 读取扇区长度
调用: AH = 0AH
AL = 扇区数
CH = 气缸
CL = 部门
DH=头部
DL = 驱动器
80H-FFH固定盘
ES:BX = 段:缓冲区的偏移量
返回:如果函数成功
进位标志 = 清除
AH = 00H
AL = 已传输的扇区数
如果功能失败
进位标志 = 设置
AH = 状态
注释:
此功能将磁盘中的一个或多个扇区连同每个扇区的 4 字节错误纠正码 (ECC) 一起读入内存。与常规读取扇区功能 (INT 13H (0x13) 功能 02H) 不同,ECC 错误不会自动纠正。任何扇区出现读取错误后,多扇区传输将终止。
该功能仅支持固定磁盘。10 位磁柱号的高 2 位放置在寄存器 CL 的高 2 位中。
INT 13H (0x13)
函数 0BH(0x0B 或 11)>> 写入扇区长度
呼叫: AH = 0BH
AL = 扇区数
CH = 气缸
CL = 部门
DH=头部
DL = 驱动器
80H-FFH固定盘
ES:BX = 段:缓冲区的偏移量
返回:如果函数成功
进位标志 = 清除
AH = 00H
AL = 已传输的扇区数
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数将内存中的一个或多个扇区写入磁盘。每个扇区的数据后面必须跟有 4 字节 ECC 代码。10 位磁柱号的高 2 位放置在寄存器 CL 的高 2 位中。此功能仅在固定磁盘上受支持。
INT 13H (0x13)
函数 0CH(0x0C 或 12)>> 搜索
呼叫: AH = 0CH
CH = 气缸的低 8 位
CL = 位 6-7 中的圆柱体高 2 位
DH=头部
DL = 驱动器
80H-FFH固定盘
返回:如果函数成功
进位标志 = 清除
AH = 00H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数将磁盘读写头定位到指定柱面而不传输任何数据。柱面号的高 2 位放置在寄存器 CL 的高 2 位中。此功能仅在固定磁盘上受支持。
INT 13H (0x13)
功能 0DH (0x0D 或 13) >> 重置固定磁盘系统
呼叫: AH = 0DH
DL = 驱动器
80H-FFH固定盘
返回:如果函数成功
进位标志 = 清除
AH = 00H
如果功能失败
进位标志 = 设置
AH = 状态(参见 INT 13H 功能 01H)
评论:
此功能重置固定磁盘控制器,重新校准连接的驱动器,将读/写臂移动到柱面 0,并为后续磁盘 I/O 做准备。
INT 13H (0x13)
功能 0EH(0x0E 或 14)>> 读取扇区缓冲区
调用: AH = 0EH
ES:BX = 段:缓冲区的偏移量
返回:如果函数成功
进位标志 = 清除
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数将固定磁盘适配器的内部扇区缓冲区的内容传输到系统内存。不从物理磁盘驱动器读取任何数据。
INT 13H (0x13)
函数 0FH(0x0F 或 15)>> 写入扇区缓冲区
调用: AH = 0FH
ES:BX = 段:缓冲区的偏移量
返回:如果函数成功
进位标志 = 清除
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数将数据从系统内存传输到固定适配器的内部扇区缓冲区。没有数据写入物理磁盘驱动器。在使用 INT 13H 函数 05H 格式化驱动器之前,应调用此函数来初始化扇区缓冲区的内容。
INT 13H (0x13)
功能 10H(0x10 或 16)>> 获取驱动器状态
跟注: AH = 10H
DL = 驱动器
80H-FFH固定盘
返回:如果函数成功
进位标志 = 清除
AH = 00H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数测试指定的固定磁盘驱动器是否可运行并返回驱动器的状态。此功能仅支持固定磁盘。
INT 13H (0x13)
功能 11H(0x11 或 17)>> 重新校准驱动器
呼叫: AH =11H
DL = 驱动器
80H-FFH固定盘
返回:如果函数成功
进位标志 = 清除
AH = 00H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数使固定磁盘适配器针对指定驱动器重新校准自身,将读/写臂定位到磁柱 0,并返回驱动器的状态。此函数仅在固定磁盘上受支持。
INT 13H (0x13)
功能 12H(0x12 或 18)>> 控制器 RAM 诊断
呼叫: AH = 12H
返回:如果函数成功
进位标志 = 清除
如果功能失败
进位标志 = 设置
AH = 状态
评论:
该函数使固定磁盘适配器对其内部扇区缓冲区执行内置诊断测试,通过返回的状态指示测试是否通过。
INT 13H (0x13)
功能 13H(0x13 或 19)>> 控制器驱动器诊断
调用: AH = 13H
返回:如果函数成功
进位标志 = 清除
如果功能失败
进位标志 = 设置
AH = 状态
评论:
该函数使固定适配器运行所连接驱动器的内部诊断测试,通过返回的状态指示测试是否通过。
INT 13H (0x13)
功能 14H(0x14 或 20)>> 控制器内部诊断
呼叫: AH = 14H
返回:如果函数成功
进位标志 = 清除
AH = 00H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
该函数使固定磁盘适配器执行内置诊断自检,通过返回的状态指示测试是否通过。
INT 13H (0x13)
功能 15H(0x15 或 21)>> 获取磁盘类型
呼叫: AH = 15H
DL = 驱动器
00H-7FH 软盘
80H-FFH固定盘
返回:如果函数成功
进位标志 = 清除
AH = 驱动器类型代码
如果没有驱动器,则为 00H
;如果有软盘驱动器不支持换线,则为
01H;如果有软盘驱动器支持换线,则为 02H;
如果有固定磁盘,则为 03H
|
并且,如果是固定磁盘(AH =03H)
CX:DX = 512 字节扇区数
如果功能失败
进位标志 = 设置
AH = 状态
注释:
此函数返回一个代码,表示指定驱动器代码引用的软盘或固定磁盘的类型。
INT 13H (0x13)
功能 16H(0x16 或 22)>> 获取磁盘变化状态
呼叫: AH = 16H
DL = 驱动器
00H-7FH 软盘
返回:如果更改行处于非活动状态并且磁盘尚未更改
进位标志 = 清除
AH = 00H
如果更改线路活动且磁盘可能已更改
进位标志 = 设置
AH = 06H
评论:
此函数返回更改线的状态,指示驱动器中的磁盘自上次磁盘访问以来是否可能已被更换。如果此函数返回时设置了进位标志,则磁盘不一定已被更换,只需解锁和锁定磁盘驱动器门即可激活更改线,而无需取出软盘。
INT 13H (0x13)
功能 17H(0x17 或 23)>> 设置磁盘类型
呼叫: AH = 17H
AL = 软盘类型代码
价值 |
描述 |
00小时 |
未使用 |
01小时 |
360 KB 驱动器中的 320/360 KB 软盘 |
02小时 |
1.2 MB 驱动器中的 320/360 KB 软盘 |
03小时 |
1.2 MB 驱动器中的 1.2 MB 软盘 |
04 小时 |
720 KB 驱动器中的 720 KB 软盘 |
SL = 驱动
00H-7FH 软盘
返回:如果函数成功
进位标志 = 清除
啊= 00X
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此功能为指定的驱动器选择软盘类型。
内部 13H (0x13)
功能 18H(0x18 或 24)>> 设置格式的媒体类型
呼叫时间: AH = 18H
CH = 气缸数
CL = 每磁道扇区数
DL = 驱动器
00H-7FH 软盘
返回:如果函数成功
进位标志 = 清除
啊= 00X
ES : DI = 段 : 磁盘偏移量
媒体类型参数表
如果功能失败
进位标志 = 设置
AH = 状态
注释:
该函数选择指定驱动器的媒体特性,因此该驱动器必须有软盘。
内部 13H (0x13)
函数 19H (0x19 或 25) >> Park heads
呼叫自: AH = 19H
DL = 驱动器
80H-FFH固定盘
返回:如果函数成功
进位标志 = 清除
啊= 00X
如果功能失败
进位标志 = 设置
AH = 状态
注释:
该功能将读/写杆移至不用于数据存储的轨道,以便在驱动器关闭时数据不会损坏。
内部 13H (0x13)
函数 1AH (0x1A 或 26) >> 格式化 ESDI 磁盘
跟注: AH = 1AH
AL = 相对块地址 (RBA)
表中缺陷数量
如果没有 RBA 表,则为 0
如果使用 RBA 表,则 >0
CL = 格式修改位
页数 |
重要性(如果设置) |
0 |
忽略主要缺陷图 |
1 |
忽略二次缺陷图 |
2 |
更新二次缺陷图 |
3 |
执行高级表面分析 |
4 |
产生周期性中断 |
5-7 |
保留(必须为 0) |
DL = 驱动器
80H-FFH固定盘
ES:BX = 段:RBA 表偏移量
返回:如果函数成功
进位标志 = 清除
啊= 00X
如果功能失败
进位标志 = 设置
AH = 状态(参见 INT 13H 功能 01H)
注释:
该函数初始化连接到 ESDI 硬盘适配器的磁盘上的磁盘扇区和跟踪地址字段。
此功能的操作称为低级格式化,为磁盘在扇区级别进行物理读/写操作做好准备。随后必须使用 FDISK 命令对磁盘进行分区,然后使用 FORMAT 命令进行高级格式化以安装文件系统。