臂。从Supervisor模式访问用户R13和R14

时间:2008-11-27 21:53:46

标签: arm supervisor-mode

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

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

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

由于

2 个答案:

答案 0 :(得分:9)

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

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

进入系统模式后,请阅读R13和R14并将它们放在您想要的位置。然后只需将模式位切换回以前的模式(我相信在你的例子中是管理员模式),你就可以了。

请注意,我们没有从主管切换到用户模式。如果您从主管切换到用户,您无法返回主管模式。 (否则将无法保护用户代码升级权限)。这就是我们使用系统模式的原因 - 系统模式具有特权,但寄存器与用户模式相同。

您可以通过操作CPSR中的模式位来随意切换任何特权模式。我认为他们是低5位?我在路上&我的指尖没有信息。否则我会为你提供我上面所描述的汇编代码。实际上,如果你想把一些头发放在胸前,拿走我上面给你的东西,实施它,测试它,然后把它贴回来。 :-D

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

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

答案 1 :(得分:4)

我发现了一种更好的方法: -

在执行STM时,如果r15不是操作数之一,则^可以访问用户模式寄存器。但是,自动增量似乎在指令中不起作用,如果要访问寄存器库,则需要使用nop。

这样的东西
stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer