gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:33:27 24 4
gpt4 key购买 nike

我有这个代码

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com