#assembly #linker #arm64
#собрание #линкер #arm64
Вопрос:
В ассемблерном коде этот код
.data myval : .long 0x11111111
помещает переменную myval
в .data
раздел. Поэтому я хотел определить свой собственный раздел по определенному адресу в SDRAM и использовать его в ассемблерном коде для записи некоторых данных для отладки. Я добавил свой раздел в скрипт компоновщика следующим образом (это первый раздел, выводимый в .sdram, поэтому я знаю начальный адрес).
.mydebug : { . = ALIGN(8); KEEP(*(.__mydebug)); } gt;.sdram
и использовал его в ассемблерном коде вот так.
.global ... skip ... mov x6, #0x70 ldr x7, =myval str x6, [x7] ... skip ... .__mydebug myval: .long 0x11111111
Но компилятор жалуется
Error: unknown pseudo-op: `.__mydebug'
Как я могу это сделать?
Ответ №1:
Используйте .section
директиву.
.section .__mydebug myval: .long 0x11111111
Одно нужно знать: пользовательские разделы не должны иметь названия, начинающегося с точки. Такие имена зарезервированы для разделов, определенных ABI. Так что, возможно, назовите этот раздел чем-то вроде mydebug
. Хотя это противоречит спецификации ELF, также часто используется такое имя .data.mydebug
для раздела, который похож на .data
раздел, но должен быть отделен от обычных данных.
Комментарии:
1. Nit: обычно это хорошая идея, чтобы начать раздел с
align
/balign
директивой, чтобы убедиться, что требования к выравниванию данных выполнены