2011-11-15 100 views
10

我下面這個教程作爲首次進軍引導程序/ OS開發利用x86的NASM:86 NASM「組織」的指導意義

http://joelgompert.com/OS/TableOfContents.htm

而且我在第4課,這是使我bootloader輸出「Hello,world」字符串。 我不理解org指令(指令?)的含義。

據我所知,org定義了正在執行的程序被加載到內存中的位置。在程序中使用任何類型的標籤或相對地址時,這是必需的。

假設我有這樣的在我的程序標籤定義字符串:

szHello db 'Hello, world!', 0 

再後來我嘗試在標籤這樣的參考(只有相關的片段):

org 0x7c00 
xor ax, ax 
mov ds, 0 
... 
mov si, szHello 
lodsb 
... 
int 0x10 ; Print first character of szHello 

我的問題是,爲什麼這不等於這個? :

org 0 
mov ds, 0x7c00 
... 
mov si, szHello 
lodsb 
... 
int 0x10 

當我運行第一個示例時,我的字符串顯示正確。第二個例子不起作用。

如果問題是我的概念問題,那麼對相關文檔的指針也將非常感激。

回答

8

0000:7C00不等於7C00:0000。段部分按段落計數,而不是字節。試試這個:

mov ax, 0x7c0 
mov ds, ax 
+0

非常好,那有用,謝謝。不過,我不確定自己完全明白。 'org'消耗一個段地址,還是一個段的偏移量? –

+1

這是當前部分的偏移量。 –

+0

'mov ds,0x7c0'不是有效的指令。也許你的意思是'mov ax,0x7c0''mov ds,ax' –

13

org定義在哪裏將程序EXPECTS加載到內存中。不是它實際加載的地方 - 不管加載的人是誰 - 但是它預期加載的地方。

+0

有趣。如果我的程序在其他地方加載,會發生什麼情況?那麼,爲什麼'org'存在呢? –

+0

如果它被加載到其他地方,由彙編器計算的偏移量(如szHello標籤的地址)將是錯誤的,接下來會發生什麼是任何人的猜測。 –

+1

用另一種形式表示:絕對地址是錯誤的。 – ninjalj