2

FAT12 ファイルシステムに基づいてブートセクタを作成していました。しばらくすると、問題が発生しました。

.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 でこのコードを起動しています。PS ここでは、.FindBootSectorTwo と共に LOAD_ROOT ラベルを示します。

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

追加のコードが必要な場合は、教えてください。必要なものは何でもあげます。

4

1 に答える 1

0

コードは DI から 32 を引いているため、ファイル名文字列の先頭を指しています。その後、それに応じて印刷できます。

于 2013-01-30T21:14:33.127 に答える