堆栈段

问题描述:

我不明白这一段代码:堆栈段

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

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

+0

你有源代码的其余部分吗? – 2010-07-12 19:33:07

+1

是的。它可以在这里http://mikeos.berlios.de/#downloads或我在这里分享http://snipt.org/Tmon – 2010-07-12 19:48:08

+0

轻微切线:我可能是错误的,我没有英特尔手册方便检查,但我认为'CLI'和'STI'说明在这里是不必要的。 IIRC,保证如果移动到'SS'之后立即移动到'SP',那么在两个移动指令之间不会发生中断。 – bcat 2010-07-12 20:14:32

我想在最后一行的评论总结说:

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

+1

谢谢。你已经帮了我很多了:) – 2010-07-13 09:32:39

+0

我可以问,程序员怎么知道他们必须做这一切?这本手册在哪里,我甚至不知道我应该看什么手册? (我的意思是说07C0h是BIOS加载代码的手册的位置) – gideon 2013-10-16 08:29:29

+0

@gideon这种细节可以追溯到最初的IBM PC,因此它将由IBM记录并由PC克隆制造商复制。后来在80年代和90年代,我们有[PC实习生](http://www.amazon.com/PC-Intern-Encyclopedia-Programming-Developers/dp/1557553041/ref=sr_1_1?ie=UTF8&qid=1381938577&sr=8 -1&关键字= PC +实习生)。现在,这种晦涩难懂的知识在http://wiki.osdev.org等网站上流传,当然还有Stack Overflow。 – 2013-10-16 15:51:19