Prints the wrong filename
Posted: Wed Dec 12, 2012 3:20 pm
Hello, I was writing a bootsector based on a FAT12 filesystem. After a while I came up with a problem.
This label searches for a file called BLS2.SYS and if it finds it, it jumps to LOAD_BOOTLOADER_STG2 label. The beginning of LOAD_BOOTLOADER_STG2 label:
If I try to subtract 32 from DI, it gives me the right file name -- BLS2.SYS, but if I don't , I get only a bunch of spaces. What could be the problem here? Is this is a bug, that the program finds the wrong file, or I just don't understand something here? I'm launching this code on Bochs, on a x86 machine. P.S. here's the LOAD_ROOT label together with .FindBootSectorTwo.
If you need any additional peaces of code -- tell me. I'll give you whatever you need.
Code: Select all
.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
add DI, 32
loop .FindBootSectorTwo
jmp ERROR_NOT_FOUND
Code: Select all
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
Code: Select all
LOAD_ROOT:
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:
push SI
push DI
push CX
mov CX, 11
mov SI, BootloaderSTG2
rep cmpsb
pop CX
pop DI
pop SI
je LOAD_BOOTLOADER_STG2
add DI, 32
loop .FindBootSectorTwo
jmp ERROR_NOT_FOUND