Я опишу ответ на ваш конкретный вопрос, но тот же подход применим и к другим режимам.
Вам необходимо изменить режим процессора, изменив биты режима в CPSR на системный режим. Это даст вам доступ к SP / LR пользовательского режима (R13 и R14). Помните, что системный режим является привилегированным, но его R13 и R14 совпадают с R13 и R14 пользовательского режима.
Перейдя в системный режим, прочитайте R13 и R14 и поместите их в нужное место. Затем просто переключите биты режима обратно в предыдущий режим (я полагаю, это был режим супервизора в вашем примере), и все готово.
Обратите внимание, что мы не переключались с супервизора в режим пользователя. Если вы переключились с супервизора на пользователя, вы не могли вернуться в режим супервизора . (В противном случае не было бы защиты от повышения привилегий кода пользователя). Вот почему мы использовали системный режим - системный режим является привилегированным, но регистры такие же, как и в пользовательском режиме.
Вы можете переключаться между любыми привилегированными режимами по желанию, манипулируя битами режима в CPSR. Я думаю, что они младшие 5 бит? Я нахожусь в дороге и не имею информации в моих руках. В противном случае я бы предоставил вам код сборки для того, что я описал выше. На самом деле, если вы хотите нанести немного волос на грудь, возьмите то, что я вам дал выше, примените его, протестируйте и отправьте сюда. : -D
(Одна вещь, которую я должен добавить для «общего случая» (ваш очень конкретен) - вы можете изучить SPSR, чтобы увидеть «откуда вы пришли» - и использовать его, чтобы определить, в какой режим вам нужно переключиться .)
Кстати, я недавно сделал это для одного из моих клиентов ... я думаю, маленький мир.