Консультация № 191266
05.08.2017, 14:22
0.00 руб.
0 17 1
Здравствуйте!
Возник следующий вопрос:
В какое состояние перейдет процессор Pentium IA-32, если в результате
выполнения арифметической операции с целыми числами со знаком
установились следующие признаки регистра состояний: ZF=1, OF=1, SF=1, AF = 1?
Известно, что процессор установит флаг IF=1, переключится на программу обработки арифметического прерывания. Вопрос почему?

Т.е. на каком основании (из-за чего) произойдет прерывание?

Обсуждение

давно
Посетитель
7438
7205
05.08.2017, 14:36
общий
05.08.2017, 15:04
Адресаты:
Например, из-за деления на 0
Фрагмент кода можете показать?
Или это чисто теоретический вопрос?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
05.08.2017, 19:03
общий
Адресаты:
ZF и SF, эти флаги противоположности, второй копирует старший бит регистра, а первый, если все биты нулевые будет введен.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
07.08.2017, 09:53
общий
Адресаты:
ZF=1, OF=1, SF=1, AF = 1

Такое сочетание флагов получить никак не смог, как не крутил арифметику.
Может я чего-то не знаю, покажите пожалуйста свой код,
Все потому, что
Цитата: Зенченко Константин Николаевич
ZF и SF, эти флаги противоположности, второй копирует старший бит регистра, а первый, если все биты нулевые будет взведен

т.е. если ZF=1, то все биты регистра должны быть равны 0, в том числе и старший знаковый бит.
если SF=1, т.е. знаковый бит равен 1, и соответственно число не может быть равным нулю и ZF=0.

Флаг IF=1 всегда взведен, по умолчанию, т.е. разрешены аппаратные прерывания и управляется он командами CLI (IF=0) и STI (IF=1), этими командами можно запретить/разрешить аппаратные прерывания, во время выполнения кода, который нельзя прерывать, т.е. так называемого критического кода
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
07.08.2017, 11:03
общий
Адресаты:
Согласен, флаги ZF и SF одновременно быть равными 1 не могут.
Странный вопрос... Может в том и соль, чтобы определить невозможность ситуации?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
07.08.2017, 11:43
общий
Адресаты:
Цитата: Лысков Игорь Витальевич
Странный вопрос.

Более чем.
Интересно, в какой книге так пишут о флагах?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
07.08.2017, 12:12
общий
Адресаты:
Чего-то автор вопроса не сильно балует нас своим присутствием...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
07.08.2017, 12:19
общий
Адресаты:
Ага, я посчитал по времени, вопрос задал и пропал.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401267
7
07.08.2017, 13:43
общий
Это теоретический вопрос.
давно
Посетитель
401267
7
07.08.2017, 13:45
общий
Судя по всему здесь ответ такой: OF = 1, следовательно прерывание из-за переполнения.
давно
Посетитель
401267
7
07.08.2017, 13:46
общий
Или из-за деления на 0.
давно
Посетитель
401267
7
07.08.2017, 13:46
общий
Большое спасибо за ответы!
давно
Посетитель
401267
7
07.08.2017, 13:50
общий
Этот вопрос взят мной не из книги.
давно
Посетитель
7438
7205
07.08.2017, 14:13
общий
Адресаты:
Вызывает смущение заявленное:
установились следующие признаки регистра состояний: ZF=1, OF=1, SF=1, AF = 1

Это невозможно в принципе для ZF и SF. Объяснение выше.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
07.08.2017, 15:44
общий
Адресаты:
Судя по Вашим вопросам и уточнениям Вы сейчас смотрите эти исключения:
1) #DE (деление на ноль) - INT 0 - ошибка, появляющаяся при переполнении и делении на ноль;
2) #DB (прерывание трассировки) - INT 1 - ловушка, возникающая после выполнения каждой команды, если флаг TF установлен в 1. Используется отладчиками, действующими в реальном режиме;
3) #OF (переполнение) — INT 4 - ловушка, возникающая после выполнения команды INTO, если флаг OF установлен;
4) #BR (переполнение при BOUND) - INT 5 - происходит при выполнении команды BOUND;
5) #UD (недопустимая команда) - INT 6 - ошибка, возникающая при попытке выполнить команду, отсутствующую на данном процессоре;
6) #NM (сопроцессор отсутствует) - INT 7 - ошибка, появляющаяся при попытке выполнить команду FPU, если FPU отсутствует.

1) прервет работу программы, если делитель будет равен 0 или произойдет переполнение после операций со знаковыми числами;
2) процессор переводится в режим, в котором после выполнения любой команды будет вызван обработчик-ловушка;
3) ещё один обработчик-ловушка, для вызова которой нужно выполнять INT0, это придумано так, чтобы контролировать работу со знаковыми числами. Процессору безразлично с какими числами работать, для него все числа без знака, и он применяет к ним обычную арифметику. Для контроля знаковых чисел есть флаг OF, он устанавливается в 1, если был перенос в знаковый бит, то команда INT0, после арифметической команды вызовет этот обработчик.
4) возникает, когда индекс не попадает в указанный интервал. Обработчик этого исключения должен будет исправить индекс и снова попытается выполнить эту команду;
5 ) ошибка связанная с поколениями процессоров, т.к. от поколения к поколению система команд увеличивается, к примеру попытка выполнить код процессора х286, на х86;
6) ошибка тоже связанная с поколениями процессоров, но она актуальна, только для х86, х186, х286, т.к. в последующих процессорах сопроцессор был уже встроен в процессор.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
07.08.2017, 16:05
общий
Адресаты:
И так, начнем:
5 и 6 - маловероятны, т.к. процессоры уже не те ;
4 - это не арифметическая команда - отпадает;
3 - прерывание специально вызывается после арифметической команды - отпадает;
2 - трассировочное прерывание, о состоянии флага TF - ничего не сказано(если его не перепутали с IF) - отпадает;
1 - деление на 0 - самое вероятное событие.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401267
7
08.08.2017, 18:19
общий
Большое вам спасибо за ответы!
давно
Старший Модератор
31795
6196
08.08.2017, 19:16
общий
это ответ
Здравствуйте, oldoldspice!

Флаги SF и ZF, противоположности, они не могут быть одновременно равны 1.

Судя по Вашим вопросам и уточнениям Вы сейчас смотрите эти исключения:
1) #DE (деление на ноль) - INT 0 - ошибка, появляющаяся при переполнении и делении на ноль;
2) #DB (прерывание трассировки) - INT 1 - ловушка, возникающая после выполнения каждой команды, если флаг TF установлен в 1. Используется отладчиками, действующими в реальном режиме;
3) #OF (переполнение) — INT 4 - ловушка, возникающая после выполнения команды INTO, если флаг OF установлен;
4) #BR (переполнение при BOUND) - INT 5 - происходит при выполнении команды BOUND;
5) #UD (недопустимая команда) - INT 6 - ошибка, возникающая при попытке выполнить команду, отсутствующую на данном процессоре;
6) #NM (сопроцессор отсутствует) - INT 7 - ошибка, появляющаяся при попытке выполнить команду FPU, если FPU отсутствует.

1) прервет работу программы, если делитель будет равен 0 или произойдет переполнение после операций со знаковыми числами;
2) процессор переводится в режим, в котором после выполнения любой команды будет вызван обработчик-ловушка;
3) ещё один обработчик-ловушка, для вызова которой нужно выполнять INT0, это придумано так, чтобы контролировать работу со знаковыми числами. Процессору безразлично с какими числами работать, для него все числа без знака, и он применяет к ним обычную арифметику. Для контроля знаковых чисел есть флаг OF, он устанавливается в 1, если был перенос в знаковый бит, то команда INT0, после арифметической команды вызовет этот обработчик.
4) возникает, когда индекс не попадает в указанный интервал. Обработчик этого исключения должен будет исправить индекс и снова попытается выполнить эту команду;
5 ) ошибка связанная с поколениями процессоров, т.к. от поколения к поколению система команд увеличивается, к примеру попытка выполнить код процессора х286, на х86;
6) ошибка тоже связанная с поколениями процессоров, но она актуальна, только для х86, х186, х286, т.к. в последующих процессорах сопроцессор был уже встроен в процессор.

И так, начнем:
5 и 6 - маловероятны, т.к. процессоры уже не те ;
4 - это не арифметическая команда - отпадает;
3 - прерывание специально вызывается после арифметической команды - отпадает;
2 - трассировочное прерывание, о состоянии флага TF - ничего не сказано(если его не перепутали с IF) - отпадает;
1 - деление на 0 - самое вероятное событие, т.к. переполнение происходит постоянно и его можно программно отловить с помощью флага CF. Анализируя программно флаги SF и OF можно принять решение о достоверности результата операции.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа