- [OS64位][006]源码阅读:代码清单3-7 目标文件搜索
- [C语言]模拟内存物理页,申请连续64个物理页,对应位图置1
- [OS64位][016]源码阅读:代码清单3-25~3-27
- [OS64位][014]源码阅读:代码清单3-18 ~ 3-22
- [OS64位][015]源码阅读:代码清单3-23 ~ 3-24
- [OS64位][005]源码阅读:代码清单3-6 软盘读取 Fu
- [OS64位][009]源码阅读:代码清单3-9 根据FAT表项
- [OS64位][017]源码阅读:代码清单3-28~3-37 保
- [OS64位][010]源码阅读:代码清单3-10 从FAT12
- [OS64位][007]源码阅读:代码清单3-8 INT 10H
学习笔记
使用教材(配书源码以及使用方法)
《一个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=20H,
add 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
网友评论