我在检查用户输入无符号数字后是否设置了溢出标志时遇到了麻烦
我尝试使用JC检查溢出标志。
示例输出
Please enter an unsigned number: 99999999999999999999999
<32-bit integer overflow>
Not unsigned or too big.
Please enter an unsigned number: 25
25
prompt_1 BYTE "Please enter an unsigned number: ", 0
inv_msg BYTE "Not unsigned or too big.", 0
inv_prompt BYTE "Please try again: ", 0
input_1 DWORD ?
.code
main PROC
Try_again:
mov edx, OFFSET prompt_1
call WriteString
call ReadInt
jo Invalid_
mov input_1, eax
call WriteDec
jmp Finish_
Invalid_:
mov edx, OFFSET inv_msg
call WriteString
call Crlf
jmp Try_again
Finish_:
似乎可行,但仍显示<32-bit integer overflow>
。它能正常工作还是出问题了?有什么方法可以停止显示<32-bit integer overflow>
,或者应该是这样?
答案 0 :(得分:2)
TL; DR:应该是这样。
如果我们假设您正在使用Kip Irvine的库,则可以在安装Irvine库的任何目录的Lib32
(或Lib16或Lib64)子目录中找到其源代码。
因此,让我们看一下ReadInt
中的Lib32\Irvine32.asm
过程。如您所见,它只是读取一个字符串,然后调用另一个名为ParseInteger32
的过程来解析该字符串的内容。
ParseInteger32
有一个循环L5
,在其中处理数字,如果在该循环中检测到溢出,它将跳至标签L7
,从字符串" <32-bit integer overflow>"
开始将被打印,然后是回车和换行符。
这些函数似乎都不采用任何控制是否应打印该字符串的参数。因此,如果要避免打印溢出字符串,则必须修改Irvine源代码并重建库。