我正在尝试使用write()
系统调用打印数组的所有元素。我之前没有使用过很多写法,但据我所知,我传递的参数似乎是正确的。我知道写作需要:
这是我的代码:
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
这看起来是否正确?可能我的问题出现在我的程序的其他地方吗?
答案 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位边界开始)。