простейший код: Код (Text): mov ebx,min mov eax,max sub eax,ebx mov ebx,2 div ebx И вот на диве падает в дебаг, причем дебагер все правильно показывает (имеется ввиду результат в eax и остаток в edx)? Может есть какая то хитрость в использовании div о которой я незнаю?
sheef_ad Код (Text): IF Operandsize = 32 (* Quadword/doubleword operation *) THEN temp ← EDX:EAX / SRC; IF temp > FFFFFFFFH THEN #DE; (* Divide error *) ELSE EAX ← temp; EDX ← EDX:EAX MOD SRC; FI; FI; xor edx,edx
sheef_ad Точнее вопрос тут ваш случайно, прежде чем юзать инструкцию следует изучить как она работает и нюансы, особенно касательно защиты(исключений). Intel® 64 and IA-32 Architectures Software Developer’s Manual, V2.3-262
Ну так форум тоже для этого создан. Я просто непонял что это было в вашем ответе (думал сервер нетуда ответ всунул пока непопробывал xor edx,edx). Ведь зачем читать толстенную книжку, если тебе, как простому любителю, большая часть инфы будет лишняя на данном этапе. Еще раз спасибо. Я просто неправильно выразился.
Clerk +100 sheef_ad Можно подумать, что на дворе 1989 и текстового поиска по документам не существует. Да необязательно читать толстенную книгу, но раз уж встретилась ошибка, то сначала надо почитать инструкции(кстати есть коротенькие). А уж если задавать вопрос, то давать текст ошибки. Если бы вы подумали над сообщением дебаггера, то и вопросов бы не было. А для чего создан форум, какие вопросы можно задавать - есть специальная тема, почитайте на досуге и не превращайте вопросы новичков в вопросы от детсада.
Читал. А какие вы хотите видеть вопросы? Что то наподобии " В книге n написано n, но оно неработает, нужно еще десятка два книг - может там никаких нюансов непропустили...". Это я пишу к тому, что я облазил штук 10 самоучителей по асму (из разных источников) и НИГДЕ об этом ни кто ничего не сказал. Конечно можно сказать что я не там роюсь, но подумайте насчет избыточности информации - явление признаное всеми... Если вы ни хотите отвечать на вопросы для "детсада", то ни кто ни кого за язык не тянет. Не отвечайте. "Настали тяжелые времена - прогневались боги, дети перестли слушать родителей и каждый стремится написать книгу..." Пословица древнего Вавилона (500 в. до н.э.)
Отмазка ваша крайне неуклюжа. Если я правильно понял, вам нужно разделить было eax на ebx. А вы использовали инструкцию, которая делит edx:eax на еbx. Так что ваше оправдание, как гвоздь в пятке.
Вы неправильно поняли. Я использовал именно ту инструкцию которая была необходима. Как можно делить edx? Я конечно не профи, но в edx насколько я понимаю, всегда остаток. делимое eax делитель ebx в eax же часное. Это из кода видно. П.с. Закончили с оправданиями и с полемикой. Мне помогли - спасибо. Считайте меня неправым. Извиняюсь.
бред упрямца не читающего описания инструкций в edx остаток после операции, до операции там ДОЛЖНО быть старшее слово от делимого размером в двойное слово - всегда если у вас 32 разрядный делитель
Вот. Можно было сразу так ответить и все столо бы ясно. То, что очевидно для Вас, для начинающих может быть совсем неочевидно. Именно я и спросил за нюансы. Собственно и тема была создана для того, чтобы получить подобный ответ, то есть человеческим языком, а не хитрыми инструкциями интела, которые я поначалу принял вообще текстом "не в тему"... Недорос я еще до них. Неужели это преступление для новичка? ну вам виднее... Спасибо, теперь я точно понял в чем суть.
sheef_ad мой последний вам совет почитайте мануалы интела очень въедливо (ну или справку от масма 611 на худой конец)- это будет для вас откровением
Согласен, что мы тоже невнимательно читали. Но вас разве не удивляет мнемоника DIV EBX( а не DIV EAX,EBX - которая у вас в уме) ? А виновато то, что сделало Интел и Микрософт миллиардерами - приницип совместимости со "старым". 86-й - это было 16-битное расширение 8-битных процов, а нужна была уже 32-битная арифметика. Вот и сделали "длинное" деление : dx:ax / src Так и тянется эта история до сих пор. А интерпретировать странную мнемонику Интела самому - плохая практика.
Спасибо за разтолкование. Просто сложно перестраиваться с языков высокого уровня, где простые операции делаются просто и в голову прийти мне не могло что иногда деление в асме делается не просто через div. Хотя в этом я и увидел плюс асма, даже мелочь можно сделать "посвоему", а не так, как придумал Ричи и Страуструп... Еще раз спасибо.
sheef_ad А иногда вообще не через div, по крайней мере такой код, как у тебя: Код (Text): mov ebx,2 div ebx ни один нормальный компилятор не сгенерит, т.к. для деления на степень двойки вместо тормозной div юзаются быстрые команды сдвига sar\shr, а для определения\проверки остатка - and\test PS: Ну дык может и не надо перестраиваться, раз так "сложно" ?!
ТС по-моему прав в своих высказываниях. Накинулись на него зачем? Травля какая-то. Всё он верно говорит.