2013-04-22 143 views
2

我爲ARM編寫了一個「Hello World」程序,並且它工作正常。一旦我重複printf調用(如打印「Hello World」兩次),程序開始給出「Segmentation故障「,但。ARM:2 printfs導致分段錯誤

下面是用雙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" 

有關原因的任何線索,以及如何解決它?

+2

刷新'R0'。 'printf'可以改變它;就像打印的字符一樣。 – 2013-04-22 21:51:58

+0

就是這樣,謝謝。你不想把它作爲答案發布,所以我可以選擇它作爲正確的答案嗎? – 2013-04-22 21:53:10

+0

我從來沒有得到它爲什麼人們不贊成評論。有些東西太微不足道,無法證明答案;-) – 2013-04-23 11:17:03

回答

2

r0不僅是第一個參數。返回值也存儲在其中。在第一次調用printf()後,它將包含打印的字符數,而不是有效的字符串指針。你想這個代替:

ldr r0, =test 
    bl printf 
    ldr r0, =test 
    bl printf 
5

的ARM EABI指定被叫方被允許更改寄存器R0-R3和R12,因爲這樣你的R0不會再保存地址字符串。實際上它包含printf-call的返回值(在這種情況下,它將是12)。然後,您的下一個printf調用將嘗試訪問內存中地址爲0xC的字符串,然後對該進程進行段錯誤。

爲了使雙printf的工作,你會做這樣的:

ldr r0, =test 
bl printf 
ldr r0, =test 
bl printf