分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

软盘结构(磁头号和起始扇区的计算方法)

刺猬@http://blog.csdn.net/littlehedgehog

;----------------------------------------------------------------------------
;函数名: ReadSector
;----------------------------------------------------------------------------
;作用:
;从第 ax 个 Sector 开始, 将 cl 个 Sector 读入 es:bx 中
ReadSector:
    ;-----------------------------------------------------------------------
;怎样由扇区号求扇区在磁盘中的位置 (扇区号 -> 柱面号, 起始扇区, 磁头号)
;-----------------------------------------------------------------------
;设扇区号为 x
;┌ 柱面号 = y >> 1
;x           ┌ 商 y ┤
;-------------- => ┤      └ 磁头号 = y & 1
;每磁道扇区数     │
;└ 余 z => 起始扇区号 = z + 1
push    bp
    mov    bp,sp
    sub    esp,2;辟出两个字节的堆栈区域保存要读的扇区数: byte [bp-2]

    mov    byte [bp-2],cl
    push    bx            ;保存 bx
mov    bl,[BPB_SecPerTrk];bl: 除数
div    bl            ;y 在 al 中, z 在 ah 中
inc    ah            ;z ++
mov    cl,ah            ;cl <- 起始扇区号
mov    dh,al            ;dh <- y
shr    al,1;y >> 1 (其实是 y/BPB_NumHeads, 这里BPB_NumHeads=2)
mov    ch,al            ;ch <- 柱面号
and    dh,1;dh & 1 = 磁头号
pop    bx            ;恢复 bx
;至此, "柱面号, 起始扇区, 磁头号" 全部得到 ^^^^^^^^^^^^^^^^^^^^^^^^
mov    dl,[BS_DrvNum];驱动器号 (0 表示 A 盘)
.GoOnReading:
    mov    ah,2;读
mov    al,byte [bp-2];读 al 个扇区
int    13h
    jc    .GoOnReading        ;如果读取错误 CF 会被置为 1, 这时就不停地读, 直到正确为止

    add    esp,2
    pop    bp

    ret

于渊 关于软盘结构的这段笔墨惜得不是地方 ,其实很多看这种入门级书的读者对于软盘(磁盘)的结构认识大多都是不到位的。我在阅读这段代码时也费了不少周折,最后发现其实是我对软盘结构认识不足,补上这一课,这段代码就好读多了。

3.5寸1.44M软盘结构

1、 结构:2面、80道/面、18扇区/道、512字节/扇区
         扇区总数=2面 X  80道/面 X  18扇区/道  =  2880扇区
         存储容量= 512字节/扇区X  2880扇区 =  1440 KB

2、  2  面: 编号0----1;
          80道: 编号0----79 ;
         18扇区:编号1----18 ;

这个很多书都有介绍,恕不细表。下面来看看软盘中磁道的安排,这会使我们感到很诧异——原来软盘结构安排会是这样。

3、相对扇区号:共2880个扇区,相对扇区号范围为 0----2879

编号顺序:
扇区物理号               相对扇区号
0面,0道,1扇区             0
0面,0道,2扇区             1
0面,0道,3扇区             2
…………………….
0面,0道,18扇区           17
1面,0道,1扇区            18
……………
1面,0道,18扇区           35
0面,1道,1扇区            36
0面,1道,18扇区           53
1面,1道,1扇区            54
………

注意下红色字,它表明软盘的排列并不是按照我们所想象的"把0面先排完了再开始排1面,而是交替排列的"

4、物理扇区号(A,B,C)与相对扇区号(S)相互转换公式:
头/面(0--1)      道(0-79)       扇区 (1--18) 
 A                       B                      C

例如:A=1面          B= 15道       C=7扇区  这就是它的物理扇区号,现在进入关键问题——如何计算相对扇区呢?

计算相对扇区时,参照上面的软盘结构排列表。我们应该清楚在15道之前,即0~14道里面,每道都有有18个扇区,而又0、1两面都有磁道,故而在0~14道有(0道----14道)*2面*18, 在计算第15道时,注意下我们要计算的15道是在1面,而1面之前的0面15道,有18个扇区,而在1面的15道磁道中,有7个扇区。一共有0面的第15道18个扇区+1面第15道7个扇区-1,所以上述例子中的相对扇区号是(0道----14道)*2面*18+0面的第15道18个扇区+1面第15道7个扇区-1

有了上面的叙述,源代码中除以18求出来商就是磁道数,而余数即是扇区数目,由于除以了18,那么前面的结构表就可以如下表示:

0面,0道
1面,0道
0面,1道
1面,1道
0面,2道
1面,2道
.......
0面,12道
1面,12道

磁道除以2表示当前物理磁道号(因为是交替排列的!注意看上表的结构),而余数就可以表示磁头号。

于渊代码中间很多都是直接在寄存器中反复玩弄汇编技巧,这段程序让我看得相当郁闷~  自己改写了一个,里面用内存保留计算结果,这样清晰很多:

以下是变量定义:

dbTrackNum  db 0 ;磁道数
dbSectorNum  db 0 ;扇区数
dbdriverNum  db 0 ;驱动器号
dbResistiveNum  db 0 ;磁头数

ReadSector:
    push    dx
    push    bx
    

    mov    bl,[BPB_SecPerTrk]
    div    bl
    inc    ah
    mov    byte[dbSectorNum],ah
    mov    ah,al
    shr    al,1
    mov    byte[dbTrackNum],al
    and    ah,1b
    mov    byte[dbResistiveNum],ah
    
    mov    ah,2h
    mov    al,cl
    mov    dl,[dbdriverNum]
    mov    dh,[dbResistiveNum]
    mov    ch,[dbTrackNum]
    mov    cl,[dbSectorNum]

    pop    bx

.Reading:
    int13h
jc    .Reading

    pop    dx
    ret

不好意思,没写注释,不过有了上面的解释,我想这段代码应该是很好懂得~~

自己动手写操作系统》读书笔记系列

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

软盘结构 磁头号和起始扇区的计算方法相关推荐

  1. 磁头号和起始扇区的计算方法------软盘结构

    最近在看<自已动手写操作系统>这本书,读到第四章关于从软盘读取文件一节时一开始不能理解,特别是看不懂书中所附的源代码.经过自己查询软盘结构资料,通过本文对自己软盘的磁头号.磁道号和起始扇区 ...

  2. 软盘结构及软盘数据的读取

    由于最近在学习linux0.11内核,需要用到软盘启动,于是就抽空学习了一下软盘结构: 1.软盘结构 1.44软盘结构:2个盘面(0和1),一个盘面有80条磁道(或称磁柱),一个磁道有18个扇区,一个 ...

  3. 3.5寸1.44M软盘结构

    一.3.5寸1.44M软盘结构 1. 结构:2面.80道/面.18扇区/道.512字节/扇区          扇区总数=2面 X  80道/面 X  18扇区/道  =  2880扇区        ...

  4. 3.5寸1.44M软盘结构,容量和分配

    也许有用的老东西:)可以用来理解FAT格式 1. 结构:2面.80道/面.18扇区/道.512字节/扇区           扇区总数=2面 X  80道/面 X  18扇区/道  =  2880扇区 ...

  5. f-fdisk做磁盘分区,起始扇区从2048块开始

    文章目录 First Sector 起始扇区 fdisk工具加分区 fdisk删除分区 First Sector 起始扇区 默认从第2048块扇区开始是因为,由于EFI的兴起,要给EFI 代码留磁盘最 ...

  6. linux分区的起始扇区,f-fdisk做磁盘分区,起始扇区从2048块开始

    文章目录 First Sector 起始扇区 fdisk工具加分区 fdisk删除分区 First Sector 起始扇区 默认从第2048块扇区开始是因为,由于EFI的兴起,要给EFI 代码留磁盘最 ...

  7. 2139图结构练习——BFS——从起始点到目标点的最短步数

    图结构练习--BFS--从起始点到目标点的最短步数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  8. 硬盘基本知识(磁头、磁道、扇区、柱面) 转

    概述 盘片(platter) 磁头(head) 磁道(track) 扇区(sector) 柱面(cylinder) 盘片 片面 和 磁头 硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应 ...

  9. 硬盘基本知识(磁头、磁道、扇区、柱面)

    1. 硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头.受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内.盘片的编号自下向上从0开始,如最下边的盘 ...

最新文章

  1. mybatis的一些基础问题
  2. 收集了100+论文的最新综述来了!基于深度学习的图像深度重建
  3. 中国林科院亚热带林业研究所林木根际微生物博士后招聘启事
  4. CentOS查看 占用 内存 最多的 进程
  5. 音视频多媒体协议相关资料汇总
  6. java uuid静态方法_Java UUID nameUUIDFromBytes()方法及示例
  7. 如何开启Apache Rewrite功能
  8. python入门经典代码-python经典入门学习锦集就这篇够了,强烈建议收藏!
  9. ACL2021最佳论文出炉,来自字节跳动
  10. php foreach 过滤条件_PHP+Redis实现延迟任务实现完成订单
  11. ICPC 2015 北京 Today Is a Rainy Day
  12. css元素可拖动,css3实现可拖动的魔方3d效果
  13. 单片机外围电路设计之一:电阻
  14. 尚硅谷《全套Java、Android、HTML5前端视频》
  15. 中国存储器“3+1”版图初现 行业要再跑5年马拉松
  16. 跳过微信屏蔽APP扫描以及识别不同系统的手机
  17. ios12完美深色模式插件_分屏插件更新支持 A12,一心二用真滴爽
  18. 如何创建数仓指标体系?指标建模的基础理论
  19. Python基础语法(十一)
  20. Android Studio 配置 Copyright 插入版权声明

热门文章

  1. js清空数组遇到的小问题
  2. php hex2bin类似,有关phphex2bin()函数的文章推荐10篇
  3. 【方法】怎么做产品调研?
  4. 二叉查找树和平衡二叉树
  5. linux删除文件询问是否删除命令,Linux删除文件的命令?
  6. sqlserver 设置成可用本地ip进行登陆
  7. iterator_traits
  8. python 空语句_Python基础语法总结
  9. java中regex参考
  10. nginx入门demo