2016-09-19 6 views
1

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

+0

Использование длинной, но эквивалентной команды вместо заполнения с помощью NOP - это известный метод на x86 (где часто можно использовать различную кодировку для точно идентичной команды), но редко используется, потому что сборщики не будут делать это за вас. Надеюсь, кто-то знает или хочет реализовать что-то вроде этого в ассемблере с открытым исходным кодом, потому что это пустая идея для жизнеспособного синтаксиса такого рода вещей. –

+0

@PeterCordes Я не думаю, что есть более длинная (или более короткая) эквивалентная инструкция, эти 'add' уже 32 бита, и я не вижу способа сделать их 16 бит - и на ARM это все варианты Вы получаете. Утром я увижу, как выглядит исходный код 'as', или, возможно, напишите электронное письмо в списке binutils. – Keelan

+0

Можете ли вы что-то сделать с инструкцией где-нибудь * до * добавить, так что она всегда выровнена так, как вы хотите для 'mov'? (Чтобы безопасно против будущего поломки, поставьте перед ним '.p2align 2', так что вы получите NOP, если кто-то изменит код между тем, где вы создаете выравнивание, и где это необходимо. Поэтому на данный момент его не нужно будет прокладывать , но в будущем вы получите дополнение вместо поломки. Или используйте эту условную вещь для создания ошибки времени сборки, если это требование нарушено.) –

ответ

2

Вместо faffing о попытке работать с точки зрения адресов и смещений, просто указать вещи в терминах инструкций, то есть с ярлыком:

adr r12, 1f 
    ... 
1: <instruction of interest> 

ассемблер и компоновщик знает, что делать.

+0

Я думаю, это самый простой, и я должен был это увидеть, спасибо. – Keelan

 Смежные вопросы

  • Нет связанных вопросов^_^