1.) Я должен написать программу, которая генерирует следующий вывод:
Enter a digit: 8
You entered a digit.
Do you want to run the program again (Y or N)? Y
( Пользователь вводит Y, поэтому экран очищает и программы запускаются снова.)
Enter a digit: Q
You did not enter a digit.
Do you want to run the program again (Y or N)? N
( Пользователь вводит N, поэтому .REPEAT - .UNTIL l oop заканчивается.
2.) Используйте оператор .IF с блочной структурой или используйте инструкции перехода (я использую оба)
3.) Используйте директиву .REPEAT - .UNTIL, чтобы позволить пользователю запускать программу повторно. - Если пользователь вводит Y, экран очищается, и программа запускается снова.
Однако проблема, с которой я сталкиваюсь, заключается в том, что мой вывод удваивается на консолях, как на цифровом предложении, так и при повторном запуске, что означает, что он пропускает полностью до конца программы, минуя блоки IF. Как я могу это исправить? Я хочу, чтобы он делал паузу в пути, и нет, "WaitMsg" здесь не сработает, потому что я ожидаю ввода. Вот как выглядит консоль с дампрегами, зажатыми между злоумышленниками:
Enter a digit:
EAX=00000000 EBX=002E3000 ECX=0040100A EDX=00406010
ESI=0040100A EDI=0040100A EBP=0019FF80 ESP=0019FF74
EIP=00403683 EFL=00000246 CF=0 SF=0 ZF=1 OF=0 AF=0 PF=1
Do you want to run the program again (Y or N)? _
ВЫШЕ ОШИБКА ...
INCLUDE Irvine32.inc
.data
digitprompt BYTE "Enter a digit: ",0
userDig db 64 dup(?),0
runagain BYTE "Do you want to run the program again (Y or N)? ",0
characterans BYTE ?,0
digit BYTE "You entered a digit.",0
notdigit BYTE "You did not enter a digit.",0
.code
main PROC
.REPEAT
call Clrscr
mov edx, 0
mov edx, OFFSET digitprompt
call WriteString
mov edx, OFFSET userDig
call ReadString
.IF edx >= 0
jmp L1
.ELSE
jmp isNotDig
.ENDIF
L1:
.IF edx <= 9
jmp isDig
.ELSE
jmp isNotDig
.ENDIF
isDig: mov edx, OFFSET digit
jmp L2
isNotDig: mov edx, OFFSET notdigit
L2:
mov edx, OFFSET runagain
call WriteString
call ReadChar
mov characterans, al
.UNTIL characterans == 'N'
exit
main ENDP
END main