[英]Cannot break out of infinite loop in ARM assembly
我正在編寫一個程序,該程序將在ARM匯編中將stdin中的5個整數加在一起,但是我到達了一個無限循環,不知道為什么。
我首先定義基本的東西
/*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)時,它應該跳到終點。
但顯然不是。
謝謝!
假設printf和scanf是C函數,則r2和r3寄存器值可能會變得混亂。 當不用作功能參數時,ARM ABI會將這些寄存器用作臨時寄存器,因此不能保證您調用的函數會保存這些寄存器。
但是,ABI希望在使用r4到r11之前先保存它們。 因此,如果將r4到r6保存在堆棧中,使用r5和r6代替r2和r3,並在返回時恢復r4到r6,則代碼可能會起作用。 這樣,您遵循ABI,printf和scanf將不會干擾您的變量。
同樣,在顯示“ bl循環”的地方,您需要將其替換為“ b循環”,因此並不總是將鏈接寄存器設置為“ end”的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.