选择x86实模式下的堆栈指针地址(对齐)

选择x86实模式下的堆栈指针地址(对齐),x86,bootloader,real-mode,X86,Bootloader,Real Mode,我知道应该将堆栈指针与2字节边界对齐。换句话说,不应将SP设置为以0xF或任何其他奇数结尾的值 如果我使用0xFFFF作为SP,会发生什么?所有64kB可用,还是少一个字节 如果我想要1024字节的堆栈大小,我应该将SP设置为0x3FF还是0x400?e、 g.SS堆栈段所指向的字节是否将被使用 它们指出,也不应使用以0xE结尾的SP地址,这样会浪费0x..E和0x..F处的字节。为什么会这样?x86堆栈已满。 Full表示堆栈指针指向最后一个被推送的项。这与空的下行/上行堆栈形成对比,其中堆栈

我知道应该将堆栈指针与2字节边界对齐。换句话说,不应将SP设置为以0xF或任何其他奇数结尾的值

如果我使用0xFFFF作为SP,会发生什么?所有64kB可用,还是少一个字节

如果我想要1024字节的堆栈大小,我应该将SP设置为0x3FF还是0x400?e、 g.SS堆栈段所指向的字节是否将被使用

它们指出,也不应使用以0xE结尾的SP地址,这样会浪费0x..E和0x..F处的字节。为什么会这样?

x86堆栈已满。 Full表示堆栈指针指向最后一个被推送的项。这与空的下行/上行堆栈形成对比,其中堆栈指针指向下一个空闲位置

基本上,这可以归结为push-ax的语义

当您将堆栈指针sp设置为地址X时,X被视为最后一个推送项的位置,因此将不使用它。 如果将sp设置为0xe,则推操作会将sp移动到0xe-2=0xc,并将其操作数写入其中。未触及0xe及以上位置的内存

为sp使用奇数地址会对性能产生负面影响,因为未对齐的内存访问的延迟可能是对齐访问的延迟的两倍。 对于小于写入时DRAM总线宽度为8字节的数量,这种惩罚会有所减少。 考虑到堆栈的使用频率,保持堆栈对齐是值得的

当堆栈指针达到1时,以sp的奇数地址开始将导致问题。 推送将sp设置为0xffff,但在该位置写入一个字将触发SS,因为较高的字节超出SS限制。 用一个混乱的堆栈引发异常将反过来引发另一个SS,CPU将作为DF调度该SS。 但堆栈仍然混乱,因此会生成第三个异常,即三重故障,CPU将重置。 因此,不对齐堆栈指针没有任何好处


如果您想要大小为S的堆栈,请将sp设置为S mod 216,并允许2在实模式下提升GP?抛出异常时应该发生什么?我似乎无法在我的引导加载程序中触发它,溢出/下溢字节似乎丢失了。@user2725580 AFAIR,正如英特尔手册所说,它应该被提升。GP是INT13。它被触发了吗?稍后我将对此进行测试,并最终更新答案。如果您有任何见解,请告诉我。@user2725580这是SS例外!我马上更新答案
sub sp, 02h
mov WORD [sp], ax