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

时间:2010-07-12 19:31:22

标签: 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 - 这里我们设置堆栈指针。

在设置堆栈指针之前,我们要做什么操作呢?

1 个答案:

答案 0 :(得分:9)

我认为最后一行的评论总结了它:

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有关,这是一个段寄存器。