2011-10-30 77 views
2

我想在我的断言函数中打印$ra(返回地址)寄存器以用于调试目的。我正在研究MIPS CPU。 我试着下面的代码,但编译器不喜欢它:使用asm指令读取MIPS CPU寄存器

unsigned int RA; 
unsigned int* pRA = &RA; 
asm volatile("sw $ra, %0" : "=r" (pRA)); 

static volatile unsigned int RA; 
asm ("mov $ra, %0" : "=m"(RA)); 

我发现对于内嵌/扩展组件的GCC文档,但似乎我不清楚。

回答

4

下列任一应工作:

unsigned int x; 
asm volatile ("move %0, $ra" : "=r" (x)); 
asm volatile ("sw $ra, %0" : "=m" (x)); 

如果你坚持使用指针值asm volatile ("sw $ra, %0" : "=m" (*pRA));是去(不提领你会得到一个pRA将指向最终的返还方式地址而不是存储在RA中的值)。您可以阅读更多关于GCC inline assembly HOWTO中的限制条件。

+0

这可能值得链接到[内联asm官方gcc文档](https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html)。该菜单包含约束链接以及gcc扩展asm支持的详细信息。我知道OP说他已经“找到了GCC文档”,但不清楚他发现了什么或他在哪里找到了它。 –