首页 > 解决方案 > MASM 不会在 ReadString 上暂停并且没有执行 IF 块

问题描述

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 循环结束。

2.) 使用块结构的 .IF 语句,或使用跳转指令(我同时使用)

3.) 使用 .REPEAT - .UNTIL 指令允许用户重复运行程序。- 如果用户输入 Y,则屏幕清除,程序再次运行。

然而,我遇到的问题是我的输出在控制台上加倍了 digitprompt 和 runagain,这意味着它一直跳过到程序的末尾,一路绕过 IF 块。请问我该如何解决这个问题?我希望它在途中适当暂停,不,“WaitMsg”在这里不起作用,因为我期待输入。这是控制台的样子,其中夹在肇事者之间的 dumpregs:

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

标签: if-statementassemblymasmirvine32pause

解决方案


推荐阅读