2013-10-18 58 views
0

我正在編寫一個程序,將從ARM彙編中的stdin中將5個整數加起來,但我到達一個無限循環,不知道爲什麼。無法擺脫ARM彙編中的無限循環

我開始了定義基本的東西

/*defines functions*/ 
    .section  .rodata 
promptString: 
    .ascii "Enter numbers: \000" 
readString: 
    .ascii "%d\000" 
printSum: 
    .ascii "sum=%d\n\000" 
/*global varibles*/ 
.section  .data 
    .align 2 

    .comm string,4,4 
    .text 
/*sets addresses*/ 
addrString: .word string 
addrPromptString: .word promptString 
addrReadString: .word readString 
addrPrintSum: .word printSum 

然後我開始我的主,有一個循環應持續5次迭代,而是我到一個無限循環

main: 
    stmfd sp!, {fp, lr} 
    mov r3,#0 
    mov r2,#0 
    mov r4,#5 

loop: 
    cmp r3,r4 
    beq end 

    ldr r0, addrPromptString 
    bl printf 

    ldr r0, addrReadString 
    ldr r1, addrString 
    bl scanf 

    add r2,r2,r1 
    add r3,r3,#1 
    bl loop 
end: 

    ldr r2, addrPrintSum 
    bl printf 

    ldmfd sp!, {fp, pc} 

通過什麼我認爲是合理的邏輯,當r3達到5並且變得等於r4是5時,它應該跳到結尾。

但是顯然它沒有。

謝謝!

+0

看起來像一個重複http://stackoverflow.com/questions/19440396/infinite-loop-in-arm-assembly – 2013-10-18 11:02:51

回答

1

假設printf和scanf是C函數,您的r2和r3寄存器值可能會被破壞。 ARM ABI在不用作函數參數時將這些寄存器用作臨時寄存器,因此它們不保證被您調用的函數保存。

但是,ABI期望r4到r11在使用前保存。因此,如果您在堆棧中保存了r4到r6,使用r5和r6代替r2和r3,並在返回時將r4恢復爲r6,那麼您的代碼可能會有效。這樣,你可以按照ABI和printf和scanf不會干擾你的變量。

此外,它表示「bl循環」,您需要用「b循環」替換它,所以它並不總是將鏈接寄存器設置爲「結束」的位置。

+0

我改變了我的代碼根據你說什麼,沒有死循環沒有了,但它輸入第5個整數後立即實現了分段錯誤。 – legoman25

+1

你應該在問題中更新你的代碼,然後這裏的大多數人都沒有擁有一個水晶球。 ;) –

+1

我注意到循環之後,你不會爲printf設置r0和r1,所以它們的值是不明確的。此外,您爲r2設置的內容屬於r0,printf中的第一個參數,而r1應該是您希望打印的總和。 – Sean