[OS64位][009]源码阅读:代码清单3-9 根据FAT表项
2019-05-05 本文已影响0人
AkuRinbu
学习笔记
使用教材(配书源码以及使用方法)
《一个64位操作系统的设计与实现》
http://www.ituring.com.cn/book/2450
https://www.jianshu.com/p/28f9713a9171
勘误

代码清单3-9 (程序3-2 boot.asm)
-
line :232 ~ 273
:Func_GetFATEntry
根据 FAT表项号N 计算出下一个FAT表项的索引号 FAT[N] - 传入参数:
AX=FAT 表项号 N
- 传出参数:
AX=FAT[N]

1、根据字节数计算出,扇区号以及偏移地址:

FAT12 entry location:
FAT表项的偏移扇区号 = 保留扇区数 + N*1.5 / 每扇区字节数 <- 取商值
ThisFATSecNum = BPB_ResvdSecCnt + ((N + (N / 2)) / BPB_BytsPerSec);
FAT表项在扇区中的偏移位置 = N*1.5 % 每扇区字节数 <- 取余数
ThisFATEntOffset = (N + (N / 2)) % BPB_BytsPerSec;
2、从软盘扇区到内存,扇区号与偏移地址的作用:

如果 某个表项 i 的下一个表项号 FAT[i]位于
软盘扇区 X扇区 开始的 偏移地址Y 处,
那么在调用软盘读取过程之后,
FAT[i] 就会位于内存地址ES:BX 开始的 偏移地址Y 处,
也就是它的内存地址是 ES:BX + Y,
也就是说,扇区号X只用在软盘读取扇区时、之后就不用了,
之后会继续用到的是 偏移地址Y(字节数)
参考资料
[OS64位][008]软盘文件系统分配图:根目录项结构、FAT表项结构
https://www.jianshu.com/p/2290e05af3f2
[032][汇编语言]div除法指令
https://www.jianshu.com/p/211cf4edd4d3
[044][汇编语言]mul指令 乘法指令
https://www.jianshu.com/p/76ed79d0a7a0
[008][汇编语言] mov [0],cs 段地址寄存器 到 内存单元
寄存器的高位与地位、内存单元的高地址与低地址https://www.jianshu.com/p/8a8f46154941