2013-03-12 5 views
1

Я пишу какой-то голый металлический код для малины Pi и получаю неожиданное предупреждение от ассемблера ARM Cross на Windows. Инструкции, вызывающие предупреждения были:Неожиданное предупреждение о GNU ARM Assembler

stmdb sp!,{r0-r14}^ 

и

ldmia sp!,{r0-r14}^ 

Это предупреждение:

Предупреждение: обратна запись базового регистра НЕПРЕДСКАЗУЕМЫ

Я могу сортировать понимайте это, хотя модификатор '^' сообщает процессору хранить e копий регистров пользователя, он не знает, в каком режиме будет работать процессор, когда будет выполняться инструкция, и, похоже, не существует способа рассказать об этом. Я был немного больше озабочен, чтобы получить такое же предупреждение для:

stmdb sp!,{r0-r9,sl,fp,ip,lr}^ 

и:

ldmia sp!,{r0-r9,sl,fp,ip,lr}^ 

несмотря на то, что я явно не хранящего ANY зр регистр.

Мое беспокойство состоит в том, что, хотя я использовал много ассемблерного кодирования около 15 лет назад, код ARM является новым для меня, и я могу что-то недопонимать! Кроме того, если я могу смело игнорировать предупреждения, есть ли способ их подавить?

ответ

1

Термин "обратна запись" относится не к наличию или отсутствию SP в списке регистров, но на символ !, что означает, что инструкция должна обновить значение SP с адресом адреса области передачи. Значение базового регистра (SP) будет использоваться из текущего режима, а не для пользовательского режима, поэтому вы можете загрузить или сохранить значение SP в пользовательском режиме в свой стек. От ARM ARM B9.3.6 LDM (регистры пользователя):

В режиме PL1 кроме режима системы, загрузки несколько (регистры пользователя) нагрузки несколько регистров в режиме пользователя из последовательных ячеек памяти , используя адрес из базовый регистр. Загруженные регистры не могут содержать . Процессор обычно считывает значение базового регистра, , используя текущий режим, чтобы определить правильную банковскую версию регистра . Эта команда не может выполнить обратную запись в базовый регистр.

Диаграмма кодирования отражает это, указав бит 21 (W, writeback) как «(0)», что означает, что результат непредсказуем, если бит не равен 0.

Таким образом, решение состоит в том, чтобы не указывать ! и уменьшать или увеличивать SP вручную, если это необходимо.

+0

А, я пропустил этот бит в Справочном руководстве по архитектуре, хотя я должен признать, что для большей части моей информации я использую техническое справочное руководство ARM1176JZF-S, и это, похоже, не так подробно! Все объяснения предупреждения, которое я нашел с помощью Google (не многие!), Говорят, что предупреждение вызвано тем, что вы выполняете обратную запись в регистр, который загружается/хранится. Я понимаю, что обратная связь относится к обновлению базового регистра. – williamssimonp

3

Справочное руководство по архитектуре ARM сообщает, что запись в LDM/SMT пользовательских регистров не допускается. Это разрешено в случае возврата исключения, где pc находится в списке регистра.

LDM (Обратно исключение)

LDM{<amode>}<c> <Rn>{!},<registers_with_pc>^ 

LDM (пользователь регистрируется)

LDM{<amode>}<c> <Rn>,<registers_without_pc>^ 
+0

Итак, чтобы вернуться из исключения с использованием первой формы, вам необходимо выполнить сохранение регистров без обратной записи, обновить указатель стека, а затем вы можете использовать версию с обратной записью для возврата! Ограничение кажется немного странным, но я уверен, что для этого есть причина. По крайней мере, он позволяет выполнить обратную запись, если pc загружается, иначе это было бы бесполезно! – williamssimonp