[OS64位][006]源码阅读:代码清单3-7 目标文件搜索 Lable_Search_In_Root_Dir_Begin

学习笔记

使用教材(配书源码以及使用方法)
《一个64位操作系统的设计与实现》
http://www.ituring.com.cn/book/2450
https://www.jianshu.com/p/28f9713a9171

代码清单3-7 (程序3-2 boot.asm)

  • line: 92 ~ 144 : 基于文件系统的目标文件搜索

根目录区起始扇区号为 19
根目录区总扇区数为14
根目录区只保存目录项
目录项是一个32字节的结构体,记录着文件名、长度以及数据起始簇号
目录项的开头11个字节是文件名

根目录区 总扇区数14

(1)调用过程call Func_ReadOneSector,每次读入一个扇区的数据到 ES:BX
(2)再接着遍历单个扇区中的 16个目录项
(3)将 每个目录项的文件名 与 指定的文件名"LOADER BIN"进行对比
(4)16个目录项全部对比完没有匹配的话,就进入下一个扇区 ,通过增加扇区号实现 :add word [SectorNo], 1

line: 92 ~ 144 : 基于文件系统的目标文件搜索

跳转关系

and di, 0ffe0h 有什么用?

  • 首先, DS:DI 指向目标缓冲区,即扇区数据读入到的内存地址;

  • 其次,移动到下一个目录项要增加32字节(因为单个目录项32字节)32D=20Hadd di, 20h

  • 并且,在之前有一句and di, 0ffe0h,理由在于,对比文件名的11个字节时,也是使用di来访问单个字节,十进制数11等于二进制数 1 0 1 1,可见访问单字节造成的di增加只会影响到di寄存器最低4位

  • 因此,使用and di, 0ffe0h目的就是清空由于访问单字节造成的di增加;

  • 那么,这样清空之后,再使用add di, 20h就可以准确地去到下一目录项;

参考资料

  • 目录项是一个32字节的结构体,其中记录着名字、长度以及数据起始簇号等信息;

Root Directory Entry Format

http://www.c-jump.com/CIS24/Slides/FAT/lecture.html#F01_0140_root_directory

Directory entry structure

http://elm-chan.org/docs/fat_e.html#notes

  • LODSB: Load byte at address DS:(E)SI into AL

http://qcd.phys.cmu.edu/QCDcluster/intel/vtune/reference/vc161.htm

  • and di, 0ffe0h 有什么用?

11: 0000 1011;
把之前比对的11字节对di的影响而消除了. . .
di在一个目录项中,最多是di+11,而11根本不会影响倒数第5位,如果没找到,and di ,offe0;又把之前的加的x又消除了,同样倒数第5位没变化;
https://www.cnblogs.com/chen-blog/archive/2012/04/28/os.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容