0

虽然获得了一份教授 ARM 汇编的文档,但该文档现在告诉我将 CPRS 加载到 C 中并将数据格式化为友好格式,例如 -

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

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

我将我的 CPRS 放入一个 int 只是为了查看数据显示的内容1610612752,我假设我不应该将它加载到一个 int 和其他东西中以使其更加清晰。

任何将我推向正确方向的提示将不胜感激。

4

1 回答 1

3

从这个 wiki 页面(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”表示右移 val num 位,然后提取掩码下的位)。

现在您有了带有标志的变量,这是有条件地打印标志的方法,

printf("Flags: ");
printf("%s ", armflag_N ? "N" : "-" );
...
于 2013-10-29T20:14:01.580 回答