MASM не останавливается на ReadString, а блок IF не выполняется - PullRequest
0 голосов
/ 26 мая 2020

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...