软盘,INT 13H和IMG文件

来源:互联网 发布:分层图算法 编辑:程序博客网 时间:2024/05/17 22:22
软盘,INT 13H和IMG文件
1:软盘
 软盘是以扇区为基本单位来进行操作的,每扇区512字节,共2880个扇区,空间大小为1.44M.
 这2880个扇区又可以用(磁头、磁道、扇区)这三个参数来描述。我们简单记(磁头、磁道、扇区)为(x,y,z),那么
  X的取值范围是:0—1
  Y的取值范围是:0--79
  Z的取值范围是:1—18
也就是说软盘有2磁头、每磁头有80磁道、每磁道有18扇区,共2880个扇区(2880=2*80*18)。
如果把2880个扇区从0开始编号,一直到2879结束,那么
编号为i的扇区和(X,Y,Z)的换算公式为:i=80*18*x+18*y+z-1

2:INT 13H
  INT13H是磁盘的BOIS中断,对于读写扇区操作,中断的完整调用参数如下:
  AL=扇区数    
  AH=中断子功能号     ;2=读扇区,3=写扇区
  CL的6,7位,CH = 磁道号  ;每磁头最多可以有2^10=1024个磁道
  CL的低6位   =  扇区号  ;每磁道最多可以有2^6=64个扇区
  DH = 磁头号     ;最多可以有256个磁头
  DL = 驱动器号     ;0=软盘,80H=硬盘
  ES:BX=数据缓冲区的地址
其他:
1).
  对于软盘来说,实际的INT 13H中DL=0,而CL,CH,DH的取值范围也不可能取到上面的数值,根据1:中的数据,有
CL的取值范围是:1--18
CH的取值范围是:0-79
DH 的取值范围是:0—1
如果软盘的CL,CH,DH取值超过了范围,中断调用出错。
AL的取值也不是任意的,一次调用INT13H进行读写扇区的只可以在一个磁道内的扇区进行。如果超出了一个磁道,必须要更新INT13H的中寄存器,重复调用INT13H。
对于软盘来说 AL必须要小于19-CL。
下面是一个从软盘的(x,y,z)扇区中连续读出n个扇区的内容到缓冲区BUFFER中的代码片段( 代码使用了一些80386的指令和MASM6.0才支持的伪指令):
 MOV  AX,DS
 MOV  ES,AX
MOV  BX,OFFSET
MOV   BP,  n 

MOV CL,z
MOV CH,y
MOV DL,0 
MOV DH,x
.WHILE  BP  ;bp记录的是还没有进行读操作的扇区数量
;WHILE伪指令,和高级语言的WHILE一样理解就可以了,下面的。IF也一样
 ;对AL的取值进行计算
 MOV AL,19
    SUB AL,CL ;最多可以读19-CL个扇区
    XOR AH,AH
 .IF AX>BP  
      MOV AX,BP
   XOR BP,BP 
    .ELSE  
  SUB BP,AX ;更新BP
       .ENDIF    

  MOV AH,2
INT 13H   ;读扇区

 ;更新CL,CH,DH
MOV CL,1  
.IF  CH==79 
   INC DH
   XOR CH,CH
  .ELSE
      INC CH
  .ENDIF
  XOR AH,AH
  SHL AL,9 ;AX=AL*512,等于已经处理的字节数
     ;SHL AL,9和SHL AX,4都是80386+才支持的指令
        SHR AX,4   ;AX=AX/16
  ADD ES,AX  ;更新ES:BX,这里是更新了ES,也可以更新BX。
 .endw

2).
  INT13H只理论上最多处理 2^24个扇区*512字节/扇区=8G的磁盘空间,这对现在的硬盘来说,是远远不够的,于是后来对INT13H进行了扩展,用AH=42H、AH=43H分别对大硬盘进行操作,这里就不详细讨论了。

3:IMG文件
 IMG文件是软盘的镜像文件,文件大小也是1.44M,它和软盘是一种线性的对应关系。
软盘上一个编号为(x,y,z)的512字节的扇区,对应IMG文件中的以2400H*x+4800H*y+(z-1)*512为基址的512个字节(注意,2400H,4800H是16进制数)。
IMG文件的字节和软盘的扇区对应关系也可以如下图所示(注意那些是十进制,那些是16进制)。



对于扩展INT 13中断,参数如下:
中断号 功能                       调用寄存器 返回寄存器       备注
INT 13
AH=41H 检测扩展中断功能是否安装 AH = 41h
                                                                BX=55AAh
                                                                DL = 驱动器号(80h到FFH)
                                                                                 失败:AH=1
                                                                                                         CF置位
                                                                成功:AH=版本号
                                                                      CF=0 BX=AA55H 
INT 13
AH=42H 磁盘扩展读操作              AH = 42H
                                                                    DL = 驱动器号
                                             DS:SI=指向LBA地址包的指针 失败:AH=错误号
                                                                                 CF置位
                                                                           成功:AH=0
                                                                                                                         CF=0
                                                                                                              地址包定义:
                                                                偏移 大小 描述
                                                                00H 字节 地址包大小
                                                                01H 字节 保留(为0)
                                                                02H 字     传输包个数
                                                                04H 双字 指向数据指针
                                                                08H 4字     起始地址
                                                                其中LBA=((柱面*磁头/柱面+磁头)*扇区/柱面)+扇区-1
INT 13
AH=43H 磁盘扩展写操作               AH=43H
                                                                     AL=写标志
                                              DL = 驱动器号
                                              DS:SI=指向LBA地址包的指针 失败:AH=错误号
                                                                                 CF置位
                                                                           成功:AH=0
                                                                                                                         CF =0 同上
INT 13
AH=48H 获取磁盘参数 AH=48H
                                     DL=驱动器号
                                      DS:SI=指向保存参数缓冲区的指针

                                       失败:AH=错误号
                                                   CF置位
                                       成功:AH=0
                                                   CF=0
 参数缓冲区定义:
                                                                偏移 大小 描述
                                                                00H 字 缓冲区大小
                                                                02H 字 信息标志位
                                                                04H 双字 物理柱面数
                                                                08H 双字 物理磁头数
                                                                0CH 双字 物理每柱扇区数
                                                                10H 4字 扇区总数
                                                                18H 字 每扇区字节数

原创粉丝点击