2010-07-12 86 views
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'?千字節?我 沒有得到它:)
  • 加斧,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

回答

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

+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