x86 NASM的'org'指令的含义是什么?

17

我正在按照这篇教程作为第一次尝试使用NASM在x86上进行引导程序/操作系统开发:

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

现在我在第4课,要求我的引导程序打印出“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

当我运行第一个例子时,我的字符串正确显示。第二个例子不起作用。

如果这是我方面的概念性问题,指向相关文档的指针也将非常感激。

2个回答

20

org 定义了程序希望加载到内存的位置。它并不控制实际加载的位置——这是由执行加载操作的人控制的——但它定义了期望加载的位置。


有趣。如果我的程序在其他地方加载,会发生什么?那么,为什么org存在呢? - tdenniston
如果代码加载到其他位置,由汇编器计算的偏移量(例如 szHello 标签的地址)将会是错误的,接下来会发生什么就无法预测了。 - Igor Skochinsky

11

0000:7C00并不等同于7C00:0000。段落部分是按照段落数计算的,而不是按字节计算。尝试使用以下代码:

mov ax, 0x7c0 
mov ds, ax

非常好,可以了,谢谢。但是,我不确定我完全理解。org消耗一个段地址还是一个段内偏移量? - tdenniston
2
这是当前段中的偏移量。 - Igor Skochinsky
1
mov ds, 0x7c0 is not a valid instruction. Maybe you mean something like mov ax, 0x7c0 mov ds, ax - Michael Petch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接