从引导加载程序跳转时未执行内核文件

时间:2018-10-02 07:55:28

标签: assembly x86 nasm bootloader

最近,我尝试使用16位程序集,并想写下一个带有内核文件的引导加载程序,以制作类似于操作系统的文件。我的引导加载程序代码已完全验证,并将内核代码加载到内存中。但是一旦加载,我将无法跳转到该代码并执行它。这里是一些相关的细节。

    call    load_dir                ; Load the directory table into the memory
    call    search_kernel           ; Search for Kernel Address (First Logical Cluster ) in the root directory
    call    load_fat                ; Load file allocation table into the memory
    call    read_fat

从上面的代码中可以看到,first load_directory将整个目录(13个扇区)加载到内存中。加载后,search_kernel会尝试查找名为“ KERNEL.BIN”的文件,如果找到该文件,则会将单词从偏移量26加载到ax(第一个逻辑簇)中。之后,代码将脂肪(精确到8个扇区)加载到内存中,并开始读取它(read_fat),然后将数据加载到(buffer + 10752)中。 到这里一切都很好。 我验证了内容,这是该地址中的正确代码。 现在问题来了。之后,我写了声明

    mov     bx,[buffer+10752]
    push    bx
    ret

实际上,从技术上讲,这应该欺骗ip寄存器以加载我想要的指令并执行它。 KERNEL.BIN的代码是

BITS 16
jmp  short main
main:
    mov     ah,0EH
    mov     al,'H'
    int     10H
    jmp $

现在这应该在屏幕上打印字符H(“测试目的”),但可以正常工作。我犯了什么错误。请帮忙!

关于我的段寄存器:

除堆栈段寄存器外,所有其他段寄存器均加载相同的值。

0 个答案:

没有答案