7

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

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

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

谢谢

4

2 回答 2

10

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

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

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

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

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

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

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

于 2008-11-28T01:38:08.683 回答
4

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

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

就像是

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer
于 2008-11-28T17:52:34.447 回答