2016-08-14 74 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的輸出,我認爲你混淆了哪個寄存器是數據,哪個是地址。