Frage

Wie kann ich den Benutzer R13 und R14, die gespeichert werden, wenn Supervisor-Modus eingegeben wird? Ich bin mit einem ARM7TDMI.

d. Ich will nicht Supervisor R14 für den Zugriff auf der nun die Rücksprungadresse in dem Benutzermodus enthält, will stattdessen den Wert des Verknüpfungsregisters des Benutzermodus. Dies ist Teil eines Debuggers ich schreibe.

Gibt es spezielle Aliase für diese Register?

Danke

War es hilfreich?

Lösung

Ich werde die Antwort auf Ihre Frage beschreiben, aber der gleiche Ansatz gilt auch für andere Modi als auch.

Sie werden den Prozessormodus ändern müssen, indem sie die Modusbits im CPSR in den Systemmodus zu ändern. Dadurch erhalten Sie Zugriff auf den Benutzermodus SP / LR (R13 & R14). Denken Sie daran, dass das System-Modus ist privilegiert, aber seine R13 und R14 sind die gleichen wie Benutzer-Modus des R13 und R14.

Wenn Sie im Systemmodus sind, lesen R13 und R14 und sie setzen, wo Sie wollen. Dann schalten Sie einfach die Modus-Bits zurück zu Ihrer vorherigen Modus (ich glaube, dass Supervisor-Modus in Ihrem Beispiel war), und Sie sind gut zu gehen.

Hinweis, dass wir von Supervisor wechseln nicht in dem Benutzermodus. Wenn Sie von Supervisor Benutzern eingeschaltet, Sie nicht zurück zum Supervisor-Modus bekommen können . (Sonst gäbe es keinen Schutz von Benutzercode eskalierenden Privileg). Deshalb haben wir System-Modus verwendet -. Systemmodus ist privilegiert, aber die Register sind die gleichen wie User-Modus

Sie können durch Manipulation der Modusbits im CPSR nach Belieben zwischen einem der privilegierten Modi wechseln. Ich denke, dass sie die unteren 5 Bits sind? Ich bin auf der Straße und haben nicht die Informationen an den Fingerspitzen. Sonst würde ich mit dem Assembler-Code zur Verfügung gestellt Sie haben für das, was ich oben beschrieben habe. Eigentlich, wenn Sie ein paar Haare auf der Brust setzen wollen, nehmen Sie, was ich Ihnen oben gegeben haben, implementieren, testen und veröffentlichen es hier zurück. :-D

(Eine Sache, die ich für den „allgemeinen Fall“ hinzufügen soll (Sie ist sehr spezifisch) - Sie SPSR untersuchen können, um zu sehen „wo man herkommt“ - und das nutzen, um zu bestimmen, welchen Modus zu dem Sie wechseln müssen ).

By the way, ich habe gerade die kürzlich für einen meiner Kunden .... kleiner Welt, glaube ich.

Andere Tipps

Ich habe einen besseren Weg entdeckt: -

Wenn ein STM tun, wenn r15 nicht einer der Operanden ist dann ^ ermöglicht den Zugriff auf User-Mode-Register. Allerdings selbstinkrementierende scheint nicht in der Anweisung zu arbeiten, und ein nop erforderlich danach, wenn Sie die Registerbank zugreifen möchten.

So etwas wie

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top