ARMv7程序集在数组中存储值

时间:2015-03-16 20:59:59

标签: arrays assembly armv7

我正在尝试将用户输入的数字添加到数组中的每个元素。在我意识到原始阵列没有更新之前,我已经完成了所有工作。我想,很简单,只需将值存回数组中,然后继续生活。可悲的是,这似乎并不那么简单。

正如标题所示,我正在使用ARMv7并编写程序集。我一直在使用this guide来理解基础知识,并有一些好的代码可供查看。当我运行此处给出的示例代码时,它可以正常工作:str r2, [r3]r2中的任何内容放入r3指向的内容中。以下是我尝试做同样的事情,它给了我Signal 11 occurred: SIGSEGV (Invalid memory segment access)Execution stopped at: 0x0000580C STR r3,[r5,#0]

@ Loop and add value to all values in array regardless of array length
@ Setup loop
@ r4 comes from above and the scanf value, I've checked the registers and the value is correct
mov     r0, #0
ldr     r1, =array_b
ldr     r2, addrArr
loop:                   @ Start loop to add inputed number to every value in array
    add     r3, r2, r0
    ldr     r3, [r3]
    add     r3, r3, r4  @ Add input to each index in array

    add     r5, r2, r0  @ Pointer to location in array
    str     r3, [r5]    @ Put new value into array

    cmp     r0, r1      @ Check for end of array
    addne   r0, r0, #4  @ Not super necessary but it shows one of the cool things ARM can do, condition math
    bne     loop        @ Branch if not equal
    beq     doneLoop    @ Branch if equal

doneLoop:               @ End loop

以下是vars

.align  2
array:
    .word   0
    .word   1
    .word   2
    .word   3
    .word   4
    .word   5
    .word   6
    .word   7
.equ    array_b, .-array
addrArr:    .word array

我的理解是str首先获取源,第二个获取目标(由于某种原因,它与其他指令不同)。因此r5用于计算数组中存储值的位置,r3具有add指令的值。我已经检查过r5中的值是有效的,即:它是数组的开头,array_b是正确的长度(在这种情况下为32)。我也尝试过=array代替addrArr,但它们会给出相同的值和相同的段错误消息。

1 个答案:

答案 0 :(得分:1)

这是因为历史上系统存在两种主要的记忆:

  • ROM,只读存储器,无法写入,只能存储程序和常量数据
  • RAM,随机存取存储器,可以读写。它用于存储变量。

许多系统不直接使用ROM,而是可以将数据从其他永久支持(例如软盘,磁带或硬盘)加载到RAM中。为了避免程序写入不应写入的RAM存储器,可以使用分段存储器将RAM划分为多个区域。

并非所有系统都具有此功能,因此它实际上取决于架构。如果使用分段存储器,当您尝试写入设计为只读的RAM段时,它基本上会使处理器退出应用程序。这正是你在这里遇到的问题。

为了解决这个问题,你应该通过.data预先设置你的数组,这是一个变量,应该存放在RAM中。

另一方面,您的可执行指令应放在标有汇编指令.text

的只读段中。