Pregunta

¿Cómo accedo al usuario R13 y R14 que se guardan cuando se ingresa al modo supervisor? Estoy usando un ARM7TDMI.

I.E. No quiero acceder al supervisor R14 que ahora contiene la dirección de retorno al modo de usuario, en cambio quiero el valor del registro de enlace del modo de usuario. Esto es parte de un depurador que estoy escribiendo.

¿Hay alias especiales para estos registros?

Gracias

¿Fue útil?

Solución

Describiré la respuesta a su pregunta específica, pero el mismo enfoque se aplica también a otros modos.

Deberá cambiar el modo del procesador cambiando los bits de modo en el CPSR al modo del sistema. Esto le dará acceso al SP / LR del modo de usuario (R13 & amp; R14). Recuerde que el modo del sistema es privilegiado, pero sus R13 y R14 son los mismos que los del modo de usuario R13 y R14.

Una vez que esté en modo de sistema, lea R13 y R14 y colóquelos donde desee. Luego simplemente cambie los bits de modo a su modo anterior (creo que ese era el modo supervisor en su ejemplo) y estará listo para comenzar.

Tenga en cuenta que no cambiamos del modo supervisor al modo de usuario. Si cambió de supervisor a usuario, no podría volver al modo supervisor . (De lo contrario, no habría protección contra el privilegio de aumento de código de usuario). Es por eso que utilizamos el modo del sistema: el modo del sistema es privilegiado, pero los registros son los mismos que los del modo de usuario.

Puede cambiar entre cualquiera de los modos privilegiados a voluntad manipulando los bits de modo en el CPSR. Creo que son los 5 bits inferiores? Estoy en el camino & amp; no tengo la información a mi alcance. De lo contrario, le habría proporcionado el código de ensamblaje para lo que he descrito anteriormente. En realidad, si quieres ponerte algo de vello en el pecho, toma lo que te he dado arriba, impleméntalo, pruébalo y publícalo aquí. :-D

(Una cosa que debo agregar para el " caso general " (el suyo es muy específico): puede examinar el SPSR para ver de dónde viene " y usarlo para determinar qué modo necesita cambiar a.)

Por cierto, acabo de hacer esto recientemente para uno de mis clientes ... pequeño mundo, supongo.

Otros consejos

He descubierto una mejor manera: -

Al hacer un STM, si r15 no es uno de los operandos, entonces ^ da acceso a los registros de modo de usuario. Sin embargo, el aumento automático no parece funcionar dentro de las instrucciones, y luego se requiere un nop si desea acceder al banco de registro.

Algo así

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top