Расширенное прерывание 13, чтение неформатированного диска

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

512-байтовый загрузчик ‹- это (насколько мне известно) блок 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 $

person Dave    schedule 24.11.2009    source источник


Ответы (1)


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

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

person Dave    schedule 25.11.2009