Проверьте, приводит ли пользовательский ввод к переполнению - PullRequest
1 голос
/ 04 июня 2019

У меня проблемы с проверкой, установлен ли флаг переполнения после того, как пользователь ввел число без знака

Я попытался с помощью 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 Ответ

2 голосов
/ 04 июня 2019

TL; DR: Вот как это должно быть.


Если мы предположим, что вы используете библиотеку Кипа Ирвина, то вы можете найти ее исходный код вПодкаталог Lib32 (или Lib16 или Lib64) любого каталога, в который вы установили библиотеку Irvine.

Итак, давайте посмотрим на ReadInt процедуру в Lib32\Irvine32.asm.Как вы можете видеть, он просто читает строку, а затем вызывает другую процедуру с именем ParseInteger32 для анализа содержимого этой строки.

ParseInteger32 имеет цикл L5, где он обрабатывает цифры и, если переполнениеобнаруженный в этом цикле, он перейдет к метке L7, откуда будет напечатана строка " <32-bit integer overflow>", за которой следует возврат каретки и перевод строки.

Ни одна из этих функций не принимает какой-либо параметр, которыйопределяет, должна ли эта строка печататься.Поэтому, если вы хотите избежать печати строки переполнения, вам придется изменить исходный код Irvine и перестроить библиотеку.

...