阵列的ARM打印元素导致Seg Fault

时间:2014-04-30 01:42:57

标签: arrays arm

我正在尝试使用write()系统调用打印数组的所有元素。我之前没有使用过很多写法,但据我所知,我传递的参数似乎是正确的。我知道写作需要:

  1. 文件的文件描述符(1表示标准输出)。
  2. 将数据写入文件的缓冲区。
  3. 要从缓冲区读取的字节数。
  4. 这是我的代码:

    mov     r3, #0                 /*Offset (also acts as LVC)*/
    print:  mov     r0, #1         /*Indicates standard output*/
            ldr     r4, =array     /*Set r4 to the address of array*/
            ldr     r5, [r3,r4]    /*Add offset to array address*/
            ldr     r1, [r6]       /*Element of array to write*/
            mov     r2, #1         /*Write 1 byte*/
            bl      write
            add     r3, r3, #1     /*Increase offset each iteration*/
            cmp     r3, #41
            blt     print
    

    这看起来是否正确?可能我的问题出现在我的程序的其他地方吗?

1 个答案:

答案 0 :(得分:1)

没有。您希望传递要写入的数据所在的地址r1,而不是值本身。

因此r1应设置为<address-of-array> + <index>,即:

    ldr     r4, =array     /*Set r4 to the address of array*/
    add     r1, r3, r4     /*Add offset to point to array item */

它崩溃了,因为你试图从内存读取一个无效的地址 - 数组项的。您正在索引ldr r5, [r3,r4]的数组中读取r3)而非字节,然后尝试读取另一个(不是字节) )来自那个地址。

在这种情况下不相关,但仅供参考,您可以使用lrdb来读取单个字节。

上面的“无效地址”也可能是未定义的,并且不属于任何映射区域,但也可能是未正确对齐的。 ARM体系结构不允许读取单词,例如32位值,来自未在32位(4字节)对齐的地址。对于第二次迭代中的r3 == 1,这将不适用(假设array将从32位边界开始)。