繁体   English   中英

如何在ARM Assembly程序中阻止无限循环?

[英]How do I prevent an infinite loop in my ARM Assembly program?

更新:4/16/2019 @ 11:46 PM中央。 我的CMP都没有实际工作。 它几乎跳到LDR 0 = errorMessage,然后重新循环,这导致无限循环。 仍在努力解决这个问题。

我正在尝试执行以下操作:
1.要求用户输入金钱:Nickle(N),Dime(D),Quarter(Q)或Dollars(B)。 重复,直到用户插入55或更多美分。
那么问题是什么? 假设用户输入N,我试图将INPUT与(N,D,Q,B)的ASCII值进行比较以查看它们是否匹配,如果是,则跳转到批准功能,将值存储在totalMoney中,打印出当前插入的金额,并再次调用getMoneyLoop。 重复,直到我达到55或更多美分。

该计划将开始正常。

1.)欢迎来到我的商店

2.)输入Money:Nickle(N)等

3.)用户输入:“N”

但是,我在这里得到:

Enter money: nickel(N), dime(D), quarters (Q), and one dollar bills (B).
Enter money: nickel(N), dime(D), quarters (Q), and one dollar bills (B).
Enter money: nickel(N), dime(D), quarters (Q), and one dollar bills (B).
Enter money: nickel(N), dime(D), quarters (Q), and one dollar bills (B).
Enter money: nickel(N), dime(D), quarters (Q), and one dollar bills (B).
Enter money: nickel(N), dime(D), quarters (Q), and one dollar bills (B).
Enter money: nickel(N), dime(D), quarters (Q), and one dollar bills (B).

我一直试图破解这个难题,但我似乎无法围绕正在发生的事情。

谢谢你,Z

我试过改变寄存器。 我在之前的程序中遇到了这个“无限循环”问题,但它更简单(imo)。 我知道最初当我得到一个无限循环,这是因为我使用的是r1和r2,这些被认为是“没有防备”,它可能导致一些不稳定的事情,当我把它改成r5和r6时,它就修复了它。

在这个程序中,我只是不知道我的逻辑是否正确。

我还是很新并且学习它,但是任何人都可以引导我朝着正确的方向前进吗?

我只是粘贴了我遇到问题的特定部分,以及与之相关的任何相关数据。

.data

askUserForMoney: .asciz "Enter money: nickel(N), dime(D), quarters (Q), and one dollar bills (B). \n"

input:  .asciz "%d"

totalCash: .asciz "Total is: %d cents\n" 

errorMessage: .asciz "Invalid Selection. Try Again.\n" 

choice: .word 0 

.text

.global main

main:

getMoney:

    stmfd sp!, {lr, r4}

    mov r4,#0

getMoneyLoop:

 cmp r4, #55
 bge exitGetMoney 

 ldr r0, =askUserForMoney
 bl printf

 ldr r0, =input
 ldr r1, =choice
 bl scanf 

 cmp r1, #78
 addeq r4,r4,#5 
 beq approved 


 cmp r1, #68
 addeq r4,r4,#10
 beq approved


 cmp r1, #81
 addeq r4,r4,#25
 beq approved


 cmp r1, #66
 addeq r4,r4,#100
 beq approved 

 ldr r1, =errorMessage
 bl printf
 b getMoneyLoop

approved:
ldr r0, =totalCash
mov r1, r4
bl printf
b getMoneyLoop


exitGetMoney:
    mov r0,r4
    ldmfd sp!, {lr,r4}
    mov pc, lr

我不应该得到无限循环,但我是。

我认为遵循printf语句可能会导致问题,

批准:mov r1,r4 bl printf b getMoneyLoop

由此printf语句设置的输出可以被视为后续scanf语句的输入。

另一个问题可能发生在为前一个输入输入N之后,缓冲区将N保持为下一个回合的有效输入,因此程序的行为方式使得用户每次都设置输入N.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM