【问题标题】:How do I prevent an infinite loop in my ARM Assembly program?如何防止我的 ARM 汇编程序中出现无限循环?
【发布时间】: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,即使它是一个未保留的寄存器。

标签: loops input arm


【解决方案1】:

我认为下面的 printf 语句可能会导致问题,

批准: 移动 r1, r4 bl printf b getMoneyLoop

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

可能会出现另一个问题,在为上一个输入输入 N 之后,缓冲区将 N 作为下一轮的有效输入,因此程序的行为方式是用户每次都设置输入 N。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多