3

ARM用の「Hello World」プログラムを作成しましたが、正常に動作しました.printf呼び出しを繰り返すと(「Hello World」を2回印刷するため)、プログラムは「セグメンテーション違反」を引き起こし始めました。

二重の printf 呼び出しを含むコードは次のとおりです。

.extern printf
.global main

main:
        push {ip,lr}
        ldr r0, =test
        bl printf
        bl printf

        mov r0, #0
        pop {ip,pc}

        test: .asciz "hello world\n"

原因とそれを修正する方法についての手がかりはありますか?

4

2 に答える 2

6

ARM EABI は、呼び出し先がレジスタ r0 ~ r3 および r12 を変更できることを指定しています。これにより、r0 は文字列へのアドレスを保持しなくなります。実際には、printf-call の戻り値が含まれています (この場合は 12 になります)。次に printf を呼び出すと、メモリ内のアドレス 0xC にある文字列にアクセスしようとするため、プロセスがセグメンテーション違反になります。

二重の printf を機能させるには、次のようにする必要があります。

ldr r0, =test
bl printf
ldr r0, =test
bl printf
于 2013-04-22T21:55:25.807 に答える
3

r0最初の引数だけではありません。戻り値もそこに格納されます。への最初の呼び出しの後、文字列への有効なポインターの代わりに、出力printf()された文字数が含まれます。代わりにこれが必要です:

    ldr r0, =test
    bl printf
    ldr r0, =test
    bl printf
于 2013-04-22T21:53:14.827 に答える