我有这段代码
restart:
mov edx, OFFSET prompt5
call WriteString
mov edx, 0
mov edx , OFFSET buffer
call ReadString
cmp edx, 'n' or 'N'
JE exit
cmp edx, 'Y' or 'y'
JE ReadInput
JNE restart
此代码是要求用户输入Y
或y
以获取是。如果他们输入Y
或y
,则该计划将从头开始,如果用户输入y
或Y
和n
或{{1}旁边的任何其他内容}。
如果用户输入N
或n
程序退出。
为什么我会在N
行
提前感谢您的帮助
答案 0 :(得分:1)
您无法同时比较两个值。执行cmp al, 'Y' or 'y'
时,汇编程序将计算'Y'
和'y'
的按位OR,这只是'y'
。因此该指令等同于cmp al, 'y'
。
如果要与这两个值进行比较,则需要单独进行每次比较。
cmp al,'Y'
je L1
cmp al,'y'
je L1
假设L1
是您要在用户输入Y或y时跳转到的标签。我的答案基于修改后的代码 - 而不是你问题中的原始代码。
然后,对于'重启'案例,您不需要使用jne
- 您可以使用无条件jmp
。如果你已经在代码中达到了这一点,那么你已经无法匹配任何其他条件,因此你知道该字符不等于Y,y,N或n - 不再需要测试。
<强>更新强>
我应该补充一点,我假设函数WriteChar
和Crlf
保留al
寄存器。因为如果ReadChar
返回al
中的读取字符,但WriteChar
或Crlf
最终会用其他内容覆盖它,则此代码永远不会起作用。
如果未保留al
,您可以通过执行以下操作暂时将其保存在堆栈中:
call ReadChar
push eax
call WriteChar
call Crlf
pop eax
cmp al,'N'
...etc
答案 1 :(得分:0)
restart:
mov eax, 0
mov edx, OFFSET prompt5
call WriteString
mov edx, 0
call ReadChar
call WriteChar
call Crlf
cmp al, 'N'
JE L
cmp al, 'n'
JE L
cmp al, 'Y' or 'y'
JE L1
JNE restart
L:
exit