【问题标题】:x86 NASM 'org' directive meaningx86 NASM 'org' 指令含义
【发布时间】:2011-12-29 17:08:09
【问题描述】:

我正在学习本教程,作为使用 NASM 进行 x86 引导加载程序/OS 开发的第一次尝试:

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

我正在上第 4 课,这将使我的引导加载程序打印“Hello, world”字符串。 我不明白org 指令(指令?)的含义。

据我了解,org 定义了正在执行的程序加载到内存中的位置。在程序中使用任何类型的标签或相对地址时都需要这样做。

假设我在我的程序中有一个用这样的标签定义的字符串:

szHello db 'Hello, world!', 0

然后我稍后尝试像这样引用该标签(仅相关的 sn-ps):

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

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

如果问题是我的概念问题,也将非常感谢您提供相关文档的指针。

【问题讨论】:

    标签: assembly x86 nasm bootloader


    【解决方案1】:

    org 定义了有问题的程序预计加载到内存中的位置。不是实际加载的位置(由执行加载的人控制),而是预期加载的位置。

    【讨论】:

    • 有趣。如果我的程序加载到其他地方会怎样?那么,为什么org 存在呢?
    • 如果加载到别的地方,那么汇编器计算出来的偏移量(比如szHello标签的地址)就会出错,接下来会发生什么,谁也说不准。
    【解决方案2】:

    0000:7C00 不等于 7C00:0000。段部分按段落计算,而不是字节。试试这个:

    mov ax, 0x7c0 
    mov ds, ax
    

    【讨论】:

    • 很好,很有效,谢谢。但是,我不确定我是否完全理解。 org 是使用段地址还是段的偏移量?
    • 当前段的偏移量。
    • mov ds, 0x7c0 不是有效指令。也许你的意思是mov ax, 0x7c0mov ds, ax
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2021-12-28
    • 2018-08-27
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多