почему при делении выбивает?

Тема в разделе "WASM.BEGINNERS", создана пользователем sheef_ad, 21 фев 2010.

  1. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    простейший код:
    Код (Text):
    1.         mov ebx,min
    2.         mov eax,max
    3.         sub eax,ebx
    4.         mov ebx,2
    5.         div ebx
    И вот на диве падает в дебаг, причем дебагер все правильно показывает (имеется ввиду результат в eax и остаток в edx)? Может есть какая то хитрость в использовании div о которой я незнаю?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sheef_ad
    Код (Text):
    1. IF Operandsize = 32 (* Quadword/doubleword operation *)
    2. THEN
    3. temp ← EDX:EAX / SRC;
    4. IF temp > FFFFFFFFH
    5. THEN #DE; (* Divide error *)
    6. ELSE
    7. EAX ← temp;
    8. EDX ← EDX:EAX MOD SRC;
    9. FI;
    10. FI;
    xor edx,edx
     
  3. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Я так понимаю этот ответ влез сюда случайно...
     
  4. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Вот оно. Этого было достаточно чтобы заработало... Спасибо
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sheef_ad
    Точнее вопрос тут ваш случайно, прежде чем юзать инструкцию следует изучить как она работает и нюансы, особенно касательно защиты(исключений).
    Intel® 64 and IA-32 Architectures Software Developer’s Manual, V2.3-262
     
  6. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Ну так форум тоже для этого создан. Я просто непонял что это было в вашем ответе (думал сервер нетуда ответ всунул пока непопробывал xor edx,edx).
    Ведь зачем читать толстенную книжку, если тебе, как простому любителю, большая часть инфы будет лишняя на данном этапе.
    Еще раз спасибо. Я просто неправильно выразился.
     
  7. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Clerk +100

    sheef_ad
    Можно подумать, что на дворе 1989 и текстового поиска по документам не существует.
    Да необязательно читать толстенную книгу, но раз уж встретилась ошибка, то сначала надо почитать инструкции(кстати есть коротенькие). А уж если задавать вопрос, то давать текст ошибки.
    Если бы вы подумали над сообщением дебаггера, то и вопросов бы не было.
    А для чего создан форум, какие вопросы можно задавать - есть специальная тема, почитайте на досуге и не превращайте вопросы новичков в вопросы от детсада.
     
  8. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Читал. А какие вы хотите видеть вопросы? Что то наподобии " В книге n написано n, но оно неработает, нужно еще десятка два книг - может там никаких нюансов непропустили...". Это я пишу к тому, что я облазил штук 10 самоучителей по асму (из разных источников) и НИГДЕ об этом ни кто ничего не сказал. Конечно можно сказать что я не там роюсь, но подумайте насчет избыточности информации - явление признаное всеми... Если вы ни хотите отвечать на вопросы для "детсада", то ни кто ни кого за язык не тянет. Не отвечайте.

    "Настали тяжелые времена - прогневались боги, дети перестли слушать родителей и каждый стремится написать книгу..."
    Пословица древнего Вавилона (500 в. до н.э.)
     
  9. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Отмазка ваша крайне неуклюжа. Если я правильно понял, вам нужно разделить было eax на ebx. А вы использовали инструкцию, которая делит edx:eax на еbx.
    Так что ваше оправдание, как гвоздь в пятке.
     
  10. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Вы неправильно поняли. Я использовал именно ту инструкцию которая была необходима. Как можно делить edx? Я конечно не профи, но в edx насколько я понимаю, всегда остаток. делимое eax делитель ebx в eax же часное. Это из кода видно.

    П.с. Закончили с оправданиями и с полемикой. Мне помогли - спасибо. Считайте меня неправым. Извиняюсь.
     
  11. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Полемику закончили. Но коли вы такой покладистый, то вот вам ещё тонкий намёк:
    Желаю удачи.
     
  12. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    бред упрямца не читающего описания инструкций

    в edx остаток после операции, до операции там ДОЛЖНО быть старшее слово от делимого размером в двойное слово - всегда если у вас 32 разрядный делитель
     
  13. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Вот. Можно было сразу так ответить и все столо бы ясно:). То, что очевидно для Вас, для начинающих может быть совсем неочевидно. Именно я и спросил за нюансы. Собственно и тема была создана для того, чтобы получить подобный ответ, то есть человеческим языком, а не хитрыми инструкциями интела, которые я поначалу принял вообще текстом "не в тему"... Недорос я еще до них. Неужели это преступление для новичка?
    ну вам виднее... Спасибо, теперь я точно понял в чем суть.
     
  14. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    sheef_ad
    мой последний вам совет
    почитайте мануалы интела очень въедливо (ну или справку от масма 611 на худой конец)- это будет для вас откровением
     
  15. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Согласен, что мы тоже невнимательно читали.
    Но вас разве не удивляет мнемоника DIV EBX( а не DIV EAX,EBX - которая у вас в уме) ?

    А виновато то, что сделало Интел и Микрософт миллиардерами - приницип совместимости со "старым".
    86-й - это было 16-битное расширение 8-битных процов, а нужна была уже 32-битная арифметика.
    Вот и сделали "длинное" деление : dx:ax / src Так и тянется эта история до сих пор.
    А интерпретировать странную мнемонику Интела самому - плохая практика.
     
  16. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Спасибо за разтолкование. Просто сложно перестраиваться с языков высокого уровня, где простые операции делаются просто и в голову прийти мне не могло что иногда деление в асме делается не просто через div. Хотя в этом я и увидел плюс асма, даже мелочь можно сделать "посвоему", а не так, как придумал Ричи и Страуструп...
    Еще раз спасибо.
     
  17. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    sheef_ad
    А иногда вообще не через div, по крайней мере такой код, как у тебя:
    Код (Text):
    1. mov ebx,2
    2. div ebx
    ни один нормальный компилятор не сгенерит, т.к. для деления на степень двойки вместо тормозной div юзаются быстрые команды сдвига sar\shr, а для определения\проверки остатка - and\test
    PS: Ну дык может и не надо перестраиваться, раз так "сложно" ?! ;)
     
  18. Dukales

    Dukales New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2009
    Сообщения:
    199
    ТС по-моему прав в своих высказываниях. Накинулись на него зачем? Травля какая-то. Всё он верно говорит.