2012-12-13 2 views
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에서이 코드를 시작합니다. 추신 여기에는 .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 

추가 코드가 필요하면 알려주세요. 니가 필요로하는 것을 너에게 줄거야.

+0

내 어셈블러가 녹슬 었습니다. 코드를 분석하고 논리적 주석을 추가 할 수 있습니까? 레지스터에 일어나는 일을 설명하는 주석이 아니라 예를 들면. '; 위치 X를 열거하기위한 루프 초기화 또는'; blah ... else foo' –

+0

FindBootSectorTwo 또는 LOAD_ROOT에만 주석을 추가하고 싶습니까? – Arnas

+0

개인적으로 모든 것을 추가해야한다고 생각합니다. –

답변

0

코드가 DI에서 32를 뺀 것이므로 파일 이름 문자열의 시작 부분을 가리 킵니다. 그런 다음 적절하게 인쇄 할 수 있습니다.