x86 NASM'org'指令含义

tde*_*ton 13 x86 assembly nasm bootloader

我正在关注本教程,作为使用NASM进行x86的bootloader/OS开发的第一次尝试:

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

我正在第4课,这使我的引导程序打印出"Hello,world"字符串.我不理解org指令的含义(指令?).

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

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

szHello db 'Hello, world!', 0
Run Code Online (Sandbox Code Playgroud)

然后我尝试像这样引用该标签(仅相关的片段):

org 0x7c00
xor ax, ax
mov ds, 0
...
mov si, szHello
lodsb
...
int 0x10 ; Print first character of szHello
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么这不等于这个?:

org 0
mov ds, 0x7c00
...
mov si, szHello
lodsb
...
int 0x10
Run Code Online (Sandbox Code Playgroud)

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

如果问题是我的概念问题,也会非常感谢相关文档的指针.

Chr*_*odd 16

org定义将EXPECTS要加载到内存中的程序的位置.不是它实际加载的地方 - 由负载的任何人控制 - 但它预期加载的位置.

  • 换句话说:绝对地址会出错. (2认同)

Igo*_*sky 10

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

mov ax, 0x7c0 
mov ds, ax
Run Code Online (Sandbox Code Playgroud)

  • 它是当前段中的偏移量。 (2认同)