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

qik*_*qik 9 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
Run Code Online (Sandbox Code Playgroud)
  • mov ax,07C0h - 这里BIOS加载我们的代码.但什么是'4K'?千字节?我没弄明白:)
  • 添加斧头,544 - 为什么再次'8K'?为什么我们加544?为什么不是512?
  • mov sp,4096 - 这里我们设置堆栈指针.

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

Tim*_*son 9

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

buffer:             ; Disk buffer begins (8k after this, stack starts)
Run Code Online (Sandbox Code Playgroud)

内存布局如下所示:

+-------------------+ <-- 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
Run Code Online (Sandbox Code Playgroud)

有关段落的评论略显迟钝; 我发现以字节为单位更容易思考,其中16个字节构成一个段落.

这些神奇数字的原因:

  • 从段07C0开始,BIOS加载代码
  • 跳过512字节,以考虑代码本身(512字节= 32段)
  • 跳过8KB,为磁盘缓冲区留出空间(8,192字节= 512段)
  • 将SS放在4KB块的开头.512 + 8192 = 8,704字节= 544段
  • 将SP放在该块的末尾.把它放在最后因为堆栈需要在内存中向上增长.

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