2017-09-03 26 views
1

私はアセンブリに新しく、過去数日間はインターネットを掃除して助けを得ましたが、役に立たなかった。Scanf ARMアセンブリを使用したセグメンテーションフォールト

.data 

format: .asciz "%s" 
string: .asciz "Output: %s\n" 

prompt: .asciz ">" 

.text 
.global main 
.main: 

    ldr r0, addr_prompt  /*loading address of prompt message in r0*/ 
    bl printf    /*calling printf*/ 

    ldr r0, addr_format  /*loading first parameter of scanf*/ 
    ldr r1, addr_string  /*loading second parameter of scanf*/ 
    bl scanf    /*calling scanf*/ 

    /*below I am trying to print out the user 
    input from scanf*/ 

    ldr r1, [r1]    
    bl printf 

    mov r7, #1 
    swi 0 

addr_prompt: .word prompt 
addr_format: .word format 
addr_string: .word string 

実行すると、「セグメンテーションフォールト」エラーが発生します。誰かが私に間違ったことを知らせてもらえますか?どんな助けでも大歓迎です。

編集:提案固定コピーエラーとしてコードに追加コメント(scanfの - > BLのscanf)

+1

デバッガを使用して、他の人が手助けしたい場合は特に、あなたのコードをコメント。とにかく、 'scanf'はコンパイルすべきではありません。コピーペーストエラーのように見えます。おそらく' bl scanf'があります。実際に使用しているコードを必ず表示してください。また 'ldr r1、[r1]'は理にかなっていません。あなたが望んだことをコメントしていないので、修正できません。 'r1'は呼び出し元に保存されているので、' scanf'はそれを破壊します。 'scanf'がC言語でどのように機能するのかわからないようです(戻り値のバッファを渡さなくても)。 – Jester

+0

あなたの弦などはCで動作しますか?あなたのアセンブリ言語や関数への呼び出しに問題がありますか?問題を半分に分ける。 –

+0

'bl scanf'でエラーが発生し、' bl printf'が期待どおりに正しく出力されます(デバッガでは)?私は 'ldr r0、addr_prompt'で混乱しているので、私は' ldr r0、prompt'だけシンボル 'prompt'のアドレスを読み込むことを期待しますが、再度これはARMアセンブラの方言かもしれませんまだ知っていますが、いくつかのキーワードを直接読み込みに使用する必要があります。 'addr_prompt:.word prompt'によるあなたの間接は依然として重複している可能性があり、なぜそれを使用しているのかは明らかではありません。 – Ped7g

答えて

0

バッファ/記憶は、入力データを格納するために必要とされます。ラズベリーパイRaspbianから

.data 

format: .asciz "%s" 

string: .asciz "Output: %s\n" 
prompt: .asciz ">" 

storage: .space 80   @ --- added buffer 

.text 
.global main 
main:      @ --- removed . 

    ldr r0, addr_prompt  /*loading address of prompt message in r0*/ 
    bl printf    /*calling printf*/ 

    ldr r0, addr_format  /*loading first parameter of scanf*/ 
    ldr r1, addr_storage @ --- location to write data from input 
    bl scanf    /*calling scanf*/ 

    /*below I am trying to print out the user 
    input from scanf*/ 

    ldr r1, addr_storage @ --- data location 
    ldr r0, addr_string  @ --- printf format 
    bl printf 

    mov r0, #0    @ --- good return code 
    mov r7, #1 
    swi 0 

addr_prompt: .word prompt 
addr_format: .word format 
addr_string: .word string 
addr_storage: .word storage @ --- address of buffer 

出力:

as -o printf10.o printf10.s 
gcc -o printf10 printf10.o 

./printf10; echo $? 
>Hello 
Output: Hello 
0 
+0

ありがとう!私は、バッファが必要であるかどうか、またはそれを実装する方法を知らなかった。ちょっとした説明と理解のために。 '.space'の後ろにある' 80'は、それを参照していますか? –

+0

バッファ長は80文字です。 – bstipe