2017-09-03 51 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提示符'你的間接性仍然很可能是多餘的,並且不清楚你爲什麼使用它(對於這個簡短的例子沒有明顯的目的)。 – 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