将ARM CPSR加载到C并格式化?

时间:2013-10-29 19:38:37

标签: c assembly arm

虽然给出了一个教授ARM程序集的文档,但现在该文档告诉我将CPRS加载到C中并将数据格式化为友好格式,例如 -

Flags: N Z IRQ FIQ
State: ARM
Mode: Supervisor

现在我已经将CPRS加载到我的程序中的变量中了,但是我很难理解CPRS的格式,我已经看到使用十六进制来重置标志等等,字节是控制的,字段,状态和扩展掩码。

我把我的CPRS放到一个int只是为了看看数据显示的是什么,我给了1610612752,我假设我不应该将它加载到int和其他东西中以便它更清楚。

任何暗示我向正确方向前进的提示都会非常感激。

1 个答案:

答案 0 :(得分:3)

在这个维基页面(http://www.heyrick.co.uk/armwiki/The_Status_register)中,我们得到了CPSR(和SPSR)的位布局:

31 30 29 28 27 - 24 - 19 … 16 - 9 8 7 6 5 4 … 0
 N  Z  C  V  Q -  J - GE[3:0] - E A I F T M[4:0]

声明一些标志(或只计算这些标志):

int armflag_N = (Cpsr>>31)&1;
int armflag_Z = (Cpsr>>30)&1;
int armflag_C = (Cpsr>>29)&1;
int armflag_V = (Cpsr>>28)&1;
int armflag_Q = (Cpsr>>27)&1;
int armflag_J = (Cpsr>>24)&1;
int armflag_GE = (Cpsr>>16)&7;
int armflag_E = (Cpsr>>9)&1;
int armflag_A = (Cpsr>>8)&1;
int armflag_I = (Cpsr>>7)&1;
int armflag_F = (Cpsr>>6)&1;
int armflag_T = (Cpsr>>5)&1;
int armflag_M = (Cpsr>>0)&15;

(“>>”表示右移指定的位数,“&”是按位和运算符,因此“(val>>num)&mask”表示右移位数值,然后提取掩码下的位。)

现在你有变量带有标志,这是你如何有条件地打印一个标志,

printf("Flags: ");
printf("%s ", armflag_N ? "N" : "-" );
...