Assembly 在引导加载程序中从引导映像加载扇区失败

Assembly 在引导加载程序中从引导映像加载扇区失败,assembly,kernel,bootloader,Assembly,Kernel,Bootloader,我正在尝试构建自己的引导加载程序,加载后从实模式切换到保护模式,加载GDT描述符,然后调用一些第2阶段代码。因为我无法找到调试程序的好方法,所以要让程序正常运行,这是一场艰苦的战斗。出于某种奇怪的原因,我的代码无法将引导加载程序的第二个扇区读取到位于0x1000地址的内存中。我已尝试将int 0x13与al=0x01一起使用,这是一个获取上次驱动器操作状态的中断。它返回0x01,这意味着无效命令,这让我更加困惑 mov ah, 0 ;reset drive int 0x

我正在尝试构建自己的引导加载程序,加载后从实模式切换到保护模式,加载GDT描述符,然后调用一些第2阶段代码。因为我无法找到调试程序的好方法,所以要让程序正常运行,这是一场艰苦的战斗。出于某种奇怪的原因,我的代码无法将引导加载程序的第二个扇区读取到位于
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我正在重写我的引导加载程序,以便测试它。我会回来接受,只要我把你的新代码融入其中。别担心:)