我正在为学习目的编写一个玩具内核,我遇到了一些麻烦.我做了一个简单的引导加载程序,从软盘加载一个段(用32位代码写入),然后引导加载程序启用A20门并打开保护模式.如果我用汇编程序写它,我可以跳到32位代码,但是如果我用C语言写它,我会得到一个三重错误.当我反汇编C代码时,我可以看到前两条指令涉及设置一个新的堆栈帧.这是工作ASM代码和失败的C代码之间的关键区别.我使用NASM v2.10.05作为ASM代码,使用来自DJGPP 4.72集合的GCC作为C代码.
这是引导加载程序代码:
org 7c00h
BITS 16
entry:
mov [drive], dl ;Save the current drive
cli
mov ax,cs ; Setup segment registers
mov ds,ax ; Make DS correct
mov ss,ax ; Make SS correct
mov bp,0fffeh
mov sp,0fffeh ;Setup a temporary stack
sti
;Set video mode to text
;===================
mov ah, 0
mov al, 3
int 10h
;===================
;Set current page to 0
;==================
mov ah, 5
mov al, 0
int 10h
;==================
;Load the sector
;=============
call load_image …Run Code Online (Sandbox Code Playgroud)