我有这个代码
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
或N
之外输入其他任何内容,则程序将从头开始。如果用户输入
n
或N
,则程序退出。为什么我在
JE exit
行上出现调用错误在此先感谢您的帮助
最佳答案
您不能同时比较两个值。当您执行cmp al, 'Y' or 'y'
时,汇编器将计算'Y'
和'y'
的按位或,即'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
关于assembly - 尝试退出程序时调用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16663464/