13 prolongée d'interruption, la lecture d'un disque non formaté
-
22-09-2019 - |
Question
Il a été un moment que je l'ai fait une ASM, et décidé d'essayer encore une fois et écrire un petit bootloader, des tests avec qemu. Mon problème avec interupt 13, pour une raison quelconque le drapeau de transport est fixé, de sorte que la lecture est un échec. À l'heure actuelle, mon image disque ressemble à:
512 octets BootLoader <- Ce (pour autant que je sache) est un bloc 0 dans LBA
Fonction principale <- Ce serait bloc 1
En fait, avec les 512 octets les charges de bios en mémoire, je veux charger les 512 octets suivants du même lecteur. Je ne peux pas comprendre ce qui ne va pas cependant. J'ai donné espère assez d'informations.
Voici le code, le problème est avec la deuxième interruption 0x13, juste avant le saut à 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 $
La solution
problème a fini par être simple, le code était juste. Mais parce que l'image finale était de 525 octets, au lieu d'un multiple de 512 octets, la lecture a éclaté. Juste dû pad mon image avec 0s pour rendre la taille de l'image 1024B de sorte que la lecture pourrait obtenir tous les 512 octets.
(Il est évident que sans doute une bien meilleure idée de ne pas avoir un petit disque non formaté comme celui-ci, mais à des fins d'apprentissage cela est tout ce que je avais vraiment besoin)