日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

loader.asm 注释

發(fā)布時(shí)間:2025/6/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 loader.asm 注释 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
org 100h ; 程序加載到內(nèi)存100h處執(zhí)行 BaseOfStack equ 0100h ; 定義Stack基址BaseOfKernelFile equ 08000h ; Kernel.bin被加載到的位置 ---段地址 OffsetOfKernelFile equ 0h ; Kernel.bin被加載到的位置 ---偏移地址jmp LABEL_START ; Start%include "fat12hdr.inc" ; 定義程序中使用的參數(shù) LABEL_START: ; 從這里開始mov ax,csmov ds,axmov es,axmov ss,axmov sp,BaseOfStackmov dh,0 ;"Loading "call DispStr ;顯示字串;下面在A盤的根目錄中尋找Kernel.binmov word [wSectorNo],SectorNoOfRootDirectoryxor ah,ahxor dl,dlint 13h ;軟驅(qū)復(fù)位 LABEL_SEARCH_IN_ROOT_DIR_BEGIN:cmp word[wRootDirSizeForLoop],0 jz LABEL_NO_KERNELBIN ;根目錄讀完未找到則跳轉(zhuǎn)dec word[wRootDirSizeForLoop]mov ax,BaseOfKernelFilemov es,ax ; es <- BaseOfKernelFile ES段寄存器,此處不支持立即數(shù)尋址mov bx,OffsetOfKernelFile ; bx <- OffsetOfKernelFilemov ax,[wSectorNo] ; ax <- Root Directory 中的某 Sector號(hào)mov cl,1call ReadSector ; 從序號(hào)為ax的扇區(qū)開始讀入cl個(gè)扇區(qū)至內(nèi)存es:bx處mov si,KernelFileName ; ds:si -> "KERNEL BIN"mov di,OffsetOfKernelFile ; es:di -> BaseOfKernelFilecld ; 置DF為0,字符串操作時(shí),si自增mov dx,10h ; 循環(huán)控制數(shù),每扇區(qū)16個(gè)條目,每條目32字節(jié),16*32=512 LABEL_SEARCH_FOR_KERNELBIN:cmp dx,0jz LABEL_GOTO_NEXT_SECTOR_IN_ROOT_DIR ; 未找到則讀下一個(gè)扇區(qū)dec dx mov cx,11 ; 循環(huán)控制數(shù),比較文件名,長度11 LABEL_CMP_FILENAME:cmp cx,0 jz LABEL_FILENAME_FOUND ; 若CX為0,則表示找到,跳轉(zhuǎn)dec cx lodsb ; 將ds:si處內(nèi)容傳送置AL中,si<-si+1 cmp al,byte [es:di] ; 將取出的字符與es:di處文件名相較jz LABEL_GO_ON ; 相等則跳轉(zhuǎn)到LABEL_GO_ON,比較下一個(gè)字符jmp LABEL_DIFFERENT ; 不等則跳轉(zhuǎn)到LABEL_DIFFERENT,比較下一個(gè)條目 LABEL_GO_ON:inc di ; di自增,指向下一個(gè)字符jmp LABEL_CMP_FILENAME ; 繼續(xù)比較 LABEL_DIFFERENT:and di,0FFE0h ; 0FFE0h=0b1111111111100000 ,將DI低五位清零,每個(gè)條目為32字節(jié),使di指向本條目的開頭add di,20h ; 20h=32,指向下一個(gè)條目的開頭mov si,KernelFileName ; 將si重置為指向KernelFileName的開頭jmp LABEL_SEARCH_FOR_KERNELBIN ;跳轉(zhuǎn)到LABEL_SEARCH_FOR_KERNELBIN,從下一條目中開始查找LABEL_GOTO_NEXT_SECTOR_IN_ROOT_DIR: ;查找下一個(gè)扇區(qū)add word[wSectorNo],1 ; 將wSectorNo存放值加1,指向下一個(gè)扇區(qū)jmp LABEL_SEARCH_IN_ROOT_DIR_BEGIN ;跳轉(zhuǎn)到LABEL_SEARCH_IN_ROOT_DIR_BEGIN,讀取下一個(gè)扇區(qū)并重復(fù)以上查找操作LABEL_NO_KERNELBIN: ; 顯示未找到KERNELmov dh,2call DispStr ; 輸出字串:NO KERNEL."jmp $ ; 未找到Kernel.bin,死循環(huán)LABEL_FILENAME_FOUND: ; 找到文件后的操作mov ax,RootDirSectors ; ax寄存器暫存根目錄區(qū)大小and di,0ffe0h ; di低五位清零,根目錄每個(gè)條目占32字節(jié),將di ->當(dāng)前條目的開始,書中寫and di,0fff0h,個(gè)人感覺有錯(cuò)誤 push eax ; eax進(jìn)棧保存mov eax,[es:di+01ch] mov dword[dwKernelSize],eax ; 保存此Kernel.bin文件大小pop eax ; 恢復(fù)eax為根目錄區(qū)大小add di,01ah ; di-> 此條目對(duì)應(yīng)的開始簇號(hào)mov cx,word [es:di] ; cx保存起始簇號(hào)(扇區(qū))push cx ; 進(jìn)棧保存此Sector在FAT中的序號(hào), 與下文調(diào)用讀取扇區(qū)的“call ReadSector"后的pop ax 相對(duì)應(yīng)add cx,ax ; cx <- cx+axadd cx,DeltaSectorNo ; cx <- cx+DeltaSectorNo ,cx寄存器中內(nèi)容為Kernel.bin的起始扇區(qū)號(hào),DeltaSectorNo=17 mov ax,BaseOfKernelFile mov es,ax ; es <- BaseOfKernelFile es寄存器中存儲(chǔ)Kernel.bin在內(nèi)存中加載的位置mov bx,OffsetOfKernelFile ; bx < - OffsetOfKernelFile bx寄存器中存儲(chǔ)Kernel.bin在內(nèi)存中相對(duì)于基址的偏移地址mov ax,cx ; 將CX寄存器中的值賦給AX,下面將AX寄存器中指向的扇區(qū)加載進(jìn)內(nèi)存LABEL_GOON_LOADING_FILE: push ax ; ax進(jìn)棧保存push bx ; bx進(jìn)棧保存mov ah,0eh ; 置ah為0eh,int 10h調(diào)用功能為顯示字符(光標(biāo)前移)mov al,'.' ; 置輸出字符'.'至al中mov bl,0fh ; bl置前景色為0fhint 10h ; 調(diào)用10h中斷,每讀一個(gè)扇區(qū)就在"Loading "后面打一個(gè)點(diǎn),形成”Loading ...“的效果pop bx ; bx出棧。存放內(nèi)容為Kernel.bin在相對(duì)于基址的偏移地址pop ax ; ax出棧,存放內(nèi)容為Kernel.bin的起始扇區(qū)號(hào)mov cl,1 ; ReadSector的參數(shù)cl置1,表示讀取從ax處開始的一個(gè)扇區(qū)call ReadSector ; 調(diào)用ReadSector,將Kernel.bin文件加載到內(nèi)存BaseOfKernelFiel:OffsetOfkernelFile處pop ax ; 與上文的push cx相對(duì)應(yīng)call GetFATEntry ; 調(diào)用GetFATEntry 找到序號(hào)為AX的Sector在FAT中的條目cmp ax,0fffh jz LABEL_FILE_LOADED ; 比較 ax與0fffh的值,相等則表示此簇已經(jīng)是最后一個(gè),Kernel.bin已加載到內(nèi)存,跳轉(zhuǎn)到LABEL_FILE_LOADEDpush ax ; ax進(jìn)棧保存mov dx,RootDirSectors ; dx 暫存根目錄扇區(qū)數(shù)add ax,dx ; ax+=dx;add ax,DeltaSectorNo ; 計(jì)算 ax簇號(hào)對(duì)應(yīng)扇區(qū)號(hào)add bx,[BPB_BytsPerSec] ; bx<-bx+[BPB_BytsPerSec],es:bx指向下一段未使用的內(nèi)存jmp LABEL_GOON_LOADING_FILE ; 無條件轉(zhuǎn)移至LABEL_GOON_LOADING_FILE,進(jìn)行讀取ax扇區(qū)至es:bx處的操作 LABEL_FILE_LOADED:call KillMotor ;關(guān)閉軟驅(qū)馬達(dá)mov dh,1 ; “Ready."call DispStr ; "顯示字符串"jmp $ ; 死循環(huán)

總結(jié)

以上是生活随笔為你收集整理的loader.asm 注释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。