[OS64位][006]源碼閱讀:代碼清單3-7 目標(biāo)文件搜索 Lable_Search_In_Root_Dir_Begin

學(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容