0

我有这个代码

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是。如果他们输入Yy程序将从头开始,如果用户在yorYnor旁边输入任何其他内容N。如果用户进入nN程序退出。

为什么我会JE exit在线调用错误

提前感谢您的帮助

4

2 回答 2

1

您不能同时比较两个值。当您执行cmp al, 'Y' or 'y'此操作时,汇编程序将计算 and 的按位或'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 - 无需进行更多测试。

更新

我应该补充一点,我假设功能WriteCharCrlf保留al寄存器。因为 ifReadChar返回读取的字符 in al,但是WriteCharorCrlf最终用其他东西覆盖它,所以这段代码永远不会工作。

如果al没有被保留,您可以通过执行以下操作将其临时保存在堆栈中:

call ReadChar
push eax
call WriteChar
call Crlf
pop  eax
cmp  al,'N'
...etc
于 2013-05-21T08:50:15.633 回答
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
于 2013-05-21T06:58:25.683 回答