Я нахожусь в ситуации, когда мне нужно сохранить указатель на следующую инструкцию в ассемблерном коде Thumb-2. Инструкции Thumb-2 могут быть 16- и 32-битными и, таким образом, выравниваются по полуслову. Когда я использую PC
в качестве исходного операнда в add
, я фактически считываю выровненный по словам счетчик программ плюс 4 (то есть либо на 2, либо на 4 больше, чем текущая инструкция). Поэтому мне нужно добавить либо 0, либо 2 к текущему программному счетчику, чтобы получить адрес следующей инструкции.
Теперь я мог бы использовать .align
, чтобы получить эту инструкцию на границе слова, и в этом случае я могу просто добавить 0. Однако я хотел бы не использовать nop
без необходимости.
Возможно ли что-то вроде следующего?
.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, раздел Выражения и операторы ассемблера (5.9), но, возможно, мне следует поискать в другом месте.
add
уже являются 32-битными, и я не вижу способа сделать их 16-битными - и в ARM это все возможные варианты. Утром я посмотрю, как выглядит исходный кодas
, или, возможно, напишу письмо по списку binutils. - person   schedule 20.09.2016mov
? (Для защиты от поломки в будущем поставьте перед ним.p2align 2
, чтобы вы получили NOP, если кто-то изменит код между местом, где вы создаете выравнивание, и тем, где оно необходимо. Так что на данный момент его не нужно будет заполнять, но в будущем вы получите заполнение вместо поломки. Или используйте эту условную вещь, чтобы создать ошибку времени сборки, если требование нарушено.) - person Peter Cordes   schedule 20.09.2016mov
не сработает. Извините, возможно, я должен был написать это в вопросе. В любом случае добавление.align
уже добавит не более одногоnop
. Дело в том, что в тех случаях, когдаadd
действительно необходим (нельзя заменитьmov
), немедленная добавленная стоимость должна быть разной в зависимости от выравнивания. - person   schedule 20.09.2016mov.w r12, pc
? Обратите внимание, что предпосылка вопроса неверна, так как это не когда я читаю ПК, который дает выровненное по словам значение, а когда я использую ПК в качестве операнда в непосредственной инструкцииadd
/sub
(которые, по устаревшим причинам, на самом деле псевдонимыadr
). - person Notlikethat   schedule 20.09.2016mov.n r6, pc; add.n r6, #offset
по-прежнему будет 4 байта. - person Notlikethat   schedule 20.09.2016