我试着用nasm -f bin -o bo.bin bo.nasm
编译这个:
bits 16
cpu 8086
org 0 ; Default.
section HEADER align=1
section _TEXT follows=HEADER align=1
section CONST follows=_TEXT align=1
section CONST2 follows=CONST align=1
section _DATA follows=CONST2 align=1
section _BSS follows=_DATA nobits align=1
section HEADER
mov si, section._TEXT.start
mov di, section.CONST.start
db 0xb9 ; mov cx, ...
; bo.nasm:17: error: operand 1: expression is not simple or relocatable
dw section.CONST.start-section._TEXT.start
section _TEXT
; --- End of header.
section _TEXT
db 'FOO/'
section _DATA
db 'BARR/'
section _TEXT
db 'FOOD/'
section _BSS
v1: resb 0x1000
v2: resb 2
我在dw
行得到这个错误:
bo.nasm:17: error: operand 1: expression is not simple or relocatable
在dw
行中,我想发出_TEXT部分的字节大小。section.CONST.start-section._TEXT.start
是一个实现细节,可以更改。(我也尝试使用.vstart
后缀而不是.start
,但没有帮助。我查看了nasm的源代码,但找不到它定义的任何其他标签。)
我需要一个解决方案:
- 使用
nasm -f bin
编译成功。不允许使用其他汇编器和其他输出格式。 - 不会修改
; --- End of header.
行下面的任何内容,例如不允许在db 'FOOD/'
之后添加标签。(这是因为我正在编写一个nasm %include库,要求用户添加标签会使它容易出错。 - 不会增加文件大小,例如不允许使用
mov cx, di
+sub cx, si
计算值,我需要现有dw
中的结果。(这是因为我将用实际的文件格式头替换HEADER内容,它不包含汇编指令。)
1条答案
按热度按时间dsekswqp1#
看起来我想要的东西在NASM中是不可能的,因为NASM不能使用来自多个部分的标签进行算术运算。作为一种解决方法,在将标签
text.end
添加到_TEXT
部分的末尾后,可以执行以下操作: