【问题标题】:Check if user input leads to overflow检查用户输入是否导致溢出
【发布时间】:2019-06-03 21:53:27
【问题描述】:

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

我尝试使用 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_:

它似乎有效,但它一直显示&lt;32-bit integer overflow&gt;。它是否正常工作或出现问题?有什么方法可以停止显示&lt;32-bit integer overflow&gt; 还是应该这样?

【问题讨论】:

  • 没有看到ReadInt没人能回答。

标签: assembly x86 masm irvine32 masm32


【解决方案1】:

TL;DR:应该是这样的。


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

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

ParseInteger32 有一个循环L5 处理数字,如果在该循环中检测到溢出,它将跳转到标签L7,从那里打印字符串" &lt;32-bit integer overflow&gt;",后跟一个回车返回和换行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2012-08-17
    • 2020-08-18
    • 2023-03-27
    相关资源
    最近更新 更多