如何访问进入管理员模式时保存的用户 R13 和 R14?我正在使用 ARM7TDMI。
IE 我不想访问现在包含用户模式返回地址的主管 R14,而是想要用户模式的链接寄存器的值。这是我正在编写的调试器的一部分。
这些寄存器有特殊的别名吗?
谢谢
如何访问进入管理员模式时保存的用户 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