Опишу ответ на Ваш вопрос, но тот же подход применим и к другим режимам, а также.
Вам нужно будет изменить режим процессора, изменив бит режима в CPSR в системном режиме. Это даст вам доступ к SP/LR пользовательского режима (R13 & R14). Помните, что системный режим имеет привилегию, но его R13 и R14 такие же, как у R13 и R14 пользовательского режима.
Как только вы находитесь в системном режиме, прочитайте R13 и R14 и поместите их туда, где хотите. Затем просто переключите бит режима обратно в предыдущий режим (я считаю, что это был режим супервизора в вашем примере), и вам хорошо идти.
Обратите внимание, что мы не переключились с супервизора в пользовательский режим. Если вы переключились с супервизора на пользователя, , вы не смогли вернуться в режим супервизора. (В противном случае не будет защиты от повышения привилегий кода пользователя). Вот почему мы использовали системный режим - системный режим имеет привилегию, но регистры совпадают с пользовательским.
Вы можете переключаться между любыми привилегированными режимами по желанию, манипулируя битами режима в CPSR. Я думаю, что они младшие 5 бит? Я в дороге & не имею информацию у меня под рукой. В противном случае я бы предоставил вам код сборки для того, что я описал выше. На самом деле, если вы хотите надеть немного волос на грудь, возьмите то, что я вам дал, реализуйте, протестируйте и опубликуйте здесь. : -D
(Я хочу добавить для «общего случая» (ваш очень конкретный) - вы можете изучить SPSR, чтобы увидеть «откуда вы пришли» - и использовать это, чтобы определить, какой режим вы нужно переключиться на.)
Кстати, я только что сделал это недавно для одного из моих клиентов .... маленький мир, я думаю.
Вау спасибо. Я никогда не замечал, что пользовательский режим и системный режим разделяют одни и те же регистры! Я буду взломать код. Боюсь, я не могу опубликовать его здесь, потому что это для куски курса, но я думаю, что вы описали принципы очень хорошо, что более важно. – Tarski 2008-11-28 12:59:37
Добро пожаловать. Удачи в курсовой работе. – Dan 2008-11-28 18:16:53