Получение размера раздела с помощью nasm -f bin - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь скомпилировать это с помощью 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 фактическим заголовком формата файла, который не содержит инструкций по сборке.)
...