armv7: stmb не берет ПК - PullRequest
       12

armv7: stmb не берет ПК

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

У меня есть библиотека, написанная на C, смешанная с какой-то сборкой для ARM. Раньше он был скомпилирован для armv6. Сейчас я пытаюсь обновить его до armv7. Однако есть обработчик прерываний с инструкцией stmdb sp!, {pc}, которая не разрешена в armv7. Что будет эквивалентной инструкцией на armv7? Я пытался str r15, [sp, #-4]!, но это не работает.

Ответы [ 2 ]

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

Существуют определенные ограничения относительно использования PC в списке регистров для команд PUSH и POP, в зависимости от режима работы, см .:

Справочник по набору инструкций ARM, PUSH / POP

В частности, в Thumb [2] - это нет push {pc} операция (то же самое, что сказать, что операции stmfd sp!, {pc} нет - push сопоставлен с stmfd sp!).

Так что, если вы компилируете свой код ядра (зачем вам нужен / 10 * * обработчик прерываний , если это не код ядра), проверьтесобираете ли вы ядро ​​Thumb-2.

При этом вы говорите, что столкнулись с инструкцией stmfd sp!,{pc} - вы уверены, что это не опечатка?stmfd sp!,{lr} (и его брат ldmfd sp!, {pc} - здесь PC присутствует) является нормальным / полностью законным и часто требуется / встречается как в режиме ARM, так и в режиме Thumb-2.Но что на самом деле является целью сохранения программного счетчика в стек?Что можно сделать с этим, чего нельзя было бы достичь другими способами?

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

"armv7" довольно универсален. Какой чип вы используете? Вы компилируете для ARMv7-M? Попробуйте PUSH {PC} тогда. Хотя я ожидаю, что это не единственная проблема, с которой вы столкнетесь. Я думаю, что вы должны опубликовать некоторые фрагменты и более подробно описать, в какую конкретно среду вы переносите.

...