最近,我尝试使用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(“测试目的”),但可以正常工作。我犯了什么错误。请帮忙!
关于我的段寄存器:
除堆栈段寄存器外,所有其他段寄存器均加载相同的值。