2009-11-24 6 views
2

Прошло некоторое время с тех пор, как я сделал ASM, и решил еще раз попытаться написать небольшой загрузчик, тестируя с qemu. Моя проблема связана с interupt 13, по какой-то причине флаг переноса устанавливается, поэтому чтение прерывается. На данный момент, мой образ диска выглядит следующим образом:Расширенное прерывание 13, чтение неформатированного диска

512 байт BootLoader < - Это (насколько я знаю) Является ли блок 0 в LBA

Основная функция < - Это будет блок 1

В принципе, с 512 байтами загрузки BIOS в память, я хочу загрузить следующие 512 байт с одного и того же диска. Однако я не могу понять, что происходит. Надеюсь, я дал достаточно информации.

Вот код, проблема со вторым прерыванием 0x13, как раз перед прыжком в 0x7E00:

[bits 16] 
[org 0x7C00] 

; Prepare Stack Segment 
;----------------------------------------------------------------- 
    mov sp, 0x7A00    ; Move Stack into SP 
    mov bp, sp     ; Store current Stack Base 

; Print Character to Make Sure Bootloader Has Reached this Point 
;----------------------------------------------------------------- 
    mov ah, 0x0E    ; Print Character to Screen 
    mov bh, 0x00    ; No Page Numbering 
    mov bl, 0x07    ; White Text, Black Background 
    mov al, 65     ; Print Letter A 
    int 0x10 

; Check if INT0x13 Extentions are Supported 
;----------------------------------------------------------------- 
    mov ah, 0x41    ; Set Function 0x41 
    mov word bx, 0x55AA   
    push dx      ; Save old Drive Identifier 
    mov dl, 0x80    ; Load 'Active' ID Into dl 
    int 0x13     ; Call Interupt 
    jc short unsupported  ; If Extentions aren't Supported, Jump 
    xor ax, ax 
    add ax, 1     ; Clear Carry Bit 

    mov si, DAPS    ; Load DAPS Struct to DS:SI 
    mov ah, 0x42    ; Read Functions (AL Ignored) 
    mov dl, 0x80    ; Active Boot Drive (Commented Out Due to Line 24) 
    int 0x13 
    jc short unsupported  ; If something goes wrong... 
    jmp 0x7E00     ; Jump to main 

; Errors 
;----------------------------------------------------------------- 
    unsupported: 
    mov ah, 0x0E    ; Print Letter F, Gives Indication of Failure 
    mov bh, 0x00 
    mov bl, 0x07 
    mov al, 70 
    int 0x10 

    success: 
    pop dx      ; Pop Original Drive Identifier 
    jmp $ 

; Fill Out Rest of Bootloader 
;----------------------------------------------------------------- 
times 494-($-$$) db 0 

; Memory Data Structures and Other Variables 
;----------------------------------------------------------------- 
    ; Disk Address Packet Structure (Used For Loading Rest of OS) 
    DAPS: db 0x10    ; Size of Structure (16 bytes) 
      db 0     ; Always 0 
      db 1     ; Number of Sectors to Read (1x512) 
      db 0     ; Always 0 
      dw 0x7E00    ; Target Location for Reading To 
      dw 0     ; Page Table (0, Disabled) 
      dd 1     ; Read from Second Block 
      dd 0     ; Large LBAs, ignore 

    db 0x55, 0xAA    ; Add Boot Record Signature 

main: 
    mov ah, 0x0E    ; Print Character to Screen 
    mov bh, 0x00    ; No Page Numbering 
    mov bl, 0x07    ; White Text, Black Background 
    mov al, 66     ; Print Letter B 
    int 0x10 

    jmp $ 

ответ

3

Проблема закончилась тем, что был простым, код был прав. Но поскольку итоговое изображение было 525 байт, а не кратным 512 байт, чтение прерывалось. Просто нужно было поместить мое изображение с помощью 0s, чтобы сделать размер изображения 1024B, чтобы чтение могло получить все 512 байтов.

(Очевидно, возможно, гораздо лучшая идея не иметь крошечный неформатированный диск, подобный этому, но для учебных целей это все, что мне действительно нужно)