ARM 32位STR指令

时间:2016-08-14 22:52:47

标签: assembly arm

我没有太多编程ARM的经验,我正在尝试启动以下程序:

_start:
        STMFD SP!, {R11,LR}
        ADD   R11, SP, #4
        SUB   SP, SP, #0x18
        SUB   R12, R11, #24
        mov r5, #74 ;index for loop
        ldr r3, =data
        mov lr, r3
        LDMIA LR!, {R0-R3}
        STMIA R12!, {R0-R3}

_loop:
        str r12,[lr],#4
        subs r5,r5,#1
        bne _loop

但是在这条指令之后我有一个SIGSEGV:

str r12,[lr],#4

这是对内存的转储:

(gdb) x/10x $r12
0xbeb6c944: 0x00000000  0x00000000  0x00000000  0x00000001
0xbeb6c954: 0xbeb6ca79  0x00000000  0xbeb6ca8b  0xbeb6caa3
0xbeb6c964: 0xbeb6cab6  0xbeb6cabd

我认为问题是由于堆栈不可写,但为什么在这条指令STMIA R12!,{R0-R3}我没有任何问题?

任何建议都表示赞赏!

1 个答案:

答案 0 :(得分:1)

According to the ARM docs for strstr r12,[lr],#4将r12存储到lr中的地址,并在商店之后使用后索引(lr+=4)。方括号表示取消引用/内存操作数,类似于x86语法。

由于你展示了x/10x $r12的输出,我认为你混淆了哪个寄存器是数据,哪个是地址。