【发布时间】:2018-10-16 01:35:16
【问题描述】:
我正在尝试制作一个非常基本的 2 阶段引导加载程序,但在阅读第二阶段时遇到了问题。当我尝试将int 13h 与ah = 2 一起使用时,中断失败并返回代码1(无效命令)。我正在用 nasm 编译并用 qemu 进行测试。我一直在测试它是否可以使用 qemu 的控制台检查地址 0x8C00 并查看 ax 和进位标志。我总是看到0x8C00 周围的内存被清零,ax = 0x0101 并且设置了进位标志。
bootloader.s
[org 0x7c00]
[bits 16]
mov [driveNum], dl
mov ah, 0x0A
mov al, '-'
mov cx, 80
int 0x10
;read drive
mov ax, 0
mov es, ax
mov ah, 2
mov al, 1 ;sectors to read
mov ch, 0 ;cylinder
mov cl, 0 ;sector
mov dh, 0 ;head
mov dl, byte [driveNum] ; drive
mov bx, 0x8c00
int 13h
hang:
jmp $
driveNum: db 0xAA
times (510 - ($ - $$)) db 0
db 0x55
db 0xAA
secondstage.s
jmp $
times 512 db 0xFF
编译
nasm -f bin bootloader.s -o bootloader
nasm -f bin secondstage.s -o secondstage
cat bootloader secondstage > boot
运行使用
qemu-system-x86_64 -fda boot
【问题讨论】:
-
使用 CHS (Cylinder/Head/Sector),扇区编号是从 1 开始,而不是 0。如果要读取磁盘上的第二个扇区,则需要使用 Sector 2 (
cl), Head 0,Cylinder 0。您的代码可能失败,因为读取扇区 0 无效。 -
@MichaelPetch 就是这样,非常感谢
标签: assembly interrupt x86-16 bios osdev