小编mag*_*pie的帖子

C代码中堆栈的三重故障

我正在为学习目的编写一个玩具内核,我遇到了一些麻烦.我做了一个简单的引导加载程序,从软盘加载一个段(用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)

x86 assembly stack gcc osdev

11
推荐指数
1
解决办法
620
查看次数

标签 统计

assembly ×1

gcc ×1

osdev ×1

stack ×1

x86 ×1