为什么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
为什么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
在这种情况下,而不是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程序。
使用-obj
选项将输出Object Module Format组装文件。使用org
指令仅在二进制格式accoring to the manual中受支持。
原因是链接器应该为您处理重定位。
如果你想创建的自由空间,也许times
指令将帮助您:
times 10 db 0 ; 10 zero bytes
在维基百科上,它说:“文件中没有文件偏移量(如指向符号表的指针),因此链接器必须解析对象文件的所有条目(记录)以获取有关它的信息。”那是你在说什么? –
@ColeJohnson号这句话是关于创建可执行文件。如果你想创建一个引导程序(或者看到其他的响应),你可能想省略'-fobj'选项。 – copy