尝试退出程序时调用错误

时间:2013-05-21 06:26:05

标签: assembly error-handling x86 invoke

我有这段代码

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

此代码是要求用户输入Yy以获取是。如果他们输入Yy,则该计划将从头开始,如果用户输入yYn或{{1}旁边的任何其他内容}。 如果用户输入Nn程序退出。

为什么我会在N

上调用错误

提前感谢您的帮助

2 个答案:

答案 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 - 不再需要测试。

<强>更新

我应该补充一点,我假设函数WriteCharCrlf保留al寄存器。因为如果ReadChar返回al中的读取字符,但WriteCharCrlf最终会用其他内容覆盖它,则此代码永远不会起作用。

如果未保留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