如何访问进入管理员模式时保存的用户R13和R14?我使用的是 ARM7TDMI。

IE。我不想访问管理程序 R14,它现在包含用户模式的返回地址,而是想要用户模式链接寄存器的值。这是我正在编写的调试器的一部分。

这些寄存器有特殊的别名吗?

谢谢

有帮助吗?

解决方案

我将描述您的具体问题的答案,但相同的方法也适用于其他模式。

您需要通过将 CPSR 中的模式位更改为系统模式来更改处理器模式。这将使您能够访问用户模式的 SP/LR(R13 和 R14)。请记住,系统模式是特权模式,但其 R13 和 R14 与用户模式的 R13 和 R14 相同。

进入系统模式后,读取 R13 和 R14 并将它们放在您想要的位置。然后只需将模式位切换回之前的模式(我相信在您的示例中是主管模式),您就可以开始了。

请注意,我们没有从超级用户模式切换到用户模式。 如果您从主管切换为用户, 你无法返回到管理员模式. 。(否则就无法防止用户代码升级权限)。这就是我们使用系统模式的原因——系统模式是有特权的,但寄存器与用户模式相同。

您可以通过操作 CPSR 中的模式位随意在任何特权模式之间切换。我认为它们是低 5 位?我在路上,手边没有这些信息。否则我会为您提供上面描述的汇编代码。实际上,如果您想在胸前放一些头发,请采用我上面给您的内容,实施它,测试它,然后将其发布回此处。:-D

(我应该为“一般情况”添加一件事(您的情况非常具体)——您可以检查 SPSR 以查看“您来自哪里”——并使用它来确定您需要切换到哪种模式。)

顺便说一句,我最近刚刚为我的一位客户做了这个......世界很小,我猜。

其他提示

我发现了一个更好的办法: -

当做一个STM,如果R15是不操作数之一然后^可以访问用户模式寄存器。然而,自增似乎并不在指令中工作,并且NOP是继要求,如果你要访问的寄存器组。

的东西
stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top