【发布时间】:2019-04-17 02:23:46
【问题描述】:
更新:2019 年 4 月 16 日 @ 中部时间晚上 11:46。我的 CMP 都没有真正起作用。几乎它会跳转到 LDR 0 = errorMessage,然后重新循环,这会导致无限循环。还在努力解决。
我正在尝试执行以下操作:
1. 要求用户输入货币:Nickle (N)、Dime (D)、Quarter (Q) 或 Dollars (B)。重复,直到用户插入 55 美分或更多美分。
2. 那有什么问题?假设用户输入N,我试图将INPUT与(N,D,Q,B)的ASCII值进行比较查看它们是否匹配,如果匹配,则跳转到 approve 函数,将值存储在 totalMoney 中,打印出当前插入的金额,然后再次调用 getMoneyLoop。重复直到我达到 55 美分或更多。
程序会正常启动。
1.) 欢迎来到我的商店
2.) 输入金钱: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
我不应该陷入无限循环,但我是。
【问题讨论】:
-
在您
bl scanf之后,您继续使用r1,即使它是一个未保留的寄存器。