9

我不明白这段代码:

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”?千字节?我没明白:)
  • 添加 ax, 544 - 为什么又是“8K”?为什么我们要添加 544?为什么不是512?
  • mov sp, 4096 - 这里我们设置堆栈指针。

在我们设置堆栈指针之前,我们做所有这些操作是为了什么?

4

1 回答 1

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

于 2010-07-12T20:10:06.397 回答