;假设从dx号逻辑扇区号开始读取,读ah个扇区到es:bx
d1 equ 0x09000h; 目的段地址
d2 equ 0x0100h;目的偏移
b1 db 0;存起始扇区号;
b2 db 0;存起始磁道号;
b3 db 0;存磁头号;
mov dx,9;要读取的逻辑扇区号;
mov bh,3;bh=要读取的扇区数
call dushanqu;
;读取扇区子过程dushanqu,
;功能:从dx号逻辑扇区号开始读取,读ah个扇区到es:bx
dushanqu:
;取得起始扇区号
mov dx,9;
mov ax,dx;
div 18;
inc ah;
mov [b1],ah;
;取得磁道号
mov ax,dx;
div 18;
mov ah,0;
div 2;
mov [b2],al;
;取磁头号
mov ax,dx;
div 18;
mov al,0;
div 2;
mov [b3],ah;
;调用BIOS 13号中断读取3个扇区到es:bx扇区
mov ah,02;
mov al,bh;读取3个扇区,bh=扇区数
mov cl,[b1];
mov ch,[b2];
mov dh,[b3];
mov dl,00h;
mov es,d1;
mov bx,d2;
int 13h;
jc dushanqu;如果读取错误,CF被置1,就循环读取,直到正确取,正确读取CF被置0,CF=0跳出循环
以下是学习时的笔记;
BIOS 13H中断功能
00H 磁盘复位
mov ah,00h ;入口参数 ah=00h
mov dl,00h;驱动器号,软盘00h--7fh,硬盘80h--0ffh
int 13h;调用13号中断,结果CF=0 操作成功,AH=00H,否则AH=状态代码
状态代码:
00H 无错,正常
01H 非法命令
02H 地址目标未发现
03H 磁盘写保护(软盘)
04H 扇区未发现
05H 复位失败(硬盘)
06H 软盘取出
07H 错误的参数表 硬盘
08H DMA越界软盘
09H DMA超过64KB界限
0AH 错误的扇区标志 硬盘
0BH 错误的磁道标志 硬盘
0CH 介质类型未发现 软盘
0DH 格式化时非法扇区好 硬盘
0EH 控制数据地址目标被发现 硬盘
0FH DMA仲裁越界 硬盘
10H 不正确的CRC或ECC编码
11H ECC校正数据错 硬盘
20H 控制器失败
40H 查找失败
80H 磁盘超时,未响应
AAH 驱动器未准备好,硬盘
BBH 未定义的错误 硬盘
CCH 写错误 硬盘
E0H 状态寄存器错误 硬盘
FFH 检测操作失败 硬盘
01H读取磁盘系统状态
mov ah,01;入口参赛AH=01H
mov dl,00h;DL=驱动器号,软盘00h--7fh,硬盘80h--0ffh
int 13h ;出口参数,功能AH=00H,失败,AL=状态代码,见上
02H 读扇区
mov ah,02;入口参数 AH=0H
mov al,扇区数;要读取的扇区数
mov cl,扇区号;起始扇区号
mov ch,磁道号;起始磁道号
mov dh,磁头号;起始磁头号
mov dl,驱动器号;
mov es,缓冲区段地址;
mov bx,缓冲区偏移;
int 13h;出口CF=0,成功AH=00H,AL=传输的扇区数,否则AH=状态代码,见上
FAT12 容量计算方法
软盘有2个柱面,每个柱面有80条磁道,每条磁道有18个扇区,每个扇区有512个字节
容量=柱面数*磁道数/柱面*扇区数/每磁道*字节数/每扇区
容量=2*80*18*512=1.44MB
线性扇区号转换为CHS格式公式:
扇区号=线性扇区号/每磁道扇区数的余数+1
mov ax,线性扇区号;
div 18;每磁道扇区数18,此命令时用AX的值整除以18,结果存入al,余数存入ah;
inc ah;结果+1,存入ah,即ah=扇区号 此命令是把ah的值加1
mov cl,ah;把扇区号存入cl,以便13H中断使用
磁道号=线性扇区号/每磁道扇区数/磁头数
mov ax,线性扇区号;
div 18;每磁道扇区数18,用AX的值除以18,结果存入al
mov ah,0;把AX的高位置0,是AX的值和AL的值一样
div 2;此时AX的值是线性扇区号除以每磁道扇区数的值,这个值再除以磁头数2 结果存入al,al的值就是磁道号
mov ch,al;把磁道号存入ch,以便BIOS 13H中断使用
磁头号=(线性扇区号/每磁道扇区数)/磁头数的余数
mov ax,线性扇区号;
div 18;每次道扇区数,结果存入al
mov al,0;
div 2;磁头数2,余数存入ah,ah即磁头号;
mov dh,ah;把磁头号存入dh 方便BIOS 13H调用