【问题标题】:confusion on ARM9 data alignmentARM9 数据对齐的困惑
【发布时间】:2011-12-02 05:58:51
【问题描述】:

考虑以下 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    

所以代码实际上改变了字符串中的第一个元素!为什么?

谢谢,

【问题讨论】:

  • 只是好奇:如果您尝试 int *intp = (int*)(string + 2); 会发生什么? +3 怎么样?
  • @cnicutar:实际上 +2 或 +3 不会有任何影响!

标签: c arm alignment


【解决方案1】:

CPU 很可能会“舍入”未对齐的地址,因此当您将未对齐的地址传递给某个指令时,硬件会找到最近的边界并对该地址执行指定的操作。

This 可能真的会回答你的问题:

在 ARM 和 StrongArm 上,如果您要求一个不对齐的词并且您 不要采取对齐陷阱,然后您会旋转对齐的单词 这样您要求的字节对齐就在 LSB 中。例如,

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: 0x21102366

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2019-03-19
    相关资源
    最近更新 更多