Ich werde die Antwort auf Ihre Frage beschreiben, aber der gleiche Ansatz gilt auch für andere Modi.
Sie müssen den Prozessormodus ändern, indem Sie die Modusbits im CPSR in den Systemmodus ändern. Dadurch erhalten Sie Zugriff auf den SP/LR des Benutzermodus (R13 & R14). Denken Sie daran, dass der Systemmodus privilegiert ist, aber R13 und R14 sind identisch mit den Benutzermodi R13 und R14.
Sobald Sie im Systemmodus sind, lesen Sie R13 und R14 und legen Sie sie wo Sie wollen. Dann schalte einfach die Modus-Bits zurück in deinen vorherigen Modus (ich glaube, das war in deinem Beispiel der Supervisor-Modus) und du kannst loslegen.
Beachten Sie, dass wir nicht vom Supervisor- in den Benutzermodus gewechselt haben. Wenn Sie vom Supervisor zum Benutzer wechseln, , können Sie nicht zum Supervisor-Modus zurückkehren. (Sonst gäbe es keinen Schutz vor den Zugriffsrechten für den Benutzercode). Aus diesem Grund haben wir den Systemmodus verwendet - der Systemmodus ist privilegiert, aber die Register sind identisch mit dem Benutzermodus.
Sie können beliebig zwischen beliebigen privilegierten Modi wechseln, indem Sie die Modusbits im CPSR manipulieren. Ich denke, dass sie die unteren 5 Bits sind? Ich bin auf der Straße & habe nicht die Informationen an meinen Fingerspitzen. Sonst hätte ich Ihnen den Assembler-Code für das, was ich oben beschrieben habe, zur Verfügung gestellt. Eigentlich, wenn du ein paar Haare auf deine Brust legen willst, nimm das, was ich dir oben gegeben habe, implementiere es, teste es und poste es hier zurück. :-D
(Eine Sache, die ich für den "allgemeinen Fall" hinzufügen sollte (Ihr ist sehr spezifisch) - Sie können den SPSR untersuchen, um zu sehen, "wo Sie herkamen" - und verwenden, um zu bestimmen, welcher Modus Sie müssen zu wechseln.)
Übrigens habe ich gerade dies kürzlich für einen meiner Kunden .... kleine Welt, denke ich.
Wow Dank. Ich habe nie bemerkt, dass Benutzermodus und Systemmodus dieselben Register teilen! Ich werde den Code knacken. Ich fürchte, ich kann es hier nicht posten, weil es für ein Stück courswork ist - aber ich denke, dass Sie die Prinzipien sehr gut beschrieben haben, was wichtiger ist. – Tarski
Gern geschehen. Viel Glück bei der Kursarbeit. – Dan
Hi Dan, wenn ARM im Hyp-Modus ist und den R13/r14 von PL1 NS = 1 Modus (SVC) lesen muss, wie würde es gemacht werden? – mSO