于渊关于从软盘读取文件所附的源代码注释如下:
; 设扇区号为 x
; ┌ 柱面号 = y >> 1
; x ┌ 商 y ┤
; -------------- => ┤ └ 磁头号 = y & 1
; 每磁道扇区数 │
; └ 余 z => 起始扇区号 = z + 1
如何理解这个计算方法呢?
3.4寸1.44M软盘存储结构:
物理地址 扇区地址
0面0磁道 1扇区 0
0面0磁道 2扇区 1
: :
0面0磁道18扇区 17
1面0磁道 1扇区 18
1面0磁道 2扇区 19
: :
1面0磁道18扇区 35
:
说明:软盘存储地址的编排是以磁道方式安排的,而不是面方式来安排的,即不是排完第一面再排第二面的方式来安排。
为了从扇区号为地址的方式转换为以磁面号、磁道号、起码扇区号为地址方式来从软盘读取文件的方法。换个思考方式,反过来思考,从磁面号、磁道号、起码扇区号为地址转换为以扇区号为地址的方式读取文件。
通过从上面软盘存储结构并使用高中就学到的数学归纳法可得:
磁面号(F)=0,磁道号(R)=0 起始扇区号(S)=18 所对应的扇区地址 (A)=17
磁面号(F)=1,磁道号(R)=0 起始扇区号(S)=18 所对应的扇区地址 (A)=35
这两个分别为软盘最前面的两个磁道了,通过画下类似于上面的软盘存储结构便可理解。 注 F,R,S,A为简写,比如:F代表磁面号。
进而可以得知任意的 A = F*18+R*18*2+S-1 即 A=(F+2R)*18+S-1
注意 R*18*2中的2 是因有两个磁面,比如 R=1 那么它的前面就有 F=0、R=0,F=1、 R=0
所以,A除以18的余数等于 S-1 S=A除以18的余数+1
类似的 A除以18的商等于 F+2R 如何分别得出F,R的值呢?? 已知 F=0或1,2R的个位数一定为偶数
即:如果 F+2R为个位数为奇数的话 ,那么肯定F为奇数,F的值只能为1(F=1) 所以,F = A除于18的商 & 1
对于R,如果 F=0 ,那么 R=A除以18的商 除以 2 = A除以18的商 >> 1
如果 F=1 ,那么 A除以18的商 除以 2 = (F+2R)/2 = F/2+R ,又 F/2=0或0.5 由于是整除被舍去 即 R = A除于18的商 >> 1
这样就可以于渊的那段源代码注释了。可见理解的关键在于公式 A = F*18+R*18*2+S-1 而这个公式本身不难得出,多试几个值就明白了。
第一次写博客,请多多指正。呵呵。