Assembly 在引导加载程序中从引导映像加载扇区失败
我正在尝试构建自己的引导加载程序,加载后从实模式切换到保护模式,加载GDT描述符,然后调用一些第2阶段代码。因为我无法找到调试程序的好方法,所以要让程序正常运行,这是一场艰苦的战斗。出于某种奇怪的原因,我的代码无法将引导加载程序的第二个扇区读取到位于Assembly 在引导加载程序中从引导映像加载扇区失败,assembly,kernel,bootloader,Assembly,Kernel,Bootloader,我正在尝试构建自己的引导加载程序,加载后从实模式切换到保护模式,加载GDT描述符,然后调用一些第2阶段代码。因为我无法找到调试程序的好方法,所以要让程序正常运行,这是一场艰苦的战斗。出于某种奇怪的原因,我的代码无法将引导加载程序的第二个扇区读取到位于0x1000地址的内存中。我已尝试将int 0x13与al=0x01一起使用,这是一个获取上次驱动器操作状态的中断。它返回0x01,这意味着无效命令,这让我更加困惑 mov ah, 0 ;reset drive int 0x
0x1000
地址的内存中。我已尝试将int 0x13
与al=0x01
一起使用,这是一个获取上次驱动器操作状态的中断。它返回0x01
,这意味着无效命令
,这让我更加困惑
mov ah, 0 ;reset drive
int 0x13
or ah, ah ;check for error
jnz err ;error handling function (prints ASCII A)
mov ax, 0
mov es, ax
mov bx, 0x1000 ;read sector into 0000:0x1000
mov ah, 0x02 ;read sector
mov al, 1 ;# of sectors to read = 1
mov ch, 0 ;Cylinder = 0
mov cl, 0x02 ;Sector to read = 2 (second as first sector is this code)
mov dh, 0 ;head = 0
;dl should equal the drive number as BIOS automatically detects it
int 0x13
or ah, ah
jnz err ;check for error again (this is where the error occurs)
当计算机启动时,我被告知BIOS将驱动器号放入dl
寄存器,因此所有中断都应在正确的驱动器上执行。我甚至尝试将dl
设置为0x00
,这相当于软盘驱动器A:
,在BOCHS(CPU仿真器)中,我将软盘驱动器A:
设置为我的启动映像,但它仍然无法启动。QEMU和BOCHS没有正确地模拟代码有什么原因吗?我还没有尝试将其刻录到USB并从实时BIOS启动。我将发布我的完整代码,以便您可以在必要时查看它。如果我不够清楚,我很抱歉,我是操作系统开发的初学者。非常感谢
编辑:
操作系统:Windows 7 x64(正在开发x32操作系统)
仿真:BOCHS运行NASM编译器创建的boot.img。您正在错误地检查错误。例如,int 0x13 ah=0通过设置进位标志而不是通过报告ah中的内容来指示错误。如果使用jc err设置了进位,那么您应该跳转,而不是使用或啊,啊jnz err。@Stewart我正在重写我的引导加载程序,以便测试它。我会回来接受,只要我把你的新代码融入其中。别担心:)