2012-05-19 2 views
1

Почему NASM не компилируется в объектный файл с директивой org?Директива NASM 'org' с '-fobj'

org 0x7C00 
nop 
mov ax, ax 
nop 

Если я компилирую это с:

nasm -O0 -fobj temp.asm 

NASM дает мне ошибку по какой-либо причине:

temp.asm:1: error: parser: instruction expected 

ответ

2

В этом случае вместо org вы должны использовать resb:

; file: nasmOrg.asm 
; assemble: nasm -f obj nasmOrg.asm -o nasmOrg.obj 

SEGMENT _TEXT PUBLIC CLASS=CODE USE16 

;  resb 0x0100 ; reserve 0x0100 bytes for a .COM program 
     resb 0x7C00 ; reserve 0x7C00 bytes for a boot sector 
..start: 
nop 
mov ax, ax 
nop 

Это, как вы можете скомпилируйте различные части программы .COM в отдельные объектные файлы. Если вы используете TLINK в качестве линкера, следующий шаг будет:

tlink.exe /t nasmOrg.obj [any other object files], nasmOrg.bin

Обратите внимание, что если опустить запятую и следующее имя результирующего бинарного (nasmOrg.bin), или если вы задаете имя с. расширение COM (например, nasmOrg.com), TLINK откажет связать, это будет что-то вроде:

Error: Cannot generate COM file : invalid initial entry point address

И вам придется изменить 0x7C00 на 0x0100, чтобы сделать программу .COM.

2

Использование -obj опции будет выводить собранный файл в Object Module Format. Использование директивы org поддерживается только в двоичном формате accoring to the manual.

Причина в том, что компоновщик должен обрабатывать перемещения для вас.

Если вы хотите создать свободное пространство, может быть times директива поможет вам:

times 10 db 0 ; 10 zero bytes 
+0

В википедии он говорит: «В файле нет смещений файлов (например, указателя на таблицу символов), поэтому компоновщик должен анализировать все записи (записи) объектного файла, чтобы получить информацию об этом». Это то, о чем вы говорите? –

+0

@ColeJohnson No. Это предложение о создании исполняемых файлов. Вероятно, вы хотите опустить параметр '-fobj', если хотите создать загрузчик (или посмотреть другой ответ). – copy