【发布时间】:2018-05-25 07:23:08
【问题描述】:
我想创建通过 GCC 编译器保存/恢复 CPU 寄存器状态的函数。 在 PowerPC 中它是 8 个条件 4 位寄存器('cr0'-'cr7'),我想获取它们的值并将其保存在内存中。我的解决方案(不起作用):
register int cr0 __asm__("cr0");
这适用于通用寄存器('r1'-'r30'),在寄存器被定义后,可以以任何方式使用它。 但是在编译上面的代码时,它失败并出现以下错误:
hello.c: In function ‘foo’:
hello.c:58:22: error: register specified for ‘cr0’ isn’t suitable for data type
register int cr0 __asm__("cr0");
我认为问题在于 cr0 寄存器是 4 位宽,所以它不能放入 32 位 int 变量中。 (16位和8位也失败了)
如何处理这个问题? GCC中有4位整数的解决方法吗?或者如何解决完整的cr 32bit 寄存器,而不仅仅是它的部分?
【问题讨论】:
-
您不太可能手动管理 gcc 对条件寄存器不同部分的使用。 Register-asm 变量仅适用于通用整数寄存器,或用于 FP 变量的 FP 寄存器。
-
请注意您的特定平台的 ABI 约定。它们很重要。