虽然给出了一个教授ARM程序集的文档,但现在该文档告诉我将CPRS加载到C中并将数据格式化为友好格式,例如 -
Flags: N Z IRQ FIQ
State: ARM
Mode: Supervisor
现在我已经将CPRS加载到我的程序中的变量中了,但是我很难理解CPRS的格式,我已经看到使用十六进制来重置标志等等,字节是控制的,字段,状态和扩展掩码。
我把我的CPRS放到一个int只是为了看看数据显示的是什么,我给了1610612752
,我假设我不应该将它加载到int和其他东西中以便它更清楚。
任何暗示我向正确方向前进的提示都会非常感激。
答案 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" : "-" );
...