assembly - 尝试退出程序时调用错误

标签 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,则该程序将从头开始,如果用户在yYnN之外输入其他任何内容,则程序将从头开始。
如果用户输入nN,则程序退出。

为什么我在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-无需进行任何测试。

更新

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

如果未保留al,则可以通过执行以下操作将其暂时保存在堆栈中:
call ReadChar
push eax
call WriteChar
call Crlf
pop  eax
cmp  al,'N'
...etc

关于assembly - 尝试退出程序时调用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16663464/

相关文章:

Javascript 启动时出错

Android - 在 x86 汇编程序中调用 C 函数而不重新分配文本

performance - 快速硬件整数除法

c++ - 错误 : invalid instruction suffix for `push'

linux - 您在哪里检查 x86-64 机器上的系统调用原型(prototype)?

c - 程序集 cmp 如何检查它比较的值?

vb.net - vb.net 应用程序出现 OutOfMemoryException

swift - “Fatal error: Unexpectedly found nil while unwrapping an Optional value”是什么意思?

c++ - 在不使用其他变量的情况下用 C++ 编写程序集

assembly - 如何使用 MIPS $k0 和 $k1 寄存器