Assembly 汇编-如何引导附加在内核末尾的内核?

Assembly 汇编-如何引导附加在内核末尾的内核?,assembly,kernel,nasm,16-bit,mbr,Assembly,Kernel,Nasm,16 Bit,Mbr,我正在尝试在程序集引导加载程序/MBR上引导我的程序集内核。 我正在从偏移量0x7e00到偏移量0x8000(扇区1)读取内核到内存中;和跳跃偏移量0x7e00。为什么它没有跳入我的内核 ; Boot.asm [org 0x7c00] [bits 16] ReadDisk: push ax push bx push cx push dx mov bx, 0x0000 mov es, bx mov bx, 0x0000 mov

我正在尝试在程序集引导加载程序/MBR上引导我的程序集内核。 我正在从偏移量0x7e00到偏移量0x8000(扇区1)读取内核到内存中;和跳跃偏移量0x7e00。为什么它没有跳入我的内核

; Boot.asm
[org 0x7c00]
[bits 16]

ReadDisk:
    push ax
    push bx
    push cx
    push dx

    mov bx, 0x0000
    mov es, bx
    mov bx, 0x0000

    mov ah, 0x02
    mov al, 0x01
    mov ch, 0x00
    mov cl, 0x02
    mov dh, 0x00
    mov dl, 0x80
    int 0x13
    jc ReadDisk
    jmp 0x7e00


times 510 - ($ - $$) db 0
dw 0xaa55
~~~~


环境:NASM、QEMU、Windows 7 64位。

从您上次的评论中,我无法确定您更换了哪个
mov bx,0x0000
来解决问题。以下是解决方案:

mov bx, 0x0000
mov es, bx
mov bx, 0x7E00
当BIOS报告错误时,您应该中止,而不是冒着无休止重试的风险! 最好是留言


幸运的是,您是在模拟环境中完成所有这些操作的,因为否则玩弄第一个硬盘(
mov dl,0x80
)从来都不是一个好主意。

我不熟悉这种用法,但您需要设置BH(页面)和BL(颜色)吗?不,我写时没有nor页,也没有颜色。您正在读取扇区2到0000:0000!由于int 13h的错误,它似乎在循环。您能否将返回值发送到串行端口以查看其失败的原因?如何执行,@donjuedo?基于此答案,当从BIOS调用代码时,明智的做法是注意
dl
中的值。这将告诉您系统从哪个驱动器启动,可以为您节省大量的痛苦和故障排除。。。它可能不是0x80。我应该将dl的值保存到变量吗??
mov bx, 0x0000
mov es, bx
mov bx, 0x7E00