X86 Указание директивы NASM 'org'

Я следую этому руководству в качестве первого набега на разработку загрузчика/ОС для x86 с использованием NASM:

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

Когда я запускаю первый пример, моя строка отображается правильно. Второй пример не работает.

Указатели на соответствующую документацию также будут высоко оценены, если проблема является концептуальной проблемой с моей стороны.

Ответ 1

0000: 7C00 не эквивалентен 7C00: 0000. Часть сегмента подсчитывается в параграфах, а не в байтах. Вместо этого попробуйте:

mov ax, 0x7c0 
mov ds, ax

Ответ 2

org определяет, где программа, о которой идет речь, EXPECTS загружается в память. Не там, где он действительно загружен - это контролируется тем, кто выполняет загрузку, но там, где он ожидает загрузки.