代码之家  ›  专栏  ›  技术社区  ›  Laurimann

为什么我的引导加载程序的堆栈段是0x3ff(实模式IVT结束)?

  •  3
  • Laurimann  · 技术社区  · 16 年前

    “地址0x500是BIOS最后使用的地址”是什么? Wikipedia -

    “00000000-000003FF实模式IVT(中断向量表)”是什么? osdev.org 有关BIOS内存映射的文章说。

    那么你能告诉我为什么NASM把我的.com文件的堆栈指针放在0x3ff上,而我的指令指针则放在0x7c00上吗?对我来说,SP最直观的地方就在0x7c00以下。

    4 回复  |  直到 16 年前
        1
  •  3
  •   Mike Gonta    16 年前

    简单的答案是引导扇区有一个有效(可能很小)的堆栈,BIOS使用它。

    令人高兴的是,3fh对于某些BIOS来说是一个有效的堆栈位置。在这种情况下,它是IVT的较低部分,这是因为这些中断向量没有被BIOS使用。这不是秘密。

    BIOS堆栈区
    BIOS使用30:0000h-30:00ffh(在中断向量表的顶部)作为堆栈区域。此区域用于BIOS计算和临时存储。在ambios中不支持的ints c0h到ffh的地址通常会占用这个空间。

    《ambios程序员指南1993》,第181页

        2
  •  1
  •   Earlz    16 年前

    我不相信BioSes会为你维持一个有效的堆栈。所以你应该在你的空闲内存中设置一个堆栈。我在引导加载程序中的一般启动顺序如下:

    [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:
    ;....
    

    纳斯姆只做你说的。这是使用汇编的要点。每行汇编代码都有一个由计算机执行的操作码的1:1比例。因此,如果BIOS没有为您设置堆栈,并且您的汇编代码中没有在何处设置堆栈,那么堆栈将处于某种无效状态。纳斯姆 不会 插入魔术代码以设置堆栈。

        3
  •  0
  •   Jens Björnhager    16 年前

    我不熟悉NASM,但我很确定它将您的堆栈段寄存器(ss)设置为0以外的值,所以ss:sp指向完全不同的地方。

    编辑:等等,是你的吗? 段 或 指针 设置为03FF?

        4
  •  0
  •   Laurimann    16 年前

    改变寄存器内容的不是汇编程序(通过可执行文件中的任何隐藏命令,在本例中是引导程序)。

    根据英特尔手册,不是CPU导致SP包含如此奇怪的值。 http://www.intel.com/design/pentiumii/manuals/243192.htm

    由于不存在运行代码的现有操作系统,导致SP(和其他寄存器)状态的唯一选项是BIOS。不幸的是,生物制品是封闭来源的“商业机密”,因此“为什么”的问题将留待回答。Coreboot http://www.coreboot.org/Welcome_to_coreboot 可能会给一些提示,为什么事情是这样的,但coreboot似乎做的事情有时非常不同于传统的生物。

    推荐文章