2017-04-12 10 views
0

レジスタからメモリ位置に値を移動する際に問題が発生しました。それはかなり簡単です。まず、フォーマット文字列と値abcを正しい場所に移動し、printfを呼び出します。次のブロックは問題がある場所です。私はadr r1, abcに電話し、abcの位置をr1に取得します。私はその後、レジスタr4を10に初期化します。r4の値をr1(これはabcです)の場所に格納しようとすると、segfaultが発生します。私は真剣に何が起こっているのか分からない。私はabcのアドレスが間違っているように感じます、それはsegfaultingだからですが、わかりません。 コードは以下の通りです:ARMでSTRコマンドを使用する際のエラー

.section .text 
    .global main 
main: 
    push {lr} 

    ldr r1, abc 
    ldr r0, =print_str 
    bl printf 

    adr r1, abc 
    mov r4, #10 
    str r4, [r1] 

    ldr r1, abc 
    ldr r0, =print_str 
    bl printf 

    pop {lr} 
    bx lr 

print_str: .asciz "%d\n" 
abc: .word 400 
+4

.text'が書き込み可能ではありません 'としてあなたは、' .data'セクションにデータを配置する必要があります。 – Jester

+0

ですが、.textへの書き込みが問題になっている可能性があります。あなたはアームが私たちにほとんど何も知らない、チップやコアを知る必要があること、そしてこのコードがどのようなアドレス空間(RAMやROM /フラッシュなのかなど)を指定するのに十分な情報を与えていない。あなたが値を書き込むことができないことを意味するフラッシュではない、それは...(チップ/状況上)。 –

答えて

0

あなたが探しているものは?
プログラムの目的が不明です。 以下のコードを修正して、seg faultを緩和しますが、それだけです。

.data 
     print_str: .asciz "%d\n"                                          abc: .word 400 
.text 
    .global main 
main: 
    push {lr} 

    ldr r1,=abc 
    ldr r0, =print_str 
    bl printf 

    ldr r1,=abc 
    mov r4, #10 
    str r4, [r1] 

    ldr r1,=abc 
    ldr r0,=print_str 
    bl printf 

    pop {lr} 
    bx lr 

出力:

$ ./T94j0 
132600 
132600 
関連する問題