Пытаюсь понять сборочную линию ARM7

#assembly #arm7 #program-counter

#сборка #arm7 #программа-счетчик

Вопрос:

У меня есть эта сборочная линия :

 01000AD8: 979FF103      LDRLS    PC,[PC,R3,LSL #2]
  

С PC = 0x01000AD8

R3 = 0x00000008

CDPS = 800000D3 (так что C = 0, Z = 0)

Когда я выполняю эту строку, новое значение для PC должно быть (если я правильно понимаю LDRLS *)

PC = 0x01000AD8 0x00000008 * 4 = 0x01000AF8

Но вместо этого результат равен 0x00000BAC

Почему?

Может быть, я мог бы добавить, что MMU активируется при выполнении кода этой строки.

PS * В своих исследованиях я не нашел значения «LS» в LDRLS…

РЕДАКТИРОВАТЬ: добавлено значение CPSR

Комментарии:

1. ok для LS означает «беззнаковый нижний или тот же»

Ответ №1:

Первая проблема: страница A2-11:

При выполнении инструкции ARM компьютер считывает адрес текущей инструкции плюс 8.

Вы забыли добавить 8 на ПК.

Вторая проблема: страница A8-124:

Регистр загрузки вычисляет адрес из значения базового регистра и значения регистра смещения, загружает слово из памяти и записывает его в регистр.

Вы забыли шаг «загрузка слова из памяти».

(Номера страниц взяты из справочного руководства по архитектуре ARM для ARMv7-A. Номера ваших страниц могут отличаться.)

Комментарии:

1. ARM7 и ARMv7 сильно отличаются, ARMv7 не поддерживает 32-разрядные инструкции ARM. Кодировки ARMv7 (thumb / thumb2) в основном начинаются с 0x5, один начинается с 0x9, но за ним не может следовать 7 (0x97), и в любом случае он основан на SP, а не на ПК. LDR ARMv7 с этой формой начинается с 0xF8, а не 0xF1, так что это тоже не соответствует, и в нем нет места для кода условия. Так что это очень похоже на ARM7, а не на ARMv7.

2. Книга ARMv7-A охватывает как ARM classic, так и Thumb. Во всяком случае, OP должен иметь возможность просматривать подробные инструкции в соответствующем справочнике.

3. Да, извините, мой плохой, ARMv7-A как в Cortex-A. ARMv7-M, как и в Cortex-M, является только thumb / thumb2.

4. Я подтверждаю, что использую ARM7, а не ARMv7

Ответ №2:

КОМПЬЮТЕР всегда опережает две инструкции при использовании в качестве операнда, поэтому добавьте 8, если режим arm и 4, если режим thumb.

LDR — это инструкция: загрузить регистр. LS означает, что если lower или тот же LDREQ будет загружен, если он равен. Найдите «коды условий» в arm arm. Четыре верхних бита в инструкции 0x9 в данном случае являются LS, выполняются, если они ниже или одинаковы. Большинство инструкций имеют эти биты как 0xE, что означает всегда выполняться.

Все инструкции ARM используют верхние четыре бита в качестве кода условия, в основном по инструкции за инструкцией, которую вы можете выполнить условно, в этом случае LDR будет выполняться только в том случае, если флаг C установлен или установлен флаг Z. ЕСЛИ он выполняет загрузку, то это адрес, который вы вычисляли, плюс 8, потому что ввод ПК для вычисления адреса на две инструкции опережает начальный адрес, тогда результатом является загрузка с этого адреса на ПК, так что в основном это условная ветвь к вычисляемому адресу. Таблица ветвей. Обычно у вас будет таблица ветвлений с [ra, rb, lsl # 2], где ra — базовый адрес таблицы ветвлений, rb — индекс, основанный на индексе в этой таблице (номер элемента 0 или 1 или 2), а lsl 2 превращает индекс в адрес слова, поскольку их 32битовые инструкции. таблица содержит адреса мест назначения ветвей. ПК, используемый в качестве базового, означает, что следующая инструкция после этой инструкции, вероятно, является безусловной ветвью к условному случаю, если не LS, затем переходит в таблицу, инструкция после этого — случай R3 = 0, следующий за этим случай R3 = 1 и так далее. если компилятор знал, что R3 никогда не может быть меньше некоторого числа, то он, возможно, использовал больше инструкций после этой, прежде чем перемещаться по таблице.

В любом случае посмотрите на ARM ARM (теперь называется что-то вроде ARMv5 ARM ARM или legacy ARM ARM или что-то в этом роде). найдите «поле условия» или «коды условий», чтобы найти таблицу. Мнемоническое расширение привязывается к инструкции ADD, если установлен флаг z, является ADDEQ . Вычесть, если установлен флаг N, является SUBMI и т. Д.