考虑下面的C程序:
int main(void)
{
char string[10] __attribute__ ((aligned(32)));
int i;
int *intp = (int*)(string + 1 );
printf("string: 0x%x, intp: 0x%x\n", string, intp);
for (i=0; i<10; i++)
{
string[i] = 10;
}
dump(string);
printf("*intp: 0x%x\n", *intp);
*intp = 0xEEEEEEEE;
dump(string);
return 0;
}因此,我基本上是强制CPU在未对齐的地址上访问32位数据(int)。TBH我希望在我的ARM9板上有段错误。但我得到了一些有趣/令人困惑的结果:
将intp设置为0xEEEEEEEE后,字符串转储显示:
0xee, 0xee, 0xee, 0xee, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa 所以代码实际上改变了string中的第一个元素!为什么?
谢谢,
发布于 2011-10-06 21:26:37
CPU很可能会对未对齐的地址进行“四舍五入”,因此当您将未对齐的地址传递给某个指令时,硬件会找到最近的边界并对该地址执行指定的操作。
This可能真的会回答你的问题:
在ARM和StrongArm上,如果您请求一个未对齐的字,并且没有捕获对齐陷阱,则会使对齐的字旋转,从而使您请求的字节对齐在
中。例如,
Consider:
Address: 0 1 2 3 4 5 6 7
Value : 10 21 66 23 ab 5e 9c 1d
Using *(unsigned long*)2 would give:
on x86: 0x5eab2366
on ARM: 0x21102366https://stackoverflow.com/questions/7674730
复制相似问题