我不认为BIOS应该为您维护有效的堆栈。因此,您应该在任何可用的空闲内存中自己设置堆栈。我的引导加载程序中一般的启动序列如下:
[BITS 16]
[ORG 0x7C00]
xor ax,ax ;AX=0
mov ds,ax
mov es,ax ;can be omitted
mov ss,ax
mov sp,0x7000 ;or replace with some other nice valid piece of memory
jmp word 0:begin ;BIOSes are sometimes buggy and load you initially with CS=7C0
begin:
;....
NASM不会做除你告诉它的事情以外的任何事情。这就是使用汇编的重点。每一行汇编代码都有一个1:1的比率,由计算机执行操作码。因此,如果BIOS没有为您设置堆栈,并且在您的汇编代码中没有设置堆栈,则堆栈将处于某种无效状态。NASM不会插入魔术代码来设置堆栈。
我不熟悉NASM,但我相当确定它会将您的堆栈段寄存器(SS)设置为与0不同的值,因此SS:SP指向完全不同的位置。
编辑:等等,您的段或指针是否设置为03FF?
汇编语言并不会通过可执行文件中的任何隐藏命令来改变寄存器的内容(在这种情况下是引导程序)。
根据英特尔手册,CPU 也不会导致 SP 包含如此奇怪的值。 http://www.intel.com/design/pentiumii/manuals/243192.htm
因为没有现有的操作系统可以运行代码,所以导致 SP(和其他寄存器)状态的唯一选择是 BIOS。不幸的是,BIOS 是闭源的“商业机密”,因此“为什么”这个问题将无法得到回答。Coreboot 在 http://www.coreboot.org/Welcome_to_coreboot 可能会给出一些关于为什么事情是这样的提示,但 Coreboot 有时似乎与传统 BIOS 做事情非常不同...