目前,我一直在关注 OS Dev 上的 BrokenThorn 系列,但遇到了一些问题。现在,作为本教程的一部分,我目前正在编写在第二阶段引导加载程序中加载的部分,但不幸的是,代码崩溃了。这是我认为麻烦的代码部分:
代码:
;browse root directory for binary image
mov ax, WORD [bpbRootEntries]; load loop counter, bpbRootEntries is the number of entries in the FAT table
mov di, 0x0000 ; because rep cmpsb compares the string in es:di to ds:si, and es holds 0x7e00 (the location of the FAT Table), I decided to set di to 0x0000
mov cx, 0x000B; eleven character name
lea si, [ImageName] ;set si to the memory location of ImageName so ds:si points to ImageName
.LOOP:
rep cmpsb
jz LOAD_FAT
add di, 32 ; queue next directory entry
dec ax
cmp ax, 0x0
jne .LOOP
jmp FAILURE
这部分代码在 FAT 表中查找文件。但是,它无法找到它,因此崩溃。在此代码中,ImageName 是一个变量,其中包含值“KRNLDR SYS”。在我的软盘驱动器中,我的软盘驱动器中有一个名为“KRNLDR SYS”的文件(带有空格,而不是“KRNLDR.SYS”)。如果有人可以提供任何建议,那将是一个很大的帮助。
注意:我目前正在运行 64 位 Windows 7 PC
更新
在所有有用的评论之后,我更新了代码:
mov ax, WORD [bpbRootEntries] ; load loop counter
mov di, 0x0000 ; locate first root entry
mov cx, 0x000B ; eleven character name
lea si, [ImageName] ; image name to find
.LOOP:
push di
push si
repe cmpsb
pop di
pop si
jz LOAD_FAT
add di, 32 ; queue next directory entry
dec ax
or ax, ax
jne .LOOP
jmp FAILURE
不幸的是,操作系统仍然无法找到该文件。
更新 2
这是我用来加载根目录表的代码:
LOAD_ROOT:
; compute size of root directory and store in "cx"
xor si, si
mov ax, 0x0020 ; 32 byte directory entry
mul WORD [bpbRootEntries] ; total size of directory
div WORD [bpbBytesPerSector] ; sectors used by directory
xchg ax, cx
; compute location of root directory and store in "ax"
mov al, BYTE [bpbNumberOfFATs] ; number of FATs
mul WORD [bpbSectorsPerFAT] ; sectors used by FATs
add ax, WORD [bpbReservedSectors] ; adjust for bootsector
mov WORD [datasector], ax ; base of root directory
add WORD [datasector], cx
; read root directory into memory (7C00:0200)
mov dx, 0x7e00
mov es, dx
mov bx, 0x0 ; copy root dir above bootcode
call ReadSectors
谢谢!