2015-04-07 118 views
-2

可以访问Sp,Lr和Pc并将它们存储在正常的C变量中?...如果是,那么该怎么做。请与C语言代码解释它..是否有可能访问CPU寄存器,如LR,PC

我使用臂gcc编译

+1

您还没有指定了您正在使用的C编译器。 – Michael

+2

当然,使用内联汇编或调用一个单独的汇编函数时,您可以获得所需的任何寄存器值。它们有多有意义是另一个问题 - 'pc'和'sp'不会比你从C中已经知道的更多(取一个局部变量或当前函数的地址),除了从开始一个函数'r14'可以包含_anything_,当人们想要检查'lr'时,这个函数有99次是100次,这意味着他们真的想要C编译器的'return_address'内在。 – Notlikethat

+1

可能的副本[将调用者的lr从子例程获取到C变量 - 臂](http://stackoverflow.com/questions/18270702/get-the-callers-lr-from-subroutine-into-c-variable-arm) –

回答

2

在GCC:

uint32_t some_variable; 
__asm__ __volatile__ ("mov %0, lr" : "=r" (some_variable)); 

这告诉编译器分配一个寄存器some_variable(其由占位符表示%0),然后发出指令mov %0, lr。效果是将lr的值存储为some_variable

__volatile__告诉编译器不要重新排序这条指令,我认为你想要。

这也应该与pcsp一起使用。 (或者任何其他寄存器,但是用“普通”寄存器来做并不会很有用 - 编译器可能会选择将some_variable分配给您正在尝试查看的寄存器)

+1

访问任何其他注册可能不是很有用。但是,如果编译器将有问题的寄存器分配为“移动”的目标,它仍然会有正确的值。 – harper

相关问题