Почему 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 шт):

Автор решения: Roman Konoval

LR (Link Register) содержит адрес возврата из процедуры. При входе его сохраняем на стеке (т.е. в оперативной памяти) с помощью STM. В конце процедуры нужно произвести возврат. Это делается путем считывания сохраненного значения LR в PC т.е. Program Counter.

Запись значения в PC эквивалентна безусловному переходу. Т.е. это и есть возврат по адресу, который изначально хранился в LR при входе в main.

Все время пока выполняется функция main регистром LR можно пользоваться, т.к. значение из него уже сохранилось на стеке. Именно для этого и нужна инструкция STM в самом начале, чтобы не потерять значение адреса возврата и освободить регистры (а данном случае R4 и LR) для использования внутри main.

→ Ссылка