assembly - MikeOS引导加载程序中的堆栈段

标签 assembly bootloader

我不明白这段代码:

mov ax, 07C0h   ; Set up 4K of stack space above buffer
add ax, 544     ; 8k buffer = 512 paragraphs + 32 paragraphs (loader)
cli             ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti             ; Restore interrupts
  • mov ax,07C0h-在这里BIOS加载了我们的
    代码。但是什么是“4K”?千字节?一世
    没有得到它:)
  • 添加斧子544-为什么再次输入“8K”?为什么我们要加544?为什么不512?
  • mov sp,4096-在这里设置堆栈指针。

  • 在设置堆栈指针之前,我们需要进行所有这些操作吗?

    最佳答案

    我认为对最后一行的评论总结如下:

    buffer:             ; Disk buffer begins (8k after this, stack starts)
    

    内存布局如下所示:
    +-------------------+ <-- 07C0:0000, where the BIOS loads the boot sector
    | 512 bytes of code |
    +-------------------+
    | 8KB set aside for |
    |   a disk buffer   |
    +-------------------+ <-- SS:0000
    |   4KB of stack    |
    +-------------------+ <-- SS:1000 = SS:SP
    

    关于段落的评论有些晦涩;我发现以字节为单位更容易思考,其中16个字节构成一个段落。

    这些不可思议的数字的原因:
  • 从段07C0开始,BIOS在其中加载代码
  • 跳过512字节,以说明代码本身(512字节= 32段)
  • 跳过8KB,为磁盘缓冲区留出空间(8,192字节= 512段)
  • 将SS放在4KB块的开头。 512 + 8192 = 8,704字节= 544个段落
  • 将SP放在该块的末尾。将其放在最后,因为堆栈需要在内存中向上增长。

  • 请注意,数字4096 = 4KB在代码中正常显示,因为SP寄存器需要一个以字节为单位的值。所有其他值都在段落中,因为它们与SS有关,SS是段寄存器。

    关于assembly - MikeOS引导加载程序中的堆栈段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3231607/

    相关文章:

    macos - Mac (68000) 汇编程序的名称是什么?

    linux - 如何在 Linux 下使用汇编和系统调用动态分配内存

    c - Cortex M3 的引导加载程序

    stm32 - STM32F303 上的引导加载程序 : built in from factory or externally programmed?

    windows - 如何在 Windows 10 专业版 64 位上将二进制文件刻录到通过软盘 USB 插入的软盘的扇区 0

    c - pic32 跳出引导加载程序导致一般异常

    c - 使用指定初始值设定项时不同的 gcc 程序集

    linux - 从仅采用 char* 参数的 x86_64 函数中使用 sys_write?

    assembly - 为什么在从引导加载程序跳转到应用程序之前需要更新堆栈指针

    c++ - 如何通过取消引用内存中的另一个地址来取消引用内存中的特定地址?