1

为什么 NASM 不使用 org 指令编译成目标文件?

org 0x7C00
nop
mov ax, ax
nop

如果我编译这个:

nasm -O0 -fobj temp.asm

无论出于何种原因,NASM 都会给我一个错误:

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

2 回答 2

3

在这种情况下,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 [任何其他目标文件], nasmOrg.bin

请注意,如果您省略了生成的二进制文件 (nasmOrg.bin) 的逗号和以下名称,或者您指定了带有 .COM 扩展名的名称(例如 nasmOrg.com),TLINK 将拒绝链接,它会显示如下内容:

错误:无法生成 COM 文件:初始入口点地址无效

您必须将 0x7C00 更改为 0x0100 才能制作 .COM 程序。

于 2012-05-19T22:47:19.087 回答
2

使用该-obj选项将以Object Module Format输出组装文件。根据手册org,仅支持以二进制格式使用该指令。

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

如果您想创建可用空间,也许该times指令会帮助您:

times 10   db 0    ; 10 zero bytes
于 2012-05-19T22:22:46.447 回答