Ich hat versucht, einen Bootloader mit this, zu entwickeln, aber wenn es ausgeführt wird es zeigt:Disk Read Fehler beim Laden der Sektoren in dem Speicher
disk read error!
Wenn ich es zu ignorieren, in einem späteren Teil, es zeigt mir falschen Speicher Kartierung. Ich habe auch einige andere Quellen verfolgt, aber vergebens. Es fühlt sich an, als würde ich nur kopieren, was sie tun. Wenn ich auch nur ein bisschen anders mache, entsteht jedes Mal eine neue Art von Fehler.
Sollte ich einen bereits eingebauten Bootloader verwenden oder was tun?
Der Code der Plattenladefehler ist wie folgt:
[org 0x7c00]
KERNEL_OFFSET equ 0x1000
mov [BOOT_DRIVE], dl
mov bp, 0x9000
mov sp, bp
mov bx, MSG_REAL_MODE
call print_string
call load_kernel
jmp $
print_string:
pusha
mov ah, 0x0e
loop:
mov al,[bx]
cmp al, 0
je return
int 0x10
inc bx
jmp loop
return:
popa
ret
disk_load:
push dx
mov ah, 0x02
mov al, dh
mov ch, 0x00
mov dh, 0x00
mov cl, 0x02
int 0x13
jc disk_error
pop dx
cmp dh, al
jne disk_error
ret
disk_error :
mov bx, DISK_ERROR_MSG
call print_string
jmp $
DISK_ERROR_MSG db "Disk read error!", 0
[bits 16]
load_kernel:
mov bx, KERNEL_OFFSET
mov dh, 15
mov dl, [BOOT_DRIVE]
call disk_load
ret
; Global variables
BOOT_DRIVE db 0
MSG_REAL_MODE db "Started in 16-bit Real Mode", 0
; Bootsector padding
times 510-($-$$) db 0
dw 0xaa55
ich diesen Befehl verwenden, meine Bootloader zu montieren und laufen:
nasm boot.asm -f bin -o boot.bin && qemu-system-i386 boot.bin
ich an dieser Stelle stecken. Mein Bootloader-Display disk read error
. Wenn ich es zu diesem Zeitpunkt ignoriere, erzeugt es Probleme bei der Ausführung von kernel.c Es scheint eine falsche Speicherzuordnung zu verwenden.
Plz diesen Code überprüfen und helfen Sie mir! –
Ein Problem, das Sie haben, ist, dass Sie das _DS_ (Datensegment) nicht richtig einrichten, wenn Ihr Programm startet. Sie legen auch SP fest, aber Sie legen kein gültiges _SS_ (Stack Segment) fest. Dies könnte auch Probleme verursachen. In disk_load setzen Sie nicht das _ES_ (Erweitertes Segment), das richtig gesetzt werden muss, damit der Speicherort, an dem Daten gelesen werden, vollständig spezifiziert ist (ES: BX ist der Adresspuffer). Wenn Sie eine 720-KB-Diskette mit 15 Sektoren erstellen, funktioniert dies wahrscheinlich nicht, da die maximale Sektorenanzahl auf einer Spur (Zylinder) 9 beträgt. Dies kann zu Leseproblemen führen. –
Auch eine gute Idee, '[Bits 16]' an der Spitze zu setzen, so dass NASM weiß, um alle 16-Bit-Code für den Bootloader –