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