Почему STMFD и LDMFD работают с разными регистрами?
Инструкция STMFD сохранила в стеке R4 и LR, а восстанавливаются во время исполнения LDMFD регистры R4 и PC:
main
STMFD SP!, {R4,LR}
ADR R0, aHelloWorld
BL __2printf
.text:0000000C MOV R0, #0
LDMFD SP!, {R4,PC}
Компилятор: Keil Release 6/2013 (режим ARM)
Ответы (1 шт):
LR (Link Register) содержит адрес возврата из процедуры. При входе его сохраняем на стеке (т.е. в оперативной памяти) с помощью STM. В конце процедуры нужно произвести возврат. Это делается путем считывания сохраненного значения LR в PC т.е. Program Counter.
Запись значения в PC эквивалентна безусловному переходу. Т.е. это и есть возврат по адресу, который изначально хранился в LR при входе в main.
Все время пока выполняется функция main регистром LR можно пользоваться, т.к. значение из него уже сохранилось на стеке. Именно для этого и нужна инструкция STM в самом начале, чтобы не потерять значение адреса возврата и освободить регистры (а данном случае R4 и LR) для использования внутри main.