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

StackOverflow https://stackoverflow.com/questions/1793158

Вопрос

Прошло некоторое время с тех пор, как я использовал ASM, и я решил еще раз попробовать написать небольшой загрузчик, протестировав его с помощью qemu.Моя проблема связана с interupt 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 $
Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top