Я в ситуации, когда мне нужно сохранить указатель на следующую команду в коде сборки Thumb-2. Команды Thumb-2 могут быть 16- и 32-битными, и, таким образом, выравниваются по полуслову. Когда я использую PC
в качестве исходного операнда в add
, я фактически читаю программный счетчик с выравниванием слов плюс 4 (то есть на 2 или 4 больше, чем текущая команда). Поэтому мне нужно добавить 0 или 2 к текущему счетчику программ, чтобы получить следующий адрес инструкции.Получить выравнивание в предварительной обработке сборки ARM
Теперь я мог бы использовать .align
, чтобы получить эту инструкцию на границе слова, и в этом случае я могу просто добавить 0. Однако я бы не хотел использовать nop
s, если не нужно.
Возможно ли следующее:
.if alignment_of_next_instruction % 4 == 2
add r12,pc,#2
.else
add r12,pc,#0 @ just an example, mov would be better
.endif
str r12,[sp,#-4]!
Причина я не могу использовать nop
в том, что в некоторых случаях мне не нужно, чтобы получить адрес следующей команды, а команда после этого, или даже один дальше. В этих случаях необходим add
, но нужно ли добавить 10 или 12 (например), зависит от выравнивания.
Если это не ясно, вот что .align
будет выглядеть с моим намечаемым синтаксисом:
.if alignment_of_next_instruction % 4 == 2
nop
.endif
Я ничего не могу найти в справочном руководстве ARM SDK, раздел Assembler выражение и операторы (5.9), но, возможно, мне следует искать в другом месте.
Использование длинной, но эквивалентной команды вместо заполнения с помощью NOP - это известный метод на x86 (где часто можно использовать различную кодировку для точно идентичной команды), но редко используется, потому что сборщики не будут делать это за вас. Надеюсь, кто-то знает или хочет реализовать что-то вроде этого в ассемблере с открытым исходным кодом, потому что это пустая идея для жизнеспособного синтаксиса такого рода вещей. –
@PeterCordes Я не думаю, что есть более длинная (или более короткая) эквивалентная инструкция, эти 'add' уже 32 бита, и я не вижу способа сделать их 16 бит - и на ARM это все варианты Вы получаете. Утром я увижу, как выглядит исходный код 'as', или, возможно, напишите электронное письмо в списке binutils. – Keelan
Можете ли вы что-то сделать с инструкцией где-нибудь * до * добавить, так что она всегда выровнена так, как вы хотите для 'mov'? (Чтобы безопасно против будущего поломки, поставьте перед ним '.p2align 2', так что вы получите NOP, если кто-то изменит код между тем, где вы создаете выравнивание, и где это необходимо. Поэтому на данный момент его не нужно будет прокладывать , но в будущем вы получите дополнение вместо поломки. Или используйте эту условную вещь для создания ошибки времени сборки, если это требование нарушено.) –