assembly 使用nasm -f bin获取节大小

qv7cva1a  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(154)

我试着用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内容,它不包含汇编指令。)
dsekswqp

dsekswqp1#

看起来我想要的东西在NASM中是不可能的,因为NASM不能使用来自多个部分的标签进行算术运算。作为一种解决方法,在将标签text.end添加到_TEXT部分的末尾后,可以执行以下操作:

dw TEXT.end-section.TEXT.start

相关问题