Значение директивы x86 NASM 'org' - PullRequest
13 голосов
/ 15 ноября 2011

Я слежу за этим уроком как первый шаг в разработке загрузчика / ОС для 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

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

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

Ответы [ 2 ]

16 голосов
/ 15 ноября 2011

org определяет, где рассматриваемая программа ОЖИДАЕТ быть загруженной в память. Не там, где он действительно загружен - это контролируется тем, кто выполняет загрузку, - но там, где он ожидает загрузки.

10 голосов
/ 15 ноября 2011

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

mov ax, 0x7c0 
mov ds, ax
...