软盘结构 磁头号和起始扇区的计算方法
分享一下我老师大神的人工智能教程!零基础,通俗易懂!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 ;磁头数
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
软盘结构 磁头号和起始扇区的计算方法相关推荐
- 磁头号和起始扇区的计算方法------软盘结构
最近在看<自已动手写操作系统>这本书,读到第四章关于从软盘读取文件一节时一开始不能理解,特别是看不懂书中所附的源代码.经过自己查询软盘结构资料,通过本文对自己软盘的磁头号.磁道号和起始扇区 ...
- 软盘结构及软盘数据的读取
由于最近在学习linux0.11内核,需要用到软盘启动,于是就抽空学习了一下软盘结构: 1.软盘结构 1.44软盘结构:2个盘面(0和1),一个盘面有80条磁道(或称磁柱),一个磁道有18个扇区,一个 ...
- 3.5寸1.44M软盘结构
一.3.5寸1.44M软盘结构 1. 结构:2面.80道/面.18扇区/道.512字节/扇区 扇区总数=2面 X 80道/面 X 18扇区/道 = 2880扇区 ...
- 3.5寸1.44M软盘结构,容量和分配
也许有用的老东西:)可以用来理解FAT格式 1. 结构:2面.80道/面.18扇区/道.512字节/扇区 扇区总数=2面 X 80道/面 X 18扇区/道 = 2880扇区 ...
- f-fdisk做磁盘分区,起始扇区从2048块开始
文章目录 First Sector 起始扇区 fdisk工具加分区 fdisk删除分区 First Sector 起始扇区 默认从第2048块扇区开始是因为,由于EFI的兴起,要给EFI 代码留磁盘最 ...
- linux分区的起始扇区,f-fdisk做磁盘分区,起始扇区从2048块开始
文章目录 First Sector 起始扇区 fdisk工具加分区 fdisk删除分区 First Sector 起始扇区 默认从第2048块扇区开始是因为,由于EFI的兴起,要给EFI 代码留磁盘最 ...
- 2139图结构练习——BFS——从起始点到目标点的最短步数
图结构练习--BFS--从起始点到目标点的最短步数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...
- 硬盘基本知识(磁头、磁道、扇区、柱面) 转
概述 盘片(platter) 磁头(head) 磁道(track) 扇区(sector) 柱面(cylinder) 盘片 片面 和 磁头 硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应 ...
- 硬盘基本知识(磁头、磁道、扇区、柱面)
1. 硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头.受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内.盘片的编号自下向上从0开始,如最下边的盘 ...
最新文章
- mybatis的一些基础问题
- 收集了100+论文的最新综述来了!基于深度学习的图像深度重建
- 中国林科院亚热带林业研究所林木根际微生物博士后招聘启事
- CentOS查看 占用 内存 最多的 进程
- 音视频多媒体协议相关资料汇总
- java uuid静态方法_Java UUID nameUUIDFromBytes()方法及示例
- 如何开启Apache Rewrite功能
- python入门经典代码-python经典入门学习锦集就这篇够了,强烈建议收藏!
- ACL2021最佳论文出炉,来自字节跳动
- php foreach 过滤条件_PHP+Redis实现延迟任务实现完成订单
- ICPC 2015 北京 Today Is a Rainy Day
- css元素可拖动,css3实现可拖动的魔方3d效果
- 单片机外围电路设计之一:电阻
- 尚硅谷《全套Java、Android、HTML5前端视频》
- 中国存储器“3+1”版图初现 行业要再跑5年马拉松
- 跳过微信屏蔽APP扫描以及识别不同系统的手机
- ios12完美深色模式插件_分屏插件更新支持 A12,一心二用真滴爽
- 如何创建数仓指标体系?指标建模的基础理论
- Python基础语法(十一)
- Android Studio 配置 Copyright 插入版权声明