Ответ 1
0000: 7C00 не эквивалентен 7C00: 0000. Часть сегмента подсчитывается в параграфах, а не в байтах. Вместо этого попробуйте:
mov ax, 0x7c0
mov ds, ax
Я следую этому руководству в качестве первого набега на разработку загрузчика/ОС для 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
Когда я запускаю первый пример, моя строка отображается правильно. Второй пример не работает.
Указатели на соответствующую документацию также будут высоко оценены, если проблема является концептуальной проблемой с моей стороны.
0000: 7C00 не эквивалентен 7C00: 0000. Часть сегмента подсчитывается в параграфах, а не в байтах. Вместо этого попробуйте:
mov ax, 0x7c0
mov ds, ax
org
определяет, где программа, о которой идет речь, EXPECTS загружается в память. Не там, где он действительно загружен - это контролируется тем, кто выполняет загрузку, но там, где он ожидает загрузки.