tôi đã cố gắng để phát triển một bộ nạp khởi động sử dụng this, nhưng khi nó được chạy nó cho thấy:đĩa đọc Lỗi trong khi tải thành phần vào bộ nhớ
disk read error!
Nếu tôi bỏ qua nó, trong một phần sau, nó cho thấy tôi nhớ sai ánh xạ. Tôi cũng theo một số nguồn khác nữa nhưng vô ích. Có vẻ như tôi chỉ sao chép những gì họ đang làm. Nếu tôi thậm chí còn hơi khác một loại lỗi mới sẽ tạo ra mỗi lần.
Tôi có nên sử dụng bộ tải khởi động đã được xây dựng hoặc phải làm gì không?
Mã lỗi tải đĩa là như sau:
[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
tôi sử dụng lệnh này để lắp ráp và chạy bootloader của tôi:
nasm boot.asm -f bin -o boot.bin && qemu-system-i386 boot.bin
tôi gặp khó khăn vào thời điểm này. Trình tải khởi động của tôi hiển thị disk read error
. Nếu tôi bỏ qua nó tại thời điểm này trong thời gian, sau đó nó tạo ra vấn đề trong khi thực hiện kernel.c của tôi Có vẻ như sử dụng bản đồ bộ nhớ sai.
Plz kiểm tra mã này và giúp tôi ra! –
Một vấn đề bạn có là bạn không thiết lập đúng _DS_ (Phân đoạn dữ liệu) khi chương trình của bạn bắt đầu. Bạn cũng thiết lập SP, nhưng bạn không thực sự thiết lập một _SS_ hợp lệ (Stack Segment). Điều này cũng có thể gây ra vấn đề. Trong disk_load bạn không đặt _ES_ (Phân đoạn mở rộng), cần phải được đặt đúng để vị trí bộ nhớ nơi dữ liệu được đọc được chỉ định đầy đủ (ES: BX là bộ đệm địa chỉ). Nếu bạn đang tạo một đĩa mềm 720k đọc 15 lĩnh vực có khả năng sẽ không hoạt động bởi vì các lĩnh vực tối đa trên một rãnh (xi lanh) là 9. Điều này có thể gây ra vấn đề đọc. –
Cũng là một ý tưởng hay để đặt '[bits 16]' ở trên cùng để NASM biết tạo ra tất cả mã 16 bit cho bộ nạp khởi động –