2012-05-19 27 views
1

为什么NA​​SM不会用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更改为0100做一个.COM程序。

2

使用-obj选项将输出Object Module Format组装文件。使用org指令仅在二进制格式accoring to the manual中受支持。

原因是链接器应该为您处理重定位。

如果你想创建的自由空间,也许times指令将帮助您:

times 10 db 0 ; 10 zero bytes 
+0

在维基百科上,它说:“文件中没有文件偏移量(如指向符号表的指针),因此链接器必须解析对象文件的所有条目(记录)以获取有关它的信息。”那是你在说什么? –

+0

@ColeJohnson号这句话是关于创建可执行文件。如果你想创建一个引导程序(或者看到其他的响应),你可能想省略'-fobj'选项。 – copy