Как предотвратить бесконечный цикл в моей программе сборки ARM? - PullRequest
0 голосов
/ 17 апреля 2019

Обновление: 16.04.2009 @ 23:46 Central. Ни один из моих CMP на самом деле не работает. В значительной степени он переходит к LDR 0 = errorMessage, затем повторяет цикл, что вызывает бесконечный цикл. Все еще пытаюсь решить это.

Я пытаюсь сделать следующее:
1. Попросите пользователя ввести деньги: Никель (N), Дайм (D), Квартал (Q) или Доллары (B). Повторяйте, пока пользователь не вставит 55 или БОЛЬШЕ центов.
2. Так в чем же проблема? Допустим, пользователь вводит N, я пытаюсь сравнить INPUT со значениями ASCII (N, D, Q, B), чтобы увидеть, они совпадают, если это так, переходят к функции Одобрить , сохраняют значение в totalMoney, распечатывают, сколько денег в настоящее время вставлено, и снова вызывают getMoneyLoop. Повторяйте, пока я не достигну 55 или более центов.

Программа запустится нормально.

1.) Добро пожаловать в мой магазин

2.) Введите деньги: Никель (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

Я не должен получать бесконечный цикл, но я.

1 Ответ

0 голосов
/ 05 мая 2019

Я думаю, что следующее утверждение printf может вызвать проблему,

утверждено: mov r1, r4 bl printf b getMoneyLoop

Выходные данные, которые устанавливаются этим оператором printf, могут рассматриваться как вводпоследующий оператор scanf.

Может возникнуть другая проблема: после ввода N для предыдущего ввода буфер сохраняет N в качестве допустимого ввода для следующего хода, поэтому программа ведет себя так, что пользователь установил ввод Nкаждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...