簡體   English   中英

無法突破ARM裝配中的無限循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM