Пытаясь понять конвейер ARM7 - PullRequest
2 голосов
/ 20 октября 2011

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

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

С ПК = 0x01000AD8

R3 = 0x00000008

CDPS = 800000D3 (т. Е. C = 0, Z= 0)

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

ПК = 0x01000AD8 + 0x00000008 * 4 = 0x01000AF8

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

Почему?

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

PS * Я не нашелзначение "LS" в LDRLS в моем исследовании ...

EDIT: добавлено значение CPSR

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

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

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

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

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

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

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

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

2 голосов
/ 20 октября 2011

ПК всегда на две инструкции впереди, когда используется в качестве операнда, поэтому добавьте 8 в режиме охраны и 4 в режиме большого пальца.

LDR - это инструкция: регистр загрузки. LS означает, будет ли нагрузка более низкой или такой же LDREQ, если она равна. Ищите «коды состояния» в кронштейне. Верхние четыре бита в инструкции 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 или устаревшая ARM ARM или что-то в этом роде). найдите «поле условия» или «коды условия», чтобы найти таблицу. Мнемоническое расширение прикрепляется к инструкции ADD, если установлен флаг z, являющийся ADDEQ. Вычтите, если установлен флаг N SUBMI и т. Д.

...