О переполнении (overflow) в регистрах.

Тема в разделе "WASM.BEGINNERS", создана пользователем mr.en3mY, 4 янв 2018.

  1. mr.en3mY

    mr.en3mY New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2017
    Сообщения:
    16
    Ребят подскажите пожалуйста какие существуют алгоритмы по работе с числами дабы избежать переполнения? Как мы знаем в команде mov одним из операндов по-любому должен быть регистр, но предположим в двойном слове (32 бита) можно хранить без знаковое число 4 294 967 295, но что предположим делать если я хочу хранить в константе число 5 000 000 000? как работать с такими числами в регистрах и как их хранить? Буду очень благодарен за ответ, строго не судите я в этом дело новичок.:help:
     
  2. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Для этого используются более сложные структуры данных, такие как BigInteger, и пишутся специальные функции для их сложения, вычитания, умножения, деления и т.д.
     
  3. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    287
    Использовать несколько регистров, в которых хранить старшую и младшую часть числа. Также смотреть на флаги: cf, of, sf
     
  4. acckiitvar

    acckiitvar Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    71
    Если вы работаете в long mode, вы можете спокойно использовать 64 битные регистры и не думать особо. В других режимах используются регистр флагов и команды учитывающие флаг cf, например adc.
     
  5. mr.en3mY

    mr.en3mY New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2017
    Сообщения:
    16
    Нет, я работаю в обычных extended 32х-битовых регистрах, про флаги переноса, знака и переполнения я знаю но вопрос был в другом, существуют ли более емкие константы может быть какие нибудь алгоритмы для хранения более крупных чисел, как в плюсах, int, double, long, float?
     
  6. mr.en3mY

    mr.en3mY New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2017
    Сообщения:
    16
    BigInteger в ассемблере? Есть пример?
     
  7. mr.en3mY

    mr.en3mY New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2017
    Сообщения:
    16
    Как я понимаю это единственный способ при работе с регистрами? Большее число впихнуть все равно не получится?

    Если на моем примере взять число 5000000000:

    mov eax, 4000000000
    mov ebx, 1000000000

    и что дальше?
    Если сложить то будет перенос старшего разряда в флаг Cf. Как сложить и как хранить это число 5000000000? Подразумевая что работа идет в 32х битовых регистрах.
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    mr.en3mY,
    sse юзай. Там уже по пол-килобайта в один регистр запихать можно.
     
    mr.en3mY нравится это.
  9. HESH

    HESH Active Member

    Публикаций:
    2
    Регистрация:
    20 мар 2008
    Сообщения:
    143
    Совсем необязательно. Возьми, например команду mov такого формата: mov dword ptr ds:[memory], const и она прекрасно отработает.

    Как вариант.

    Можно заюзать математический сопроцессор. Там так же используются данные размером dword(4bytes), qword(8bytes), tbyte(10bytes). И объявляются так:

    asd dword 3.14
    asd2 qword 1234567890123456h
    asd3 tbyte -1.15
    asd4 tbyte ?

    Следует отметить, что с обычными регистрами дроби особо не насчитаешься, зато сопроцессором - легко. Например:

    finit ; init
    fild asd2 ; st(0) = asd2
    fdiv asd ; st(0) = asd2 / asd
    fstp asd4 ; asd4 = asd2 / asd , st(0) = free

    Без него не обойтись, когда начнешь использовать GDI-шное рисование..
     
    mr.en3mY нравится это.
  10. FeD

    FeD New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2017
    Сообщения:
    5
    Не совсем так. Хранится не как сумма, а именно старшая и младшая часть.

    mov eax, 705032704
    mov edx, 1

    Буфер обмена02.jpg upload_2018-1-4_13-56-21.png

    Есть хорошая ссылка по теме: http://x86asm.net/articles/working-with-big-numbers-using-
     
    Последнее редактирование: 4 янв 2018
    mr.en3mY нравится это.
  11. HESH

    HESH Active Member

    Публикаций:
    2
    Регистрация:
    20 мар 2008
    Сообщения:
    143
    Так извращаться в диапазоне qword не имеет смысла, IMHO.
     
  12. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    удолил. Прекращайте десятичные числа в асме использовать :)

    HESH,
    Это не извращения, а как раз штатный способ представления больших чисел. И инструкции процессора на это заточены.
     
    mr.en3mY нравится это.
  13. HESH

    HESH Active Member

    Публикаций:
    2
    Регистрация:
    20 мар 2008
    Сообщения:
    143
    В этом сомнений нет.

    Больших насколько ? А как насчет точки ?

    P.S. Я не говорю, что подход неверен. Я хочу сказать, что за один такт эффективнее будет использование qword вместо dword. Ведь и dword может стать большим числом, если пользоваться 8-битными регистрами.
     
  14. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Там не больших, а больших :) Больше регистра, разумеется.
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Тс, это троллинг такой? Есть флаг переноса, команды adc, sbb, алгоритмы длинной арифметики, читай, практикуйся
     
  16. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    mr.en3mY,

    Арифметика с плавающей запятой, это же ведь основы. 64 битами описываются астрономические" значения, при этом манипуляции данными вычислениями очень просты и эффективны.
     
    HESH нравится это.
  17. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    мож SSE заюзать и иже с ним вам?
     
  18. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    RET,

    А ничего, что указана разрядность, но не архитектура. Какой ссе к примеру на x32 pic ?

    Обычно вне платформ используются общие флоатинг поинт сишные библиотеки, в которых эти вычисления реализованы с нуля.
     
  19. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    287
    x86 в контексте прозвучала
     
    Indy_ нравится это.
  20. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    287
    mr.en3mY,
    > в команде mov одним из операндов по-любому должен быть регистр
    Необязательно кст, можно и так:
    Код (ASM):
    1. mov DWORD ptr[0x00], 0x00