2016-08-14 117 views
-1

我在编程ARM没有太多的经验,我想推出后续项目:ARM 32位指令STR

_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 

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

任何建议表示赞赏!

+0

符号'data'有什么值?数据:.asciz“/ system/bin/curl” – rjp

+0

http:.asciz“http://website/file.txt” – Livio

回答

1

According to the ARM docs for str,str r12,[lr],#4将0123存储在lr的地址中,后面的索引是存储后的lr+=4。方括号表示取消引用/内存操作数,就像在x86语法中一样。

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