學(xué)習(xí)筆記
使用教材(配書源碼以及使用方法)
《一個64位操作系統(tǒng)的設(shè)計與實現(xiàn)》
http://www.ituring.com.cn/book/2450
http://www.itdecent.cn/p/28f9713a9171
代碼清單3-7 (程序3-2 boot.asm)
-
line: 92 ~ 144: 基于文件系統(tǒng)的目標(biāo)文件搜索
根目錄區(qū)起始扇區(qū)號為
19
根目錄區(qū)總扇區(qū)數(shù)為14
根目錄區(qū)只保存目錄項
目錄項是一個32字節(jié)的結(jié)構(gòu)體,記錄著文件名、長度以及數(shù)據(jù)起始簇號等
目錄項的開頭11個字節(jié)是文件名
根目錄區(qū) 總扇區(qū)數(shù)14
(1)調(diào)用過程
call Func_ReadOneSector,每次讀入一個扇區(qū)的數(shù)據(jù)到 ES:BX
(2)再接著遍歷單個扇區(qū)中的 16個目錄項
(3)將 每個目錄項的文件名 與 指定的文件名"LOADER BIN"進行對比
(4)16個目錄項全部對比完沒有匹配的話,就進入下一個扇區(qū) ,通過增加扇區(qū)號實現(xiàn) :add word [SectorNo], 1
line: 92 ~ 144 : 基于文件系統(tǒng)的目標(biāo)文件搜索跳轉(zhuǎn)關(guān)系
and di, 0ffe0h 有什么用?
首先, DS:DI 指向目標(biāo)緩沖區(qū),即扇區(qū)數(shù)據(jù)讀入到的內(nèi)存地址;
其次,移動到下一個目錄項要增加32字節(jié)(因為單個目錄項32字節(jié)),32D=20H,
add di, 20h;并且,在之前有一句
and di, 0ffe0h,理由在于,對比文件名的11個字節(jié)時,也是使用di來訪問單個字節(jié),十進制數(shù)11等于二進制數(shù)1 0 1 1,可見訪問單字節(jié)造成的di增加只會影響到di寄存器最低4位;因此,使用
and di, 0ffe0h目的就是清空由于訪問單字節(jié)造成的di增加;那么,這樣清空之后,再使用
add di, 20h就可以準(zhǔn)確地去到下一目錄項;
參考資料
- 目錄項是一個32字節(jié)的結(jié)構(gòu)體,其中記錄著名字、長度以及數(shù)據(jù)起始簇號等信息;
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字節(jié)對di的影響而消除了. . .
di在一個目錄項中,最多是di+11,而11根本不會影響倒數(shù)第5位,如果沒找到,and di ,offe0;又把之前的加的x又消除了,同樣倒數(shù)第5位沒變化;
https://www.cnblogs.com/chen-blog/archive/2012/04/28/os.html




