我没有太多编程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}我没有任何问题?
任何建议都表示赞赏!
答案 0 :(得分:1)
According to the ARM docs for str
,str r12,[lr],#4
将r12存储到lr
中的地址,并在商店之后使用后索引(lr+=4
)。方括号表示取消引用/内存操作数,类似于x86语法。
由于你展示了x/10x $r12
的输出,我认为你混淆了哪个寄存器是数据,哪个是地址。