При использовании нескольких магазинов и нагрузок ARM значения регистра всегда загружаются/сохраняются в порядке возрастания в памяти. Таким образом, при использовании нисходящего множественного хранилища регистры записываются в память назад. Ваша STMDA
инструкция эффективно распадается на следующие этапы:
- магазин
R7
на R0
- магазин
R6
на R0 - 4
- магазин
R5
на R0 - 8
- магазин
R4
в R0 - 12
- магазин
R3
на R0 - 16
- магазин
R2
на R0 - 20
- магазине
R1
на R0 - 24
- вычесть 28 из
R0
(из-за обратной записи - The !
).
Таким образом, чтобы ответить на ваши вопросы:
Значение R1
будет храниться в R0 - 24
. (Здесь я имею в виду значение R0
перед выполнением инструкции, а не после него Вы используете обратную запись. - !
- так после инструкции, R0
будут иметь 28 вычитают из него.)
R1
хранится в R0 - 24
, но, как объяснялось выше, R1
- это последний регистр для сохранения его значения в памяти. R7
хранится первым, а последующие магазины оттуда растут вниз в памяти.
Должен признаться, я не знаю никакой документации, которая поддерживает этот ответ. Кроме того, прошло какое-то время с тех пор, как я в последний раз занимался кодированием ARM. Тем не менее, я определенно помню, как интересно, как ARM хранит регистры в нисходящем многократном магазине. Я понял это, написав короткую программу, чтобы узнать.
+1 абсолютно правильный. Это поведение описано в справочных руководствах по архитектуре ARM. –
спасибо, ну, я думаю, что руководство определяет R0-24, поскольку start_address несколько неоднозначно, Этот start_address - это минимальный адрес памяти вместо первого сохраненного адреса. – wenlujon
Псевдокод, описывающий операцию команды, совершенно ясен и соответствует описанию Pourquoi. –