读取软盘逻辑扇区的汇编过程

该过程以int 13H 02H子功能为基础,与int 13H采用相同的基于1的扇区地址,完成读取若干逻辑扇区的功能。过程没有对输入参数做任何检测,请读者自行保证输入参数的正确性。参数的合法范围:AX>0且AX<=2880,CL>0且CL<=16。CL的限制也是int 13读取软盘时的限制。ES:BX没有限制。改过程通过了初步的测试,如果有任何错误希望您留下错误信息,以使该过程尽善尽美!

;*********************************************************************
;    软磁盘逻辑扇区编址方式:
;0头0道1扇区~18扇区:对应逻辑扇区号1~18
;1头0道1扇区~18扇区:对应逻辑扇区号19~36
;0头1道1扇区~18扇区:对应逻辑扇区号37~54
;1头1道1扇区~18扇区:对应逻辑扇区号55~72

;    BIOS中断 int 13H  02H的调用规范
;子中断号 ah=02h 读磁盘  al=要读取的扇区数
;  ch=磁道号  cl=起始扇区号
;  dh=磁头号  es:bx 缓冲区地址
;*********************************************************************

;---------------------------------------------------------------------   
;函数名:
ReadSector PROC NEAR
;入口参数
;ax=逻辑扇区号  cl=要读取的扇区个数 es:bx 缓冲区地址
;---------------------------------------------------------------------
LOCAL TWO_MEM_OFFSET:WORD,SECTOR_NUM_1:BYTE,SECTOR_NUM_2:BYTE,TO_READ_SECTOR_NUM:BYTE,A_X:WORD,B_X:WORD
  ;跨越盘面部分的内存偏移,在当前磁道内要读取的扇区数,跨越磁道的扇区数,要读取的扇区数

 MOV  TO_READ_SECTOR_NUM,CL;保存要读取的扇区数   
 MOV  A_X,AX ;保存要读取的逻辑扇区号
 MOV  B_X,BX ;保存内存缓冲区偏移地址
 MOV  BL,18D ;每道扇区数
 DIV  BL  ;AH=余数,AL=商(没有用到)
 MOV  BH,BL
 SUB  BH,AH ;当前磁道内的可读扇区数
 MOV  SECTOR_NUM_1,BH
 SUB  BH,CL ;当前剩余扇区是否大于等于要求读的扇区数
 JL  USED_TWO_DISK ;不够读,跨越了磁道
 
ONLY_USED_ONE_DISK: ;要读取的数据没有跨越磁道

 MOV  AX,A_X
 MOV  CL,TO_READ_SECTOR_NUM
 MOV  BX,B_X
 
 CALL ReadSectorCore
 RET  
 
USED_TWO_DISK:  ;要读取的若干扇区分布在两个磁道

 SUB  CL,SECTOR_NUM_1
 MOV  SECTOR_NUM_2,CL
 MOV  AX,512D
 MUL  SECTOR_NUM_2
 MOV  BX,B_X
 ADD  BX,AX
 MOV  TWO_MEM_OFFSET,BX
 
 ;读取当前磁道中的扇区
 
 MOV  AX,A_X
 MOV  CL,SECTOR_NUM_1
 MOV  BX,B_X
 CALL ReadSectorCore 
 
 ;读取下一磁道中剩余的扇区
 
 MOV  AX,A_X
 MOV  CL,SECTOR_NUM_2
 MOVZX CX,CL
 ADD  AX,CX
 MOV  BX,TWO_MEM_OFFSET
 CALL ReadSectorCore
 
 RET
ReadSector ENDP   

;---------------------------------------------------------------------   
;函数名:
ReadSectorCore PROC NEAR
;入口参数
;ax=逻辑扇区号  cl=要读取的扇区个数 es:bx 缓冲区地址
;---------------------------------------------------------------------
 push          bp
 mov  bp,sp
 sub  sp,2
 mov          [bp-2],cl  ;保存要读取的扇区数  
 push          bx 
 dec  ax  ;调整逻辑扇区号,使其基于0
 push          ax
 mov               bl,36
 div  bl  ;商为磁道号
 mov  ch,al  ;填写磁道号
 pop  ax
 mov  bl,18
 div  bl
 and  al,0F1H   ;偶数就是0磁头,奇数就是1磁头  
 mov  dh,al   ;商为磁头号
 inc  ah                         ;调整逻辑扇区号,使其基于1,
                                                       ;/int 13从1开始编址扇区
 mov  cl,ah   ;余数为起始扇区号
 mov  al,[bp-2]           ;填充要读取的扇区数
 mov  ah,02h   ;读扇区
 mov  dl,00h   ;目标存储介质:软磁盘
 pop  bx
 int  13h
 add  sp,2
 pop  bp
 ret
ReadSectorCore ENDP

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值