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