17.08.2017, 14:47 [+3 UTC]
в нашей команде: 2 091 чел. | участники онлайн: 6 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.41 (25.02.2017)

Общие новости:
23.02.2017, 09:51

Форум:
17.08.2017, 14:22

Последний вопрос:
16.08.2017, 15:26

Последний ответ:
16.08.2017, 17:10

Последняя рассылка:
17.08.2017, 13:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
11.11.2010, 22:54 »
Detsle
Грамотно, подробно и разборчиво smile спасибо) [вопрос № 180688, ответ № 263964]
24.11.2009, 14:39 »
AnarHist
Полезный познавательный ресурс. Пожалуй, зарегистрируюсь.
13.05.2010, 17:15 »
prolang
другого ответа просто не будет [вопрос № 178267, ответ № 261368]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 355
Зенченко Константин Николаевич
Статус: Модератор
Рейтинг: 314
quirck
Статус: 1-й класс
Рейтинг: 51

Перейти к консультации №:
 

Консультация онлайн # 191266
Раздел: • Assembler
Автор вопроса: oldoldspice (Посетитель)
Отправлена: 05.08.2017, 14:22
Поступило ответов: 1

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

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

Состояние: Консультация закрыта

Здравствуйте, 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 - маловероятны, т.к. процессоры уже не те smile ;
4 - это не арифметическая команда - отпадает;
3 - прерывание специально вызывается после арифметической команды - отпадает;
2 - трассировочное прерывание, о состоянии флага TF - ничего не сказано(если его не перепутали с IF) - отпадает;
1 - деление на 0 - самое вероятное событие, т.к. переполнение происходит постоянно и его можно программно отловить с помощью флага CF. Анализируя программно флаги SF и OF можно принять решение о достоверности результата операции.


Консультировал: Зенченко Константин Николаевич (Модератор)
Дата отправки: 08.08.2017, 19:16

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 191266

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 1

 +2 
 
= общий = | 05.08.2017, 14:36 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
oldoldspice:

Например, из-за деления на 0
Фрагмент кода можете показать?
Или это чисто теоретический вопрос?

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

• Отредактировал: Лысков Игорь Витальевич (Старший модератор)
• Дата редактирования: 05.08.2017, 15:04

Зенченко Константин Николаевич
Модератор

ID: 31795

# 2

 +1 
 
= общий = | 05.08.2017, 19:03 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
oldoldspice:

ZF и SF, эти флаги противоположности, второй копирует старший бит регистра, а первый, если все биты нулевые будет введен. smile

Зенченко Константин Николаевич
Модератор

ID: 31795

# 3

 +1 
 
= общий = | 07.08.2017, 09:53 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
oldoldspice:

© Цитата:
ZF=1, OF=1, SF=1, AF = 1

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

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

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

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 4

 +1 
 
= общий = | 07.08.2017, 11:03 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Зенченко Константин Николаевич:

Согласен, флаги ZF и SF одновременно быть равными 1 не могут.
Странный вопрос... Может в том и соль, чтобы определить невозможность ситуации?

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

Зенченко Константин Николаевич
Модератор

ID: 31795

# 5

 +1 
 
= общий = | 07.08.2017, 11:43 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

© Цитата: Лысков Игорь Витальевич
Странный вопрос.

Более чем.
Интересно, в какой книге так пишут о флагах?

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 6

= общий = | 07.08.2017, 12:12 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Зенченко Константин Николаевич:

Чего-то автор вопроса не сильно балует нас своим присутствием... smile

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

Зенченко Константин Николаевич
Модератор

ID: 31795

# 7

= общий = | 07.08.2017, 12:19 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Лысков Игорь Витальевич:

Ага, я посчитал по времени, вопрос задал и пропал.
smile

oldoldspice
Посетитель

ID: 401267

# 8

= общий = | 07.08.2017, 13:43 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Это теоретический вопрос.

oldoldspice
Посетитель

ID: 401267

# 9

= общий = | 07.08.2017, 13:45 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Судя по всему здесь ответ такой: OF = 1, следовательно прерывание из-за переполнения.

oldoldspice
Посетитель

ID: 401267

# 10

= общий = | 07.08.2017, 13:46 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Или из-за деления на 0.

oldoldspice
Посетитель

ID: 401267

# 11

= общий = | 07.08.2017, 13:46 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Большое спасибо за ответы!

oldoldspice
Посетитель

ID: 401267

# 12

= общий = | 07.08.2017, 13:50 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Этот вопрос взят мной не из книги.

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 13

 +1 
 
= общий = | 07.08.2017, 14:13 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
oldoldspice:

Вызывает смущение заявленное:

© Цитата:
установились следующие признаки регистра состояний: ZF=1, OF=1, SF=1, AF = 1

Это невозможно в принципе для ZF и SF. Объяснение выше.

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

Зенченко Константин Николаевич
Модератор

ID: 31795

# 14

 +1 
 
= общий = | 07.08.2017, 15:44 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
oldoldspice:

Судя по Вашим вопросам и уточнениям Вы сейчас смотрите эти исключения:

© Цитата:
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, т.к. в последующих процессорах сопроцессор был уже встроен в процессор.

Зенченко Константин Николаевич
Модератор

ID: 31795

# 15

 +1 
 
= общий = | 07.08.2017, 16:05 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
oldoldspice:

И так, начнем:
5 и 6 - маловероятны, т.к. процессоры уже не те smile ;
4 - это не арифметическая команда - отпадает;
3 - прерывание специально вызывается после арифметической команды - отпадает;
2 - трассировочное прерывание, о состоянии флага TF - ничего не сказано(если его не перепутали с IF) - отпадает;
1 - деление на 0 - самое вероятное событие.

oldoldspice
Посетитель

ID: 401267

# 16

= общий = | 08.08.2017, 18:19 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Большое вам спасибо за ответы!

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.13957 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.41 от 25.02.2017
Бесплатные консультации онлайн