![]() |
|
![]() ![]() ![]() |
|
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
В каком регистре CPU фиксируется деление целого на ноль того же типа?
|
|||
|
||||
AndNot |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 28.2.2008 Репутация: нет Всего: нет |
Ни в каком. При делении на ноль процессор генерирует исключение. Перехватывай INT 0. На 8086 в него передается адрес следующей за делением команды, а в 286-м и выше - адрес команды деления на ноль.
|
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
FCM,
В операциях деления предполагается, что частное значительно меньше, чем делимое. Деление на 1, например, может также вызвать переполнение, так как частное равно делителю, поэтому рекомендуется следующее правило: если делитель – байт, то его значение должно быть меньше чем старший байт делителя (содержимое регистра ah); если делитель – двойное слово, то его значение должно быть меньше чем старшее двойное слово делителя (содержимое регистра edx). Деление на 0 сработает при div/idiv ah, div/idiv dx, div/idiv edx при любом содержимом ah/dx/edx ![]() |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Т.е. получается, что исключение целочисленого деления на ноль генерируется CPU в рез-те операций, которые в ассемблированном виде имеют вид " div/idiv ah, div/idiv dx, div/idiv edx при любом содержимом ah/dx/edx" и ни в каком флаге CPU это событие не отражается?
(С другой стороны целочисленный overflow фиксируется CPU, но самостоятельно CPU такое исключение не генерит.) Это сообщение отредактировал(а) FCM - 11.11.2009, 09:33 |
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
FCM,
Вы ответили моим ответом на свой вопрос -- какой ответ вы еще ждете? ![]() |
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Ваш ответ несколько необычен для моего восприятия (поскольку в основном программирую на языках высокого уровня), поэтому и "переспросил". PS/ есть одна древняя притча, мораль которой такова: "Даже в самой очевидной ситуации есть хотя бы один незнакомый аспект". А уж к программированию это относится стократно. |
|||
|
||||
AndNot |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 28.2.2008 Репутация: нет Всего: нет |
В корне неверно. При чем тут "div ah" и прочие? Тебе это привели только для примера возникновения переполнения. Пойми одну простую вещь. Делимое всегда в два раза больше делителя, а результат всегда должен быть равен, по размеру, делителю. Поэтому возможны случаи возникновения переполнения результата. Для примера раздели 600 на 2. Если использовать команду деления на БАЙТ, то возникнет переполнение (300 не уместится в регистр AL). Если же делить на СЛОВО, то переполнения не будет, поскольку 300 легко умещается в регистр AX. Выставляется флаг OVERFLOW, в регистре флагов. Но тебе он вряд ли поможет, поскольку будет доступен только в обработчике исключения, а тот по умолчанию выведет сообщение о делении на ноль и подвесит программу.
|
|||
|
||||
FCM |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Так как же на самом деле? Меня как раз все это интересует со стороны С++ и со стороны исключений (SEH, C++) |
|||
|
||||
111u3 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 31.8.2009 Где: Омск Репутация: нет Всего: нет |
FCM, если обратится к интеловским манам то можно найти следующее; Overflow is indicated with the #DE (divide error)
exception rather than with the CF flag. т.е. тебе остается ловить это исключение. |
|||
|
||||
AndNot |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 28.2.2008 Репутация: нет Всего: нет |
На самом деле сам факт всплытия обработчика исключения 0 свидетельствует о некорректной операции деления и проверять флаги уже нет нужды. Что и делают стандартные обработчики - просто прикрывают программу (или вешают комп). Можно конечно в обработчике проанализировать опкод и если возможно, то выполнить деление повторно, расширив разрядность операндов. Но это рискованно - еще одна ошибка и получим другое исключение - двойной отказ, а это уже серьезно, поскольку малейшая ошибка уже приведет к отключению процессора.
|
|||
|
||||
111u3 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 31.8.2009 Где: Омск Репутация: нет Всего: нет |
AndNot, ну допустим если быть точным двойной отказ получить в этом случае крайне трудно - так он появляется только если во время одного исключения словили другое(вернее из другого класса) это я точно говорю (это так прописано в манах и работает на практике) ну а SEH и настроить можно равно как и другие инструменты для подобных ситуаций.
|
|||
|
||||
AndNot |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 28.2.2008 Репутация: нет Всего: нет |
А я разве не об этом говорил?
![]()
|
|||
|
||||
Mikl_ |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 9.11.2007 Репутация: 6 Всего: 14 |
FCM, а вот так нельзя? Допустим делитель в ebx
![]() |
|||
|
||||
111u3 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 31.8.2009 Где: Омск Репутация: нет Всего: нет |
AndNot, не совсем верно - получить 2 исключение ни во время обработки 1, а сразу после него перед заходом в обработчик и то для каждого конкретного случая есть свои оссобенности. Я вон поток #GP ловил один за другим и не разу двойного не было. а вот когда во время исключения #GP я #PG хватанул тогда проц и перезагрузился причем без захода в обработчики #GP и #PG(на двойном исключении у меня тогда ничего не стояло). + никто не заставляет автора поста лезть в обработчики idt - его ос туда не пустит(по крайней мере за так). А SEH пишут когда данное событие не должно происходить но происходит по причине "отсутствия настроения у ос рано утром". И еще не все обработчики допускают обработку во вне.
респект Mikl_ - зачем гемороится с исключениями когда можно ловить 0 до деления. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |