Директивы GAS не могут прочитать байты, которые уже были переданы в выходной файл.
Если вам нужно время сборки вычисление чего-либо, я думаю, вы могли бы сделать это с a GAS .macro
, который использовал свой аргумент в выражении времени сборки, обновляющем переменную ассемблера, и в качестве операнда для .byte
.
Но вам нужно сделать это в выражениях, которые работают как числа, что, вероятно, исключило бы удобные .ascii
строковые литералы.
В этом случае, вероятно, больше проблем, чем стоит преобразовать в используя макрос типа
byte_cksum_accum 0xce,0xed,0x66,0x66,0xcc,0x0d,0x00, ...
.
Такой макрос может использовать .set cksum, cksum + ~\1
или что-то подобное, а также .byte \1
. Зацикливание на нескольких макро-аргументах GAS выполняется путем записи рекурсивного .macro
. Поэтому я думаю, что это возможно. GAS также имеет синтаксис .altmacro
, который позволяет i = i + 1
. Я сам не очень часто использовал макросы GAS.
Лучшая альтернатива: используйте C программу + правила сборки + .incbin
- Пусть ваш источник использует
.incbin "checksum_file.bin
директива - ... которую программа C пишет после прочтения вашего
.o
- В Makefile, правило сборки для этого
.o
собирается / генерируется внешняя / повторная сборка контрольной суммы, включающая правильную контрольную сумму. (коснитесь или обрежьте или удалите checksum_file.bin
перед сборкой в первый раз, что наиболее удобно, чтобы убедиться, что он все еще собирается, и при необходимости не содержит устаревший байт контрольной суммы.)
Еще лучшая альтернатива?
- Ваша программа C выводит плоский двоичный файл с данными и контрольной суммой. Итак, заголовок байты все еще присутствуют в одном месте вашего источника, в инициализаторе
uint8_t header[] = {...}
в вашей программе C. - Используйте
.incbin
в .S
, чтобы включить его. - Используйте правило сборки, чтобы убедиться, что cksummed-header.bin является входной зависимостью для построения
.S
Или напишите C программу, которая изменяет двоичный файл
- Считывает заголовок, обновляет заполнитель
.byte 0
в двоичном файле. - Сохраняет данные заголовка вместе с остальной частью исходного кода asm
- C программы не нужно перекомпилировать для разных тележек.