私はアセンブリに新しく、過去数日間はインターネットを掃除して助けを得ましたが、役に立たなかった。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)
デバッガを使用して、他の人が手助けしたい場合は特に、あなたのコードをコメント。とにかく、 'scanf'はコンパイルすべきではありません。コピーペーストエラーのように見えます。おそらく' bl scanf'があります。実際に使用しているコードを必ず表示してください。また 'ldr r1、[r1]'は理にかなっていません。あなたが望んだことをコメントしていないので、修正できません。 'r1'は呼び出し元に保存されているので、' scanf'はそれを破壊します。 'scanf'がC言語でどのように機能するのかわからないようです(戻り値のバッファを渡さなくても)。 – Jester
あなたの弦などはCで動作しますか?あなたのアセンブリ言語や関数への呼び出しに問題がありますか?問題を半分に分ける。 –
'bl scanf'でエラーが発生し、' bl printf'が期待どおりに正しく出力されます(デバッガでは)?私は 'ldr r0、addr_prompt'で混乱しているので、私は' ldr r0、prompt'だけシンボル 'prompt'のアドレスを読み込むことを期待しますが、再度これはARMアセンブラの方言かもしれませんまだ知っていますが、いくつかのキーワードを直接読み込みに使用する必要があります。 'addr_prompt:.word prompt'によるあなたの間接は依然として重複している可能性があり、なぜそれを使用しているのかは明らかではありません。 – Ped7g