检查用户输入是否导致溢出

时间:2019-06-03 21:53:27

标签: assembly x86 masm irvine32 masm32

我在检查用户输入无符号数字后是否设置了溢出标志时遇到了麻烦

我尝试使用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>,或者应该是这样?

1 个答案:

答案 0 :(得分:2)

TL; DR:应该是这样。


如果我们假设您正在使用Kip Irvine的库,则可以在安装Irvine库的任何目录的Lib32(或Lib16或Lib64)子目录中找到其源代码。

因此,让我们看一下ReadInt中的Lib32\Irvine32.asm过程。如您所见,它只是读取一个字符串,然后调用另一个名为ParseInteger32的过程来解析该字符串的内容。

ParseInteger32有一个循环L5,在其中处理数字,如果在该循环中检测到溢出,它将跳至标签L7,从字符串" <32-bit integer overflow>"开始将被打印,然后是回车和换行符。

这些函数似乎都不采用任何控制是否应打印该字符串的参数。因此,如果要避免打印溢出字符串,则必须修改Irvine源代码并重建库。