我对处理器寄存器的概念有一些误解。有一个地址寄存器,比方说,0x0345678。这个寄存器是 32 位宽/长(现在没关系,哪个字是正确的)。正如手册中所写,有某种表/数组:
职位价值 0 111111...10b 1 111111...11b 2 7A ..................... 7 3F7C
我必须访问位置 2 的值。我所做的第一件事是:
#define REG 0x0345678
void somereadfunction()
{
volatile unsigned int *pval = (volatile unsigned int *)REG;
printf("%x", *(pval | 0x02));
}
正如您已经猜到的那样,这是错误的假设。
另一项尝试是:
for(unsigned int i = 0; i < 3; i++)
{
printf("i: %d, res: 0x%08X", i, *((volatile unsigned int *)REG));
}
它有效。所以,我的问题是,为什么以及如何?处理器是否只是使用其他开发人员编写的内部某种魔术算法来切换寄存器值?我对此有点困惑。我知道如何使用一些简单的逐位操作来访问寄存器的第三位,但我不明白,如何通过调用寄存器的 3 次来获得正确的值?
预先感谢您的回答。
添加:处理器是 ARM 7。使用了 i2c 设备。