我正在编写基于FAT12文件系统的bootsector。过了一会儿我想出了一个问题。
.FindBootSectorTwo:
push SI
push DI
push CX
mov CX, 11
mov SI, BootloaderSTG2
rep cmpsb
pop CX
pop DI
pop SI
je LOAD_BOOTLOADER_STG2
nop
add DI, 32
loop .FindBootSectorTwo
jmp ERROR_NOT_FOUND
此标签搜索名为BLS2.SYS的文件,如果找到,则跳转到LOAD_BOOTLOADER_STG2标签。 LOAD_BOOTLOADER_STG2标签的开头:
LOAD_BOOTLOADER_STG2:
push SI
push CX
push DI
;sub DI, 32
mov SI, DI
mov CX, 11
call Printname
pop DI
pop CX
pop SI
pop DS
如果我尝试从DI中减去32,它会给我正确的文件名 - BLS2.SYS,但如果我没有,我只得到一堆空格。这可能是什么问题?这是一个错误,程序发现错误的文件,或者我只是不明白这里的东西?我正在x86机器上的Bochs上发布这个代码。附:这里是LOAD_ROOT标签和.FindBootSectorTwo。
LOAD_ROOT: ; in this label I search for an entry to Root directory, where my file is. When I find the root directory, I load it at: 0x0800:0x0000
mov [BS_DriveNumber], DL
mov AX, 0x0000
mov SS, AX
mov SP, 0x7C00
mov DS, AX
mov ES, AX
xor DX, DX
movzx AX, [BPB_NumberOfFATs]
mov BX, [BPB_SectorsPerFAT]
mul BX ; BX = NumFATS * SecPerFAT
mov BX, AX
add BX, [BPB_ReservedSectors] ; BX now contains LBA value aka NumFATS * SecPerFAT + ResvSecs
push DI
push ES
mov AX, [BPB_RootEntries]
shl AX, 5
xor DX, DX
div WORD[BPB_BytesPerSector] ; AL = (RootEntries * 32) / BytesPerSec
mov AH, 0x0002
push AX
mov AX, 0x0800
mov ES, AX ; ES = 0x0800
pop AX
mov DI, 0x0000
call ReadSectors
mov CX, [BPB_RootEntries]
push DS
push AX
mov AX, 0x0800
mov ES, AX
mov DS, AX
pop AX
mov DI, 0x0000
.FindBootSectorTwo: ; here I search for a file called BLS2.SYS (at 0x0800:0x0000), when I find it, the program jumps to LOAD_BOOTLOADER_STG2
push SI
push DI
push CX
mov CX, 11
mov SI, BootloaderSTG2
rep cmpsb
pop CX
pop DI
pop SI
je LOAD_BOOTLOADER_STG2
nop
add DI, 32
loop .FindBootSectorTwo
jmp ERROR_NOT_FOUND
如果您需要任何额外的代码安静 - 请告诉我。我会给你任何你需要的东西。
答案 0 :(得分:0)
代码从DI中减去32,因此指向文件名字符串的开头。然后你可以相应地打印出来。