我是裝配新手,過去幾天一直在網上尋求幫助,但無濟於事。使用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提示符'你的間接性仍然很可能是多餘的,並且不清楚你爲什麼使用它(對於這個簡短的例子沒有明顯的目的)。 – Ped7g