为什么 NASM 不使用 org 指令编译成目标文件?
org 0x7C00
nop
mov ax, ax
nop
如果我编译这个:
nasm -O0 -fobj temp.asm
无论出于何种原因,NASM 都会给我一个错误:
temp.asm:1: error: parser: instruction expected
为什么 NASM 不使用 org 指令编译成目标文件?
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 [任何其他目标文件], nasmOrg.bin
请注意,如果您省略了生成的二进制文件 (nasmOrg.bin) 的逗号和以下名称,或者您指定了带有 .COM 扩展名的名称(例如 nasmOrg.com),TLINK 将拒绝链接,它会显示如下内容:
错误:无法生成 COM 文件:初始入口点地址无效
您必须将 0x7C00 更改为 0x0100 才能制作 .COM 程序。
使用该-obj
选项将以Object Module Format输出组装文件。根据手册org
,仅支持以二进制格式使用该指令。
这样做的原因是链接器应该为您处理重定位。
如果您想创建可用空间,也许该times
指令会帮助您:
times 10 db 0 ; 10 zero bytes