падение при выполнении команды div

Тема в разделе "WASM.ASSEMBLER", создана пользователем isolp, 29 дек 2008.

  1. isolp

    isolp New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2008
    Сообщения:
    10
    в каких случаях после выполнения команды div прога ее вызвавшая будет прервана по ошибке ?
    команда mov ecx, ecx != 0
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    когда результат не помещается в приемник
     
  3. isolp

    isolp New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2008
    Сообщения:
    10
    спасибо, уже сам тоже разобрался
    если результат больше 32бит, то integer overflow
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    только если делитель 32битный
     
  5. 1212

    1212 New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2009
    Сообщения:
    21
    ледите за содержимом регистра DX или EDX. Оно болжно быть при выполнении команды DIV равнятся 0.
    Желаю успехов!
     
  6. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    неправильный это подход.
    т.е. это 100% гарантия что переполнения не произойдёт, но если EDX не равно нулю это ещё не значит что переполнение будет.
     
  7. 1212

    1212 New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2009
    Сообщения:
    21
    неправильный это подход.
    т.е. это 100% гарантия что переполнения не произойдёт, но если EDX не равно нулю это ещё не значит что переполнение будет.


    от1212
    Вы совершенно правы, но для случая деления на константу. Если делитель переменная и может приобретать произвольные значения, случайно, то гарантированно будет когда DX(EDX) равен 0. Дело в том, что DX/EDX является расширением аккумулятора АХ/ЕАХ и участвует в выполнении операции деления, являясь расширенным числителем. Так уж придумал Intel.
    Желаю успехов.
     
  8. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    А вы о переименовании регистров ничего не слыхали? Внутренних регистров гораздо больше чем программных и в Pentium как минимум два! АЛУ т.е. два аккомулятора...
    По­скольку разрядность делимого в два раза больше возможной разрядности частного, то возни­кает ряд ситуаций, когда процессор вместо деления генерирует исключения по перепол­нению. Для того чтобы избежать подобных ситуаций, полезно вставлять перед командами DIV и IDIV соответствующую проверку. В случае деления слова на байт предпо­ложим, что DIVBYTE — однобайтовый делитель, а делимое находится уже в регистре AX. В случае деления учетверенного слова на двойное слово предполо­жим, что DIVDWORD — четырехбайтовый делитель, а делимое находится в регистровой паре EDX:EAX.
    Код (Text):
    1. ;слово на байт
    2. CMP AH,DIVBYTE
    3. JNB переполнение
    4. DIV DIVBYTE
    5. . . .
    6. ;учетверенное слово на двойное
    7. cmp edx,DIVDWORD
    8. jnb переполнение
    9. DIV DIVDWORD
     
  9. Andie

    Andie New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2008
    Сообщения:
    51
    Читаем классиков: http://z0mbie.host.sk/idiv_r.txt

    IMHO, одна из подробнейших инструкций на манер работы DIV
     
  10. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Моя лепта в это дело.
    Переполнение возникнет в 2-х случаях:
    1. делитель равен нулю
    2. содержимое DX (EDX/AH) больше или равно содержимого делителя word (dword/byte)

    Баста. Других вариантов нет.
     
  11. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    Andie
    Спасибо, за статьи z0mbie, едва нашел среди них