2011-11-15 63 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