Warning: Declaration of JDocumentRendererAtom::render() should be compatible with JDocumentRenderer::render($name, $params = Array, $content = NULL) in /var/www/u1741842/public_html/club155.ru/libraries/joomla/document/feed/renderer/atom.php on line 33
Club155.ru Club155.ru! - собрание справочной информации по программированию и схемотехнике (ассемблер x86, диоды, транзисторы, схемы) http://www.club155.ru 2024-05-02T00:43:17Z Введение 2011-06-14T14:58:54Z 2011-06-14T14:58:54Z http://www.club155.ru/index.php?option=com_content&view=article&id=44&catid=31 Administrator admin@club155.ru <p> </p> <p style="text-align: justify;">Самый ранний из описываемых микропроцессоров — 8086, был полностью 16-разрядным прибором, ориентированным на использование в универсальных вычислительных устройствах в качестве одиночного центрального процессорного устройства (CPU). Этот микропроцессор имел 16-разрядные внутренние регистры, 16-разрядные внутренние и внешние шины данных и мог адресовать до 1 Мб физической памяти. Производительность микропроцессора 8086 могла достигать 0,8 MIPS (млн. операций в секунду).</p> <p style="text-align: justify;">В 1982 году Intel внесла значительные усовершенствования в архитектуру x86 и выпустила новый микропроцессор Intel286. Он также был полностью 16-разрядным, однако, мог адресовать до 16 Мб физической памяти и имел специальный защищенный режим работы, в котором обеспечивались гибкие механизмы адресации, управления доступом к памяти, управления привилегиями и т.п. Система команд этого микропроцессора также была существенно расширена. Его быстродействие достигало уже 2,7 MIPS.</p> <p style="text-align: justify;">Еще большие нововведения в архитектуру x86 были воплощены в процессоре Intel386, который вышел в 1985 году. Это был полностью 32-разрядный микропроцессор, который имел 32-разрядные внутренние регистры и 32-разрядные шины данных. Адресное пространство микропроцессора Intel386 было по тем временам просто безграничным — 4 Гб. Были добавлены также: специальный страничный механизм и новый режим работы — V86, который обеспечивал совместимость данного микропроцессора с программами, написанными для предыдущих устройств серии. Внутренняя микроархитектура микропроцессора Intel386 также была уникальной — она впервые позволяла осуществлять параллельное выполнение нескольких действий (выборка команд и данных, декодирование команд, исполнение команд и т.п.), чем обеспечивалось увеличение быстродействия до 6 MIPS. Примерно в это же время была разработана новая ОС для персональных компьютеров, построенных на микропроцессорах x86 — Windows. С тех пор пара Windows–Intel настолько популярна и неразлучна, что для обозначения архитектуры x86 даже появился новый термин — Wintel.</p> <p style="text-align: justify;">Развитие микроэлектронных технологий позволило существенно повысить вместимость кристаллов электронных схем. В 1989 году появился микропроцессор Intel486. Он содержал интегрированное устройство вычислений с плавающей точкой (FPU) и внутреннюю КЭШ-память для данных и команд. Было также повышено быстродействие процессора (в т.ч. и за счет совершенствования микроархитектуры, которая позволяла еще более запаралелить выполнение многих действий внутри микропроцессора).</p> <p style="text-align: justify;">В 1993 году вышел первый микропроцессор семества P5. Микропроцессор Pentium имел значительно усовершенствованную микроархитектуру. Теперь устройство целочисленных вычислений имело два практически идентичных блока, в которых различные команды могли выполняться параллельно. Были усовершенствованы модули, отвечающие за выборку и декодирование команд, они стали более интеллектуальными и пытались прогнозировать действия процессора, осуществляя предвыборку и преддекодирование команд еще до получения результатов предыдущих команд. Устройство вычислений с плавающей запятой было существенно переработано для достижения большего быстродействия. Были внесены некоторые доработки и в программную архитектуру процессора: появилась поддержка страниц большого размера, режим V86 стал более гибким при обработке прерываний, а средства внутренней самодиагностики вышли из зачаточного состояния. Быстродействие первых процессоров Pentium могло достигать 100 MIPS.</p> <p style="text-align: justify;">C 1993 по 1997 гг. фирма Intel продолжала усовершенствование архитектуры своих процессоров. Был выпущен Pentium Pro — микропроцессор микроархитектуры P6, которая стала основой и для более поздних микропроцессоров. Уже не два, а четыре внутренних модуля параллельно осуществляли выполнение команд, предвыборка дополнилась многими интелектуальными функциями, такими как предсказание ветвлений и т.п. Внутренняя КЭШ-память стала двухуровневой, что позволило, с одной стороны, увеличить ее объем, а с другой обеспечить разумную стоимость микропроцессора. Новая расширенная система команд для обработки мультимедийной информации (MMX) была введена в новые модели микропроцессоров Pentium и Pentium Pro.</p> <p style="text-align: justify;">Современная индустрия микропроцессоров практически прекратила развивать 32-разрядные архитектуры x86 (получив здесь сильнейшего конкурента в лице архитектуры ARM) и переключилась на новый сегмент 64-разрядных архитектур. Последними из существенных нововведений 32-разрядного сегмента стали новые так называемые SIMD (или SSE) команды, впервые введеные в микропроцессоре Pentium III. Однако все эти усовершенствования и потрясающие возможности с программной точки зрения все равно базируются на стандартной архитектуре x86, которая существует уже более 30 лет.</p> <p style="text-align: justify;">Основные элементы архитектуры <span style="mso-ansi-language: EN-US;" lang="EN-US">x</span>86 последовательно описываются в следующих разделах.</p> <ul> <li> <p><a href="http://www.club155.ru/index.php?Itemid=63" title="Система команд x86"><strong>Система команд</strong> </a>– здесь содержится подробная информация обо всех командах процессоров архитектуры x86, в т.ч. и о расширенных наборах команд MMX, 3DNow!, и SIMD (SSE). Для каждой команды указаны выполняемые ей действия и возможные последствия ее применения в различных ситуациях, даны комментарии и рекомендации.</p> </li> <li> <p><a href="http://www.club155.ru/x86internalreg-common" title="Внутренние регистры"><strong>Внутренние регистры</strong></a>– содержит описание всех внутренних регистров процессоров. К ним относятся регистры общего назначения, сегментные регистры, регистры управления и отладки, системные регистры, регистры математического сопроцессора, а также некоторые регистры специального назначения</p> </li> <li> <p><a href="http://www.club155.ru/x86addr-logicaladdress" title="Адресация и многозадачность"><strong>Механизмы адресации, управления памятью, поддержки многозадачности и защиты</strong> </a>– посвящена описанию работы механизма адресации процессора в различных режимах. Также описан страничный механизм, механизм поддержки многозадачности и средства защиты, приведены форматы всех элементов системной архитектуры</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации"><strong>Прерывания, исключения и особые ситуации</strong></a> – содержит подробное описание действий процессора по обработке прерываний и особых ситуаций. Приведены все возможные причины их генерации и протокол реакции процессора на их возникновение. Также описаны исключения математического сопроцессора и исключения для команд потоковой обработки SIMD (SSE).</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=69" title="Форматы данных"><strong>Форматы данных</strong></a>– это описание всех применяемых в архитектуре x86 форматов данных. Здесь представлены как форматы для целочисленной арифметики, так и для арифметики с плавающей запятой, описание данных для команд MMX, 3DNow, SIMD (SSE).</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=73" title="Форматы команд"><strong>Форматы команд</strong></a>– содержит информацию о кодировании команд. Здесь описаны все возможные форматы для кодов команд процессора, приведено назначение и правила кодирования отдельных полей.</p> </li> </ul> <p> </p> <p style="text-align: justify;">С момента появления самого первого микропроцессора архитектуры x86 самые разнообразные фирмы по всему миру производят разработку совместимых устройств. Такие микропроцессоры, как правило, полностью копируют архитектуру приборов Intel и совместимы с программным обеспечением для них.</p> <p style="text-align: justify;">Микропроцессоры-клоны существуют для всех устройств серии x86. В различные периоды из них были наиболее известны: MII (Cyrix, IBM), K6 (AMD), Winchip (IDT) и некоторые другие. Специфика этих микропроцессоров в том, что они предназначались для применения в промышленном оборудовании и недорогих компьютерах средней производительности и не претендовали на лидерство в сфере мощных многопроцессорных сверхвысокопроизводительных систем. До определенного времени производители клонов лишь шли по стопам Intel, производя устройства максимально приближенные по своим характеристикам к приборам Intel и не содержащие никаких структурных расширений. Нововведением стал шаг фирмы AMD, которая разработала и реализовала в своих микропроцессорах новую расширенную систему команд 3DNow! Это расширение было поддержано и другими производителями. Intel, однако, не стала копировать разработки AMD и ввела в свои новые микропроцессоры другое расширение, называемое SIMD или SSE. Впоследствии большинство команд 3DNow! были реализованы в составе новых расширений SSE2 и SSE3, которые появились в процессорах Intel начиная с Pentium IV.</p> <p style="text-align: justify;">Как правило, фирмы производители заявляют о полной совместимости своих изделий с микропроцессорами Intel, однако, как показывает практика, поведение клонов может отличаться от поведения приборов Intel (например, в случае конкурирующих прерываний). Тем не менее, в подавляющем большинстве случаев все что изложено на данном сайте о процессорах Intel верно и для их аналогов производства других фирм.</p> <p> </p> <!-- <p align="center">{jumi [adabracadabra.php]}</p> --> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;">Самый ранний из описываемых микропроцессоров — 8086, был полностью 16-разрядным прибором, ориентированным на использование в универсальных вычислительных устройствах в качестве одиночного центрального процессорного устройства (CPU). Этот микропроцессор имел 16-разрядные внутренние регистры, 16-разрядные внутренние и внешние шины данных и мог адресовать до 1 Мб физической памяти. Производительность микропроцессора 8086 могла достигать 0,8 MIPS (млн. операций в секунду).</p> <p style="text-align: justify;">В 1982 году Intel внесла значительные усовершенствования в архитектуру x86 и выпустила новый микропроцессор Intel286. Он также был полностью 16-разрядным, однако, мог адресовать до 16 Мб физической памяти и имел специальный защищенный режим работы, в котором обеспечивались гибкие механизмы адресации, управления доступом к памяти, управления привилегиями и т.п. Система команд этого микропроцессора также была существенно расширена. Его быстродействие достигало уже 2,7 MIPS.</p> <p style="text-align: justify;">Еще большие нововведения в архитектуру x86 были воплощены в процессоре Intel386, который вышел в 1985 году. Это был полностью 32-разрядный микропроцессор, который имел 32-разрядные внутренние регистры и 32-разрядные шины данных. Адресное пространство микропроцессора Intel386 было по тем временам просто безграничным — 4 Гб. Были добавлены также: специальный страничный механизм и новый режим работы — V86, который обеспечивал совместимость данного микропроцессора с программами, написанными для предыдущих устройств серии. Внутренняя микроархитектура микропроцессора Intel386 также была уникальной — она впервые позволяла осуществлять параллельное выполнение нескольких действий (выборка команд и данных, декодирование команд, исполнение команд и т.п.), чем обеспечивалось увеличение быстродействия до 6 MIPS. Примерно в это же время была разработана новая ОС для персональных компьютеров, построенных на микропроцессорах x86 — Windows. С тех пор пара Windows–Intel настолько популярна и неразлучна, что для обозначения архитектуры x86 даже появился новый термин — Wintel.</p> <p style="text-align: justify;">Развитие микроэлектронных технологий позволило существенно повысить вместимость кристаллов электронных схем. В 1989 году появился микропроцессор Intel486. Он содержал интегрированное устройство вычислений с плавающей точкой (FPU) и внутреннюю КЭШ-память для данных и команд. Было также повышено быстродействие процессора (в т.ч. и за счет совершенствования микроархитектуры, которая позволяла еще более запаралелить выполнение многих действий внутри микропроцессора).</p> <p style="text-align: justify;">В 1993 году вышел первый микропроцессор семества P5. Микропроцессор Pentium имел значительно усовершенствованную микроархитектуру. Теперь устройство целочисленных вычислений имело два практически идентичных блока, в которых различные команды могли выполняться параллельно. Были усовершенствованы модули, отвечающие за выборку и декодирование команд, они стали более интеллектуальными и пытались прогнозировать действия процессора, осуществляя предвыборку и преддекодирование команд еще до получения результатов предыдущих команд. Устройство вычислений с плавающей запятой было существенно переработано для достижения большего быстродействия. Были внесены некоторые доработки и в программную архитектуру процессора: появилась поддержка страниц большого размера, режим V86 стал более гибким при обработке прерываний, а средства внутренней самодиагностики вышли из зачаточного состояния. Быстродействие первых процессоров Pentium могло достигать 100 MIPS.</p> <p style="text-align: justify;">C 1993 по 1997 гг. фирма Intel продолжала усовершенствование архитектуры своих процессоров. Был выпущен Pentium Pro — микропроцессор микроархитектуры P6, которая стала основой и для более поздних микропроцессоров. Уже не два, а четыре внутренних модуля параллельно осуществляли выполнение команд, предвыборка дополнилась многими интелектуальными функциями, такими как предсказание ветвлений и т.п. Внутренняя КЭШ-память стала двухуровневой, что позволило, с одной стороны, увеличить ее объем, а с другой обеспечить разумную стоимость микропроцессора. Новая расширенная система команд для обработки мультимедийной информации (MMX) была введена в новые модели микропроцессоров Pentium и Pentium Pro.</p> <p style="text-align: justify;">Современная индустрия микропроцессоров практически прекратила развивать 32-разрядные архитектуры x86 (получив здесь сильнейшего конкурента в лице архитектуры ARM) и переключилась на новый сегмент 64-разрядных архитектур. Последними из существенных нововведений 32-разрядного сегмента стали новые так называемые SIMD (или SSE) команды, впервые введеные в микропроцессоре Pentium III. Однако все эти усовершенствования и потрясающие возможности с программной точки зрения все равно базируются на стандартной архитектуре x86, которая существует уже более 30 лет.</p> <p style="text-align: justify;">Основные элементы архитектуры <span style="mso-ansi-language: EN-US;" lang="EN-US">x</span>86 последовательно описываются в следующих разделах.</p> <ul> <li> <p><a href="http://www.club155.ru/index.php?Itemid=63" title="Система команд x86"><strong>Система команд</strong> </a>– здесь содержится подробная информация обо всех командах процессоров архитектуры x86, в т.ч. и о расширенных наборах команд MMX, 3DNow!, и SIMD (SSE). Для каждой команды указаны выполняемые ей действия и возможные последствия ее применения в различных ситуациях, даны комментарии и рекомендации.</p> </li> <li> <p><a href="http://www.club155.ru/x86internalreg-common" title="Внутренние регистры"><strong>Внутренние регистры</strong></a>– содержит описание всех внутренних регистров процессоров. К ним относятся регистры общего назначения, сегментные регистры, регистры управления и отладки, системные регистры, регистры математического сопроцессора, а также некоторые регистры специального назначения</p> </li> <li> <p><a href="http://www.club155.ru/x86addr-logicaladdress" title="Адресация и многозадачность"><strong>Механизмы адресации, управления памятью, поддержки многозадачности и защиты</strong> </a>– посвящена описанию работы механизма адресации процессора в различных режимах. Также описан страничный механизм, механизм поддержки многозадачности и средства защиты, приведены форматы всех элементов системной архитектуры</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации"><strong>Прерывания, исключения и особые ситуации</strong></a> – содержит подробное описание действий процессора по обработке прерываний и особых ситуаций. Приведены все возможные причины их генерации и протокол реакции процессора на их возникновение. Также описаны исключения математического сопроцессора и исключения для команд потоковой обработки SIMD (SSE).</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=69" title="Форматы данных"><strong>Форматы данных</strong></a>– это описание всех применяемых в архитектуре x86 форматов данных. Здесь представлены как форматы для целочисленной арифметики, так и для арифметики с плавающей запятой, описание данных для команд MMX, 3DNow, SIMD (SSE).</p> </li> <li> <p><a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=73" title="Форматы команд"><strong>Форматы команд</strong></a>– содержит информацию о кодировании команд. Здесь описаны все возможные форматы для кодов команд процессора, приведено назначение и правила кодирования отдельных полей.</p> </li> </ul> <p> </p> <p style="text-align: justify;">С момента появления самого первого микропроцессора архитектуры x86 самые разнообразные фирмы по всему миру производят разработку совместимых устройств. Такие микропроцессоры, как правило, полностью копируют архитектуру приборов Intel и совместимы с программным обеспечением для них.</p> <p style="text-align: justify;">Микропроцессоры-клоны существуют для всех устройств серии x86. В различные периоды из них были наиболее известны: MII (Cyrix, IBM), K6 (AMD), Winchip (IDT) и некоторые другие. Специфика этих микропроцессоров в том, что они предназначались для применения в промышленном оборудовании и недорогих компьютерах средней производительности и не претендовали на лидерство в сфере мощных многопроцессорных сверхвысокопроизводительных систем. До определенного времени производители клонов лишь шли по стопам Intel, производя устройства максимально приближенные по своим характеристикам к приборам Intel и не содержащие никаких структурных расширений. Нововведением стал шаг фирмы AMD, которая разработала и реализовала в своих микропроцессорах новую расширенную систему команд 3DNow! Это расширение было поддержано и другими производителями. Intel, однако, не стала копировать разработки AMD и ввела в свои новые микропроцессоры другое расширение, называемое SIMD или SSE. Впоследствии большинство команд 3DNow! были реализованы в составе новых расширений SSE2 и SSE3, которые появились в процессорах Intel начиная с Pentium IV.</p> <p style="text-align: justify;">Как правило, фирмы производители заявляют о полной совместимости своих изделий с микропроцессорами Intel, однако, как показывает практика, поведение клонов может отличаться от поведения приборов Intel (например, в случае конкурирующих прерываний). Тем не менее, в подавляющем большинстве случаев все что изложено на данном сайте о процессорах Intel верно и для их аналогов производства других фирм.</p> <p> </p> <!-- <p align="center">{jumi [adabracadabra.php]}</p> --> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Внутренние регистры: Регистры общего назначения 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-common Administrator admin@club155.ru <p> </p> <p style="text-align: justify;"><strong><em>Регистры общего назначения</em></strong> предназначены для хранения операндов и результатов команд, также они могут использоваться для <a href="http://www.club155.ru/index.php?Itemid=483" title="Логический адрес">формирования адреса</a> при обращении к данным в памяти. Формат регистров общего назначения приведен на рис. 1.1.</p> <p> </p> <!--<p align="center">{pdf=http://club155.ru/images/x86_images/1-1_RON.pdf|500|354}</p>--> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-1_RON.svgz" width="400" height="251" alt="Формат регистров общего назначения"/> </p> <p class="a" style="text-align: center;"><strong><em>Рис. 1.1. Формат регистров общего назначения</em></strong></p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;"><strong><em>Регистры общего назначения</em></strong> предназначены для хранения операндов и результатов команд, также они могут использоваться для <a href="http://www.club155.ru/index.php?Itemid=483" title="Логический адрес">формирования адреса</a> при обращении к данным в памяти. Формат регистров общего назначения приведен на рис. 1.1.</p> <p> </p> <!--<p align="center">{pdf=http://club155.ru/images/x86_images/1-1_RON.pdf|500|354}</p>--> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-1_RON.svgz" width="400" height="251" alt="Формат регистров общего назначения"/> </p> <p class="a" style="text-align: center;"><strong><em>Рис. 1.1. Формат регистров общего назначения</em></strong></p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Внутренние регистры: Сегментные регистры 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-segment Administrator admin@club155.ru <p> </p> <p style="text-align: justify;"><strong><em>Сегментные регистры</em></strong> используются при формировании полного <a href="http://www.club155.ru/index.php?Itemid=483" title="Логический адрес">логического адреса</a>. Они содержат <a href="http://www.club155.ru//x86addr-selectors" title="Адресация и многозадачность: Селекторы">селекторы сегментов</a>, которые используются процессором при доступе к данным, стеку и коду. Формат сегментных регистров приведен на рис. 1.2.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-2_SegR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-2_SegR.svgz" width="450" height="166" alt="Формат сегментных регистров"/> </p> <p align="center"><strong><em>Рис. 1.2. Формат сегментных регистров</em></strong></p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;"><strong><em>Сегментные регистры</em></strong> используются при формировании полного <a href="http://www.club155.ru/index.php?Itemid=483" title="Логический адрес">логического адреса</a>. Они содержат <a href="http://www.club155.ru//x86addr-selectors" title="Адресация и многозадачность: Селекторы">селекторы сегментов</a>, которые используются процессором при доступе к данным, стеку и коду. Формат сегментных регистров приведен на рис. 1.2.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-2_SegR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-2_SegR.svgz" width="450" height="166" alt="Формат сегментных регистров"/> </p> <p align="center"><strong><em>Рис. 1.2. Формат сегментных регистров</em></strong></p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Внутренние регистры: Регистр флагов 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-eflags Administrator admin@club155.ru <p>&nbsp;</p> <p style="text-align: justify;"><strong><em>Регистр флагов EFLAGS</em></strong> отражает текущее состояние процессора, многие из его битов устанавливаются после выполнения операций и индицируют тип, полученного результата. Формат регистра флагов приведен на рис. 1.3.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-3_EFLAGS.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/1-3_EFLAGS.svgz" alt="Формат регистра флагов" width="540" height="393" /></p> <p align="center"><strong><em>Рис. 1.3. Формат регистра флагов</em></strong></p> <p>&nbsp;</p> <p><a name="CF"></a><strong>CF</strong> (Флаг переноса, бит 0)</p> <p style="text-align: justify;"><em>Флаг переноса</em> фиксирует значение <em>переноса</em> (<em>заема</em>), возникающего при сложении (вычитании). Иногда используется и в других ситуациях.</p> <p>&nbsp;</p> <p><a name="PF"></a><strong>PF</strong> (Флаг четности, бит 2)</p> <p style="text-align: justify;"><em>Флаг четности</em> фиксирует наличие четного числа единиц в младшем байте результата операции, может быть использован, например, для контроля правильности передачи данных.</p> <p>&nbsp;</p> <p><a name="AF"></a><strong>AF</strong> (Флаг вспомогательного переноса, бит 4)</p> <p style="text-align: justify;"><em>Флаг вспомогательного переноса</em> фиксирует <em>перенос</em> (<em>заем</em>) из младшей тетрады, т.е. из бита 3 в старшую тетраду при сложении (вычитании). Используется только для двоично-десятичной арифметики, которая оперирует исключительно младшими байтами.</p> <p>&nbsp;</p> <p><a name="ZF"></a><strong>ZF</strong> (Флаг нуля, бит 6)</p> <p style="text-align: justify;"><em>Флаг нуля</em> сигнализирует о получении нулевого (<strong>ZF</strong> = 1) или ненулевого (<strong>ZF</strong>&nbsp;=&nbsp;0) результата операции.</p> <p>&nbsp;</p> <p><a name="SF"></a><strong>SF</strong> (Флаг знака, бит 7)</p> <p style="text-align: justify;"><em>Флаг знака</em> дублирует значение старшего бита результата, который при использовании дополнительного кода соответствует знаку числа (0 &ndash; положительное число, 1 &ndash; отрицательное).</p> <p>&nbsp;</p> <p><a name="TF"></a><strong>TF</strong> (Флаг трассировки, бит 8)</p> <p style="text-align: justify;">При установке <em>флага трассировки&nbsp;</em><strong>TF</strong> = 1, микропроцессор переходит в <strong>пошаговый режим работы</strong>, применяемый при отладке программ, когда автоматически генерируется&nbsp;<a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 &mdash; Прерывание отладки (#DB)">особая ситуация отладки (#DB)</a> после выполнения каждой команды. Прерывание отладки начнет генерироваться, если прикладная программа установит флаг <strong>TF</strong> с помощью команд <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a> или <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a>.</p> <p>&nbsp;</p> <p><a name="IF"></a><strong>IF</strong> (Флаг разрешения прерываний, бит 9)</p> <p style="text-align: justify;">При установке <em>флага разрешения прерываний</em> <strong>IF</strong> = 1, микропроцессор воспринимает (распознает) и соответственно реагирует на запрос прерывания по входу <strong>INTR#</strong> (<a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внешние маскируемые прерывания</a>). При <strong>IF</strong> = 0, прерывания по этому входу запрещаются и микропроцессор игнорирует поступающие запросы прерываний.</p> <p style="text-align: justify;">Значение флага <strong>IF</strong> не влияет на восприятие <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внешних немаскируемых прерываний</a> по входу <strong>NMI#</strong>, а также <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внутренних программных прерываний</a>, выполняемых по команде <a href="http://www.club155.ru/x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT</a>.</p> <p style="text-align: justify;">Изменение этого флага командами <a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a>, <a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>, <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a> и&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a> возможно не всегда и определяется текущими:</p> <ul> <li><a href="http://www.club155.ru//x86addr-lineaddress" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режимом работы процессора</a>;</li> <li><a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">уровнем привилегий</a> выполняемого кода (<strong>CPL</strong>);</li> <li><a href="http://www.club155.ru//x86internalreg-eflags#IOPL" title="Внутренние регистры: Регистр флагов - IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)">уровнем привилегий ввода/вывода</a> (поле <strong>IOPL</strong>);</li> <li>значением флага <a href="http://www.club155.ru//x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a> (отвечает за активацию специального <a href="http://www.club155.ru//x86exceptions-protectedmode#pvi" title="Прерывания и особые ситуации: Защищенный режим - Режим с поддержкой виртуальных флагов прерываний">режима с поддержкой виртуальных флагов прерываний</a> в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>).</li> <li>значением флага <a href="http://www.club155.ru//x86internalreg-control#CR4VME" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a> (отвечает за активацию специального <a href="http://www.club155.ru//x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86">режима виртуальных прерываний</a> в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>);</li> </ul> <p>&nbsp;</p> <p style="text-align: justify;">При обычной обработке прерываний (<a href="http://www.club155.ru//x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;0 в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> или <a href="http://www.club155.ru//x86internalreg-control#CR4VME" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a>&nbsp;=&nbsp;0 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>), когда <strong>IOPL</strong> &lt; <strong>CPL</strong> ( <strong>IOPL</strong> &lt; 3 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>), все попытки изменения флага <strong>IF</strong> командами <a href="http://www.club155.ru//x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>, <a href="http://www.club155.ru//x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a>, <a href="http://www.club155.ru//x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a> и&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a> вызывают генерацию <a href="http://www.club155.ru//x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибки общей защиты (#GP)</a>.</p> <p style="text-align: justify;">Когда же <em>виртуальные прерывания</em> инициализированы (<a href="http://www.club155.ru//x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;1 в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> или <a href="http://www.club155.ru//x86internalreg-control#CR4VME" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a>&nbsp;=&nbsp;1 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>) при выполнении того же условия <strong>IOPL</strong> &lt; <strong>CPL</strong> ( <strong>IOPL</strong> &lt; 3 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>) команды <a href="http://www.club155.ru//x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a> и <a href="http://www.club155.ru//x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a> оказывают влияние на флаг <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>, а флаг <strong>IF</strong> при этом остается неизменным. Флаг <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a> используется всеми командами (в т.ч. <a href="http://www.club155.ru//x86cmd/PUSHF" title="PUSHF - Поместить в стек значение регистра FLAGS">PUSHF</a>, <a href="http://www.club155.ru//x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>), которые пытаются изменять или считывать значение флага <strong>IF</strong>. Только значение флага <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a> будет всякий раз изменяться и считываться программой. При поступлении <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внешнего маскируемого прерывания</a> процессор производит стандартное обращение к обработчику прерываний защищенного режима через <a href="http://www.club155.ru//x86internalreg-system#IDTR" title="Внутренние регистры: Системные регистры - Регистр таблицы дескрипторов прерываний IDTR">таблицу дескрипторов прерываний</a> (<strong>IDT</strong>). При этом, при записи в стек значения регистра <a href="http://www.club155.ru//x86internalreg-eflags" title="Регист флагов">EFLAGS</a> процессор записывает поле <a href="http://www.club155.ru//x86internalreg-eflags#IOPL" title="Внутренние регистры: Регистр флагов - IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)">IOPL</a> равным 3 и флаг <strong>IF</strong> равным <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a>.</p> <p>&nbsp;</p> <p><a name="DF"></a><strong>DF</strong> (Флаг направления, бит 10)</p> <p style="text-align: justify;"><em>Флаг направления</em> определяет порядок обработки цепочек в соответствующих командах (строковые команды: <a href="http://www.club155.ru/x86cmd/STOS" title="STOS - Сохранить элемент строки данных">STOS</a>, <a href="http://www.club155.ru/x86cmd/LODS" title="LODS - Загрузить строковый операнд">LODS</a>, <a href="http://www.club155.ru/x86cmd/CMPS" title="CMPS - Сравнить строковые операнды">CMPS</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/OUTS" title="OUTS - Вывод строки в порт">OUTS</a> и т.д.) &mdash; от меньших адресов к большим (<strong>DF</strong> = 0) или от больших к меньшим (<strong>DF</strong> = 1).</p> <p>&nbsp;</p> <p><a name="OF"></a><strong>OF</strong> (Флаг переполнения, бит 11)</p> <p style="text-align: justify;"><em>Флаг переполнения</em> сигнализирует о потере старшего бита результата в связи с переполнением разрядной сетки при работе со знаковыми числами. При сложении этот флаг устанавливается в 1, если происходит перенос в старший бит и нет переноса из старшего бита, или имеется перенос из старшего бита, но отсутствует перенос в него; в противном случае, флаг <strong>OF</strong> устанавливается в 0. При вычитании он устанавливается в 1, когда возникает заем из старшего бита, но заем в старший бит отсутствует, либо имеется заем в старший бит, но отсутствует заем из него.</p> <p>&nbsp;</p> <p><a name="IOPL"></a><strong>IOPL</strong> (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)</p> <p style="text-align: justify;">Поле <em>уровня привилегий ввода/вывода</em> (<em>Input/output Privilege Level &ndash;</em> <strong>IOPL</strong>) используется <a href="http://www.club155.ru//x86addr-protection" title="Адресация и многозадачность: Механизм защиты">механизмом защиты</a> для управления доступом к адресному пространству ввода/вывода и <a href="http://www.club155.ru/x86exceptions-types#soft" title="Прерывания и особые ситуации: Типы прерываний - Программные прерывания">программным прерываниям</a>. Ряд команд, называемых <strong><em>IOPL-чувствительными командами</em></strong> (<em>IOPL-sensitive instructions</em>), могут выполняться по-разному в зависимости от текущего <a href="http://www.club155.ru//x86addr-lineaddress" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режима работы процессора</a> и значения поля <strong>IOPL</strong>.</p> <p style="text-align: justify;">В&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>&nbsp;к <em>IOPL-чувствительным командам</em> относятся команды&nbsp;<a href="http://www.club155.ru//x86cmd/IN" title="IN - Ввод из порта">IN</a>, <a href="http://www.club155.ru//x86cmd/OUT" title="OUT - Вывод в порт">OUT</a>, <a href="http://www.club155.ru//x86cmd/INS" title="INS - Ввод из порта в строку">INS</a>/<a href="http://www.club155.ru//x86cmd/INSB" title="INSB - Ввод байта из порта в строку">NSB</a>/<a href="http://www.club155.ru//x86cmd/INSW" title="INSW - Ввод слова из порта в строку">INSW</a>/<a href="http://www.club155.ru//x86cmd/INSD" title="INSD - Ввод двойного слова из порта в строку">INSD</a>, <a href="http://www.club155.ru//x86cmd/OUTS" title="OUTS - Вывод строки в порт">OUTS</a>/<a href="http://www.club155.ru//x86cmd/OUTSB" title="OUTSB - Вывод байта в порт">OUTSB</a>/<a href="http://www.club155.ru//x86cmd/OUTSW" title="OUTSW - Вывод слова в порт">OUTSW</a>/<a href="http://www.club155.ru//x86cmd/OUTSD" title="OUTSD - Вывод двойного слова в порт">OUTSD</a>, <a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>&nbsp;и префикс <a href="http://www.club155.ru//x86cmd/LOCK" title="LOCK - Префикс выдачи сигнала блокировки шины LOCK#">LOCK</a> (только на процессоре Intel286). Всякий раз, когда программа осуществляет чтение/запись в <em>порты ввода/вывода </em>либо <em>разрешение/запрещение прерываний</em> указанными командами, процессор осуществляет специальную проверку привилегий. В зависимости от текущего значения поля <strong>IOPL</strong> и <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">текущего уровня привилегий</a> (<strong>CPL</strong>), <a href="http://www.club155.ru//x86addr-protection" title="Адресация и многозадачность: Механизм защиты">механизмом защиты</a>&nbsp;может генерироваться&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" style="text-decoration: underline; line-height: 16.8px; text-align: justify;" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особая ситуация общей защиты (#GP)</a>.&nbsp;Если <strong>CPL</strong> &le; <strong>IOPL</strong>, то команда исполняется в соответствии со своим назначением (как и в <a href="http://www.club155.ru//x86addr-lineaddress#real" title=" Адресация и многозадачность: Правила формирования линейного и физического адреса - Реальный режим">режиме реальной адресации</a>). Если <strong>CPL</strong> &gt; <strong>IOPL</strong>&nbsp;в&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>&nbsp;(а также всегда в&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">режиме V86</a>), производится дополнительная проверка доступности соответствующего <em>порта ввода/вывода</em> при любых операциях с ним. Такая проверка использует специальную&nbsp;<a href="http://www.club155.ru//x86addr-tss#inoutcart" title="Адресация и многозадачность: Сегмент состояния задачи (TSS) - Карта разрешения ввода/вывода">карту разрешения ввода/вывода</a>, которая расположена в верхней части <a href="http://www.club155.ru//x86addr-tss" title="Адресация и многозадачность: Сегмент состояния задачи (TSS)">сегмента состояния задачи TSS</a> и определяет доступность всех&nbsp;<em>портов ввода/вывода</em>. В случае недоступности порта или при попытках разрешения/запрещения прерываний командами&nbsp;<a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>, когда <strong>CPL</strong>&nbsp;&gt;&nbsp;<strong>IOPL</strong>, процессор генерирует&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" style="text-decoration: underline; text-align: justify; line-height: 16.8px;" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибку общей защиты (#GP)</a>.</p> <p style="text-align: justify;">Изменение <em>уровня привилегий ввода/вывода</em>&nbsp;<strong>IOPL</strong> возможно командами <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a> и&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a>&nbsp;в&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>&nbsp;и только&nbsp;при выполнении команды на <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">уровне привилегий</a>, по крайней мере таком же (а для команды <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>&nbsp;только на&nbsp;<a href="http://www.club155.ru//x86addr-protection#segprot" style="line-height: 16.8px; text-align: justify;" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">нулевом</a>), как и текущий <em>уровень привилегий ввода/вывода</em> (<a href="http://www.club155.ru//x86addr-lineaddress#real" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Реальный режим">режим реальной адресации</a> эквивалентен <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">нулевому уровню привилегий</a>).</p> <p style="text-align: justify;">При работе в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>&nbsp;(<a href="http://www.club155.ru//x86internalreg-eflags" title="Внутренние регистры: Регистр флагов">EFLAGS.VM</a>&nbsp;=&nbsp;1)&nbsp;<em>IOPL-чувствительными</em> являются команды&nbsp;<a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/PUSHF" title="Поместить в стек значение регистра FLAGS">PUSHF</a>/<a href="http://www.club155.ru/x86cmd/PUSHFD" title="Поместить в стек значение регистра EFLAGS">PUSHFD</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT n</a>. У каждой из этих команд имеется аналогичная зависимость от текущего значения поля <strong>IOPL</strong>. Например, команда&nbsp;<a href="http://www.club155.ru//x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT n</a>&nbsp;вызывает генерацию <a href="http://www.club155.ru//x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особой ситуации общей защиты (#GP)</a>, если&nbsp;<strong>IOPL</strong> &lt; 3, или выполняется <a href="http://www.club155.ru/x86exceptions-types#soft" title="Прерывания и особые ситуации: Типы прерываний - Программные прерывания">программное прерывание</a>&nbsp;(при&nbsp;<strong>IOPL</strong> = 3).</p> <p style="text-align: justify;">В&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#protected" style="line-height: 16.8px; text-align: justify;" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>&nbsp;команда&nbsp;<a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>&nbsp;является одновременно зависимой и от&nbsp;<em>уровня привилегий ввода/вывода</em> <strong>IOPL</strong>, и от&nbsp;<a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">текущего уровня привилегий</a>&nbsp;(<strong>CPL</strong>), позволяя изменять поле&nbsp;<strong>IOPL</strong> только при выполнении на&nbsp;<a href="http://www.club155.ru//x86addr-protection#segprot" style="line-height: 16.8px; text-align: justify;" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">нулевом уровне привилегий</a>&nbsp;(<strong>CPL</strong>&nbsp;=&nbsp;0), а <em>флаг разрешения прерываний</em> <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">IF</a> &mdash; только при условии <strong>CPL</strong>&nbsp;&le; <strong>IOPL</strong>. Однако, если эта команда не может изменить указанное поле или флаг из-за недостаточности <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">текущих привилегий</a>, то генерации&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особой ситуации общей защиты (#GP)</a>&nbsp;не происходит&nbsp;&mdash; продолжается выполнение последующих команд. Это поведение меняется в&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>&nbsp;&mdash; здесь попытка использования команды&nbsp;<a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>&nbsp;при <strong>IOPL</strong>&nbsp;&lt;&nbsp;3 (кроме <a href="http://www.club155.ru/x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86">режима EV86</a>) всегда вызывает генерацию&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особой ситуации общей защиты (#GP)</a>.</p> <p style="text-align: justify;">В процессорах, начиная с Pentium, имеется специальный <a href="http://www.club155.ru/x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86">режим EV86</a>&nbsp;<span style="line-height: 1.4em;">(включается установкой флага </span><a href="http://www.club155.ru//x86internalreg-control#CR4VME" style="line-height: 1.4em;" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a><span style="line-height: 1.4em;"> = 1 в </span><a href="http://www.club155.ru//x86addr-lineaddress#V86" style="line-height: 1.4em;" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a><span style="line-height: 1.4em;">), в котором возникает дополнительная специфика для <em>IOPL-чувствительных</em> команд. Во-первых, команда&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>&nbsp;в этом режиме вообще перестает быть <em>IOPL-чувствительной</em> и не генерирует&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" style="line-height: 16.8px; text-align: justify;" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особую ситуацию общей защиты (#GP)</a>&nbsp;при <strong>IOPL</strong>&nbsp;&lt;&nbsp;3. Команды&nbsp;<a href="http://www.club155.ru/x86cmd/CLI" style="line-height: 16.8px; text-align: justify;" title="CLI - Запретить внешние прерывания">CLI</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/STI" style="line-height: 16.8px; text-align: justify;" title="STI - Разрешить внешние прерывания">STI</a>&nbsp;при <strong>IOPL</strong>&nbsp;&lt;&nbsp; 3, вместо генерации указанной <em>особой ситуации</em>, оказывают влияние на <em>флаг виртуального прерывания</em>&nbsp;<a href="http://www.club155.ru//x86internalreg-eflags#VIF" style="line-height: 16.8px; text-align: justify;" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a>&nbsp;(также как и команда <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>), а для команды&nbsp;<a href="http://www.club155.ru/x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT n</a>&nbsp;вообще возникает несколько <a href="http://www.club155.ru/x86exceptions-v86mode#mode2" title="Виртуальные прерывания в режиме V86 (режим EV86) - Режим 2">режимов</a>, которые зависят от текущего контекста конкретной&nbsp;<a href="http://www.club155.ru/x86addr-multitasking#context" title="Адресация и многозадачность: Средства поддержки мультизадачности - Типы задач и контекст задачи">задачи V86</a>. И наконец, команда&nbsp;<a href="http://www.club155.ru/x86cmd/PUSHF" title="Поместить в стек значение регистра FLAGS">PUSHF</a>&nbsp;(16-битная), выполняемая в <a href="http://www.club155.ru/x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86">режиме EV86</a>&nbsp;при <strong>IOPL</strong>&nbsp;&lt;&nbsp;3, также не генериует&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особую ситуацию общей защиты (#GP)</a>, а записывает в стек образ <em>регистра флагов</em> <strong>FLAGS</strong>, у которого биты, соответствующие полю <strong>IOPL</strong>,</span>&nbsp;устанавливаются равными 3, а бит <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">IF</a> записывается из текущего значения флага <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a>.</p> <p style="text-align: justify;">В ранних моделях процессоров до Intel286 (8086/8088, Intel186) биты 12 и 13 <em>регистра флагов</em> <strong>FLAGS</strong>, соответствующие полю <strong>IOPL</strong>, считались зарезервированными, а их значения всегда были равны единице. В процессоре Intel286 в <a href="http://www.club155.ru//x86addr-lineaddress#real" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Реальный режим">режиме реальной адресации</a> невозможно изменять значения этих битов &mdash; они всегда остаются нулевыми (они сбрасываются в момент инициализации процессора), а вот более поздние модели процессоров, начиная с Intel386, такого ограничения уже не имеют, то есть поле <strong>IOPL</strong> можно изменять и в <a href="http://www.club155.ru//x86addr-lineaddress#real" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Реальный режим">режиме реальной адресации</a>. Указанная особенность использовалась в процедурах идентификации процессоров вплоть до появления команды <a href="http://www.club155.ru//x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a> в процессоре Pentium.</p> <p>&nbsp;</p> <p><a name="NT"></a><strong>NT</strong> (Вложенная задача, бит 14: Intel286 &hellip;)</p> <p style="text-align: justify;">Процессор устанавливает и проверяет <em>флаг вложенной задачи</em> для контроля за прерванными задачами (задачи, во время исполнения которых имело место <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации">прерывание</a>) и при вызове процедур. Флаг <strong>NT</strong> влияет на действия, производимые командой <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a>. Этот флаг может быть изменен командой <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a> и&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a>. Некорректные изменения этого флага могут привести к возникновению различных особых ситуаций в прикладных программах.</p> <p>&nbsp;</p> <p><a name="RF"></a><strong>RF</strong> (Флаг возобновления, бит 16: Intel386 &hellip;)</p> <p style="text-align: justify;"><em>Флаг возобновления</em> <strong>RF</strong> временно выключает обработку <a href="http://www.club155.ru//x86exceptions-conditions#DB" title="Прерывания и особые ситуации: Условия возникновения и особенности обработки &mdash; Прерывание 1 &mdash; Прерывание отладки (#DB)">особых ситуаций отладки (DB#)</a> для того, чтобы команда, вызвавшая такую ситуацию, могла быть перезапущена и не стала бы причиной новой особой ситуации. Отладчик устанавливает этот флаг командой&nbsp;<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a> при возврате в прерванную программу. Команды <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>, <a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>&nbsp;(в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Режим V86">режиме V86</a>) и&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a> на этот флаг не влияют.</p> <p>&nbsp;</p> <p><a name="VM"></a><strong>VM</strong> (Виртуальный режим, бит 17: Intel386 &hellip;)</p> <p style="text-align: justify;">Установка <em>флага виртуального режима</em> <strong>VM</strong> переключает процессор в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Режим V86">режим виртуального-8086</a> (специальный случай <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенного режима</a>).</p> <p>&nbsp;</p> <p><a name="AC"></a><strong>AC</strong> (Режим контроля выравнивания, бит 18: Intel486 &hellip;)</p> <p style="text-align: justify;">Установка <em>флага режима контроля выравнивания</em> (<strong>AC</strong>&nbsp;=&nbsp;1) и <a href="http://www.club155.ru/x86internalreg-control#CR0AM" title="Внутренние регистры: Управляющие регистры - Регистр CR0 - AM (Маска выравнивания, бит 18: Intel486 &hellip;)">бита AM регистра CR0</a> (<strong>CR0.AM</strong>&nbsp;=&nbsp;1) включает <strong><em>контроль выравнивания</em></strong> при обращении к памяти. При этом только при <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">текущем уровне привилегий</a> равном 3 (<strong>CPL</strong> = 3) генерируется <a href="http://www.club155.ru/x86exceptions-conditions#AC" title="Прерывание 17 &mdash; Контроль выравнивания (#AC): Intel486 &hellip;">особая ситуация контроля выравнивания (#AC)</a>, если происходит обращение к невыровненному операнду (например, к <em>слову</em> по нечетному адресу или к <em>двойному слову</em> по адресу не кратному четырем).</p> <p style="text-align: center;"><strong><em>Таблица 3.5. Условия контроля выравнивания</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T3-5}</p> <p>&nbsp;</p> <p><a name="VIF"></a><strong>VIF</strong> (Виртуальное прерывание, бит 19: Pentium &hellip;)</p> <p style="text-align: justify;"><em>Флаг виртуального прерывания</em> <strong>VIF</strong> используется совместно с флагом <a href="http://www.club155.ru//x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">VIP</a> и позволяет обеспечить нормальное выполнение старого ПО, использующего команды управления <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внешними маскируемыми прерываниями</a> (векторы от 32 до 255), в современной мультипроцессорной и мультизадачной программно-аппаратной среде.</p> <p style="text-align: justify;">Для этого в процессорах, начиная с Pentium, поддерживаются специальные расширенные режимы обработки прерываний:</p> <ul> <li><a href="http://www.club155.ru//x86exceptions-protectedmode#pvi" title="Прерывания и особые ситуации: Защищенный режим - Режим с поддержкой виртуальных флагов прерываний">режим с поддержкой виртуальных флагов прерываний</a> (включается установкой флага <a href="http://www.club155.ru//x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a> = 1 в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>);</li> <li><a href="http://www.club155.ru//x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86">режим виртуальных прерываний</a> (включается установкой флага <a href="http://www.club155.ru//x86internalreg-control#CR4VME" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a> = 1 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>);</li> </ul> <p>&nbsp;</p> <p style="text-align: justify;">В этих режимах флаг виртуального прерывания <strong>VIF</strong> выступает виртуальным подобием флага <a href="http://www.club155.ru//x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">IF</a>. При условии, что <em>виртуальные прерывания</em> инициализированы (<a href="http://www.club155.ru//x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;1 в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>, <a href="http://www.club155.ru//x86internalreg-control#CR4VME" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a>&nbsp;=&nbsp;1 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>), команды <a href="http://www.club155.ru//x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a> и <a href="http://www.club155.ru//x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a> оказывают влияние на флаг <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>, а флаг <strong>IF</strong> при этом остается неизменным. При поступлении <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внешнего маскируемого прерывания</a> процессор производит стандартное обращение к обработчику прерываний защищенного режима через <a href="http://www.club155.ru//x86internalreg-system#IDTR" title="Внутренние регистры: Системные регистры - Регистр таблицы дескрипторов прерываний IDTR">таблицу дескрипторов прерываний</a> (<strong>IDT</strong>). При этом, при записи в стек значения регистра <a href="http://www.club155.ru//x86internalreg-eflags" title="Регист флагов">EFLAGS</a> процессор записывает поле <a href="http://www.club155.ru//x86internalreg-eflags#IOPL" title="Внутренние регистры: Регистр флагов - IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)">IOPL</a> равным 3 и флаг <strong>IF</strong> равным <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a>.</p> <p>&nbsp;</p> <p><a name="VIP"></a><strong>VIP</strong> (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)</p> <p style="text-align: justify;"><em>Флаг ожидания виртуального прерывания</em> <strong>VIP</strong> используется совместно с флагом <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a> и позволяет прикладным программам в режиме поддержки виртуальных прерываний отслеживать внешние вызовы прерываний даже тогда, когда программа замаскирует их выполнение (индикация отложенных виртуальных прерываний). За дополнительной информацией по использованию этих флагов обратитесь к описанию <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">прерываний и особых ситуаций</a>.</p> <p>&nbsp;</p> <p><a name="ID"></a><strong>ID</strong> (Флаг идентификации, бит 21: Pentium &hellip;)</p> <p style="text-align: justify;"><em>Флаг идентификации</em> <strong>ID</strong> предназначен для проверки &mdash; поддерживается ли процессором команда <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a>. Если в программе можно установить и сбросить этот флаг, значит команда <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a> данным процессором поддерживается.</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> <p>&nbsp;</p> <p style="text-align: justify;"><strong><em>Регистр флагов EFLAGS</em></strong> отражает текущее состояние процессора, многие из его битов устанавливаются после выполнения операций и индицируют тип, полученного результата. Формат регистра флагов приведен на рис. 1.3.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-3_EFLAGS.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/1-3_EFLAGS.svgz" alt="Формат регистра флагов" width="540" height="393" /></p> <p align="center"><strong><em>Рис. 1.3. Формат регистра флагов</em></strong></p> <p>&nbsp;</p> <p><a name="CF"></a><strong>CF</strong> (Флаг переноса, бит 0)</p> <p style="text-align: justify;"><em>Флаг переноса</em> фиксирует значение <em>переноса</em> (<em>заема</em>), возникающего при сложении (вычитании). Иногда используется и в других ситуациях.</p> <p>&nbsp;</p> <p><a name="PF"></a><strong>PF</strong> (Флаг четности, бит 2)</p> <p style="text-align: justify;"><em>Флаг четности</em> фиксирует наличие четного числа единиц в младшем байте результата операции, может быть использован, например, для контроля правильности передачи данных.</p> <p>&nbsp;</p> <p><a name="AF"></a><strong>AF</strong> (Флаг вспомогательного переноса, бит 4)</p> <p style="text-align: justify;"><em>Флаг вспомогательного переноса</em> фиксирует <em>перенос</em> (<em>заем</em>) из младшей тетрады, т.е. из бита 3 в старшую тетраду при сложении (вычитании). Используется только для двоично-десятичной арифметики, которая оперирует исключительно младшими байтами.</p> <p>&nbsp;</p> <p><a name="ZF"></a><strong>ZF</strong> (Флаг нуля, бит 6)</p> <p style="text-align: justify;"><em>Флаг нуля</em> сигнализирует о получении нулевого (<strong>ZF</strong> = 1) или ненулевого (<strong>ZF</strong>&nbsp;=&nbsp;0) результата операции.</p> <p>&nbsp;</p> <p><a name="SF"></a><strong>SF</strong> (Флаг знака, бит 7)</p> <p style="text-align: justify;"><em>Флаг знака</em> дублирует значение старшего бита результата, который при использовании дополнительного кода соответствует знаку числа (0 &ndash; положительное число, 1 &ndash; отрицательное).</p> <p>&nbsp;</p> <p><a name="TF"></a><strong>TF</strong> (Флаг трассировки, бит 8)</p> <p style="text-align: justify;">При установке <em>флага трассировки&nbsp;</em><strong>TF</strong> = 1, микропроцессор переходит в <strong>пошаговый режим работы</strong>, применяемый при отладке программ, когда автоматически генерируется&nbsp;<a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 &mdash; Прерывание отладки (#DB)">особая ситуация отладки (#DB)</a> после выполнения каждой команды. Прерывание отладки начнет генерироваться, если прикладная программа установит флаг <strong>TF</strong> с помощью команд <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a> или <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a>.</p> <p>&nbsp;</p> <p><a name="IF"></a><strong>IF</strong> (Флаг разрешения прерываний, бит 9)</p> <p style="text-align: justify;">При установке <em>флага разрешения прерываний</em> <strong>IF</strong> = 1, микропроцессор воспринимает (распознает) и соответственно реагирует на запрос прерывания по входу <strong>INTR#</strong> (<a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внешние маскируемые прерывания</a>). При <strong>IF</strong> = 0, прерывания по этому входу запрещаются и микропроцессор игнорирует поступающие запросы прерываний.</p> <p style="text-align: justify;">Значение флага <strong>IF</strong> не влияет на восприятие <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внешних немаскируемых прерываний</a> по входу <strong>NMI#</strong>, а также <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внутренних программных прерываний</a>, выполняемых по команде <a href="http://www.club155.ru/x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT</a>.</p> <p style="text-align: justify;">Изменение этого флага командами <a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a>, <a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>, <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a> и&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a> возможно не всегда и определяется текущими:</p> <ul> <li><a href="http://www.club155.ru//x86addr-lineaddress" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режимом работы процессора</a>;</li> <li><a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">уровнем привилегий</a> выполняемого кода (<strong>CPL</strong>);</li> <li><a href="http://www.club155.ru//x86internalreg-eflags#IOPL" title="Внутренние регистры: Регистр флагов - IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)">уровнем привилегий ввода/вывода</a> (поле <strong>IOPL</strong>);</li> <li>значением флага <a href="http://www.club155.ru//x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a> (отвечает за активацию специального <a href="http://www.club155.ru//x86exceptions-protectedmode#pvi" title="Прерывания и особые ситуации: Защищенный режим - Режим с поддержкой виртуальных флагов прерываний">режима с поддержкой виртуальных флагов прерываний</a> в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>).</li> <li>значением флага <a href="http://www.club155.ru//x86internalreg-control#CR4VME" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a> (отвечает за активацию специального <a href="http://www.club155.ru//x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86">режима виртуальных прерываний</a> в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>);</li> </ul> <p>&nbsp;</p> <p style="text-align: justify;">При обычной обработке прерываний (<a href="http://www.club155.ru//x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;0 в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> или <a href="http://www.club155.ru//x86internalreg-control#CR4VME" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a>&nbsp;=&nbsp;0 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>), когда <strong>IOPL</strong> &lt; <strong>CPL</strong> ( <strong>IOPL</strong> &lt; 3 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>), все попытки изменения флага <strong>IF</strong> командами <a href="http://www.club155.ru//x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>, <a href="http://www.club155.ru//x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a>, <a href="http://www.club155.ru//x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a> и&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a> вызывают генерацию <a href="http://www.club155.ru//x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибки общей защиты (#GP)</a>.</p> <p style="text-align: justify;">Когда же <em>виртуальные прерывания</em> инициализированы (<a href="http://www.club155.ru//x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;1 в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a> или <a href="http://www.club155.ru//x86internalreg-control#CR4VME" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a>&nbsp;=&nbsp;1 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>) при выполнении того же условия <strong>IOPL</strong> &lt; <strong>CPL</strong> ( <strong>IOPL</strong> &lt; 3 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>) команды <a href="http://www.club155.ru//x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a> и <a href="http://www.club155.ru//x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a> оказывают влияние на флаг <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>, а флаг <strong>IF</strong> при этом остается неизменным. Флаг <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a> используется всеми командами (в т.ч. <a href="http://www.club155.ru//x86cmd/PUSHF" title="PUSHF - Поместить в стек значение регистра FLAGS">PUSHF</a>, <a href="http://www.club155.ru//x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>), которые пытаются изменять или считывать значение флага <strong>IF</strong>. Только значение флага <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a> будет всякий раз изменяться и считываться программой. При поступлении <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внешнего маскируемого прерывания</a> процессор производит стандартное обращение к обработчику прерываний защищенного режима через <a href="http://www.club155.ru//x86internalreg-system#IDTR" title="Внутренние регистры: Системные регистры - Регистр таблицы дескрипторов прерываний IDTR">таблицу дескрипторов прерываний</a> (<strong>IDT</strong>). При этом, при записи в стек значения регистра <a href="http://www.club155.ru//x86internalreg-eflags" title="Регист флагов">EFLAGS</a> процессор записывает поле <a href="http://www.club155.ru//x86internalreg-eflags#IOPL" title="Внутренние регистры: Регистр флагов - IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)">IOPL</a> равным 3 и флаг <strong>IF</strong> равным <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a>.</p> <p>&nbsp;</p> <p><a name="DF"></a><strong>DF</strong> (Флаг направления, бит 10)</p> <p style="text-align: justify;"><em>Флаг направления</em> определяет порядок обработки цепочек в соответствующих командах (строковые команды: <a href="http://www.club155.ru/x86cmd/STOS" title="STOS - Сохранить элемент строки данных">STOS</a>, <a href="http://www.club155.ru/x86cmd/LODS" title="LODS - Загрузить строковый операнд">LODS</a>, <a href="http://www.club155.ru/x86cmd/CMPS" title="CMPS - Сравнить строковые операнды">CMPS</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/OUTS" title="OUTS - Вывод строки в порт">OUTS</a> и т.д.) &mdash; от меньших адресов к большим (<strong>DF</strong> = 0) или от больших к меньшим (<strong>DF</strong> = 1).</p> <p>&nbsp;</p> <p><a name="OF"></a><strong>OF</strong> (Флаг переполнения, бит 11)</p> <p style="text-align: justify;"><em>Флаг переполнения</em> сигнализирует о потере старшего бита результата в связи с переполнением разрядной сетки при работе со знаковыми числами. При сложении этот флаг устанавливается в 1, если происходит перенос в старший бит и нет переноса из старшего бита, или имеется перенос из старшего бита, но отсутствует перенос в него; в противном случае, флаг <strong>OF</strong> устанавливается в 0. При вычитании он устанавливается в 1, когда возникает заем из старшего бита, но заем в старший бит отсутствует, либо имеется заем в старший бит, но отсутствует заем из него.</p> <p>&nbsp;</p> <p><a name="IOPL"></a><strong>IOPL</strong> (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)</p> <p style="text-align: justify;">Поле <em>уровня привилегий ввода/вывода</em> (<em>Input/output Privilege Level &ndash;</em> <strong>IOPL</strong>) используется <a href="http://www.club155.ru//x86addr-protection" title="Адресация и многозадачность: Механизм защиты">механизмом защиты</a> для управления доступом к адресному пространству ввода/вывода и <a href="http://www.club155.ru/x86exceptions-types#soft" title="Прерывания и особые ситуации: Типы прерываний - Программные прерывания">программным прерываниям</a>. Ряд команд, называемых <strong><em>IOPL-чувствительными командами</em></strong> (<em>IOPL-sensitive instructions</em>), могут выполняться по-разному в зависимости от текущего <a href="http://www.club155.ru//x86addr-lineaddress" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режима работы процессора</a> и значения поля <strong>IOPL</strong>.</p> <p style="text-align: justify;">В&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>&nbsp;к <em>IOPL-чувствительным командам</em> относятся команды&nbsp;<a href="http://www.club155.ru//x86cmd/IN" title="IN - Ввод из порта">IN</a>, <a href="http://www.club155.ru//x86cmd/OUT" title="OUT - Вывод в порт">OUT</a>, <a href="http://www.club155.ru//x86cmd/INS" title="INS - Ввод из порта в строку">INS</a>/<a href="http://www.club155.ru//x86cmd/INSB" title="INSB - Ввод байта из порта в строку">NSB</a>/<a href="http://www.club155.ru//x86cmd/INSW" title="INSW - Ввод слова из порта в строку">INSW</a>/<a href="http://www.club155.ru//x86cmd/INSD" title="INSD - Ввод двойного слова из порта в строку">INSD</a>, <a href="http://www.club155.ru//x86cmd/OUTS" title="OUTS - Вывод строки в порт">OUTS</a>/<a href="http://www.club155.ru//x86cmd/OUTSB" title="OUTSB - Вывод байта в порт">OUTSB</a>/<a href="http://www.club155.ru//x86cmd/OUTSW" title="OUTSW - Вывод слова в порт">OUTSW</a>/<a href="http://www.club155.ru//x86cmd/OUTSD" title="OUTSD - Вывод двойного слова в порт">OUTSD</a>, <a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>&nbsp;и префикс <a href="http://www.club155.ru//x86cmd/LOCK" title="LOCK - Префикс выдачи сигнала блокировки шины LOCK#">LOCK</a> (только на процессоре Intel286). Всякий раз, когда программа осуществляет чтение/запись в <em>порты ввода/вывода </em>либо <em>разрешение/запрещение прерываний</em> указанными командами, процессор осуществляет специальную проверку привилегий. В зависимости от текущего значения поля <strong>IOPL</strong> и <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">текущего уровня привилегий</a> (<strong>CPL</strong>), <a href="http://www.club155.ru//x86addr-protection" title="Адресация и многозадачность: Механизм защиты">механизмом защиты</a>&nbsp;может генерироваться&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" style="text-decoration: underline; line-height: 16.8px; text-align: justify;" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особая ситуация общей защиты (#GP)</a>.&nbsp;Если <strong>CPL</strong> &le; <strong>IOPL</strong>, то команда исполняется в соответствии со своим назначением (как и в <a href="http://www.club155.ru//x86addr-lineaddress#real" title=" Адресация и многозадачность: Правила формирования линейного и физического адреса - Реальный режим">режиме реальной адресации</a>). Если <strong>CPL</strong> &gt; <strong>IOPL</strong>&nbsp;в&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>&nbsp;(а также всегда в&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">режиме V86</a>), производится дополнительная проверка доступности соответствующего <em>порта ввода/вывода</em> при любых операциях с ним. Такая проверка использует специальную&nbsp;<a href="http://www.club155.ru//x86addr-tss#inoutcart" title="Адресация и многозадачность: Сегмент состояния задачи (TSS) - Карта разрешения ввода/вывода">карту разрешения ввода/вывода</a>, которая расположена в верхней части <a href="http://www.club155.ru//x86addr-tss" title="Адресация и многозадачность: Сегмент состояния задачи (TSS)">сегмента состояния задачи TSS</a> и определяет доступность всех&nbsp;<em>портов ввода/вывода</em>. В случае недоступности порта или при попытках разрешения/запрещения прерываний командами&nbsp;<a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>, когда <strong>CPL</strong>&nbsp;&gt;&nbsp;<strong>IOPL</strong>, процессор генерирует&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" style="text-decoration: underline; text-align: justify; line-height: 16.8px;" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибку общей защиты (#GP)</a>.</p> <p style="text-align: justify;">Изменение <em>уровня привилегий ввода/вывода</em>&nbsp;<strong>IOPL</strong> возможно командами <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a> и&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a>&nbsp;в&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>&nbsp;и только&nbsp;при выполнении команды на <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">уровне привилегий</a>, по крайней мере таком же (а для команды <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>&nbsp;только на&nbsp;<a href="http://www.club155.ru//x86addr-protection#segprot" style="line-height: 16.8px; text-align: justify;" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">нулевом</a>), как и текущий <em>уровень привилегий ввода/вывода</em> (<a href="http://www.club155.ru//x86addr-lineaddress#real" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Реальный режим">режим реальной адресации</a> эквивалентен <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">нулевому уровню привилегий</a>).</p> <p style="text-align: justify;">При работе в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>&nbsp;(<a href="http://www.club155.ru//x86internalreg-eflags" title="Внутренние регистры: Регистр флагов">EFLAGS.VM</a>&nbsp;=&nbsp;1)&nbsp;<em>IOPL-чувствительными</em> являются команды&nbsp;<a href="http://www.club155.ru/x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/PUSHF" title="Поместить в стек значение регистра FLAGS">PUSHF</a>/<a href="http://www.club155.ru/x86cmd/PUSHFD" title="Поместить в стек значение регистра EFLAGS">PUSHFD</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT n</a>. У каждой из этих команд имеется аналогичная зависимость от текущего значения поля <strong>IOPL</strong>. Например, команда&nbsp;<a href="http://www.club155.ru//x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT n</a>&nbsp;вызывает генерацию <a href="http://www.club155.ru//x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особой ситуации общей защиты (#GP)</a>, если&nbsp;<strong>IOPL</strong> &lt; 3, или выполняется <a href="http://www.club155.ru/x86exceptions-types#soft" title="Прерывания и особые ситуации: Типы прерываний - Программные прерывания">программное прерывание</a>&nbsp;(при&nbsp;<strong>IOPL</strong> = 3).</p> <p style="text-align: justify;">В&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#protected" style="line-height: 16.8px; text-align: justify;" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>&nbsp;команда&nbsp;<a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>&nbsp;является одновременно зависимой и от&nbsp;<em>уровня привилегий ввода/вывода</em> <strong>IOPL</strong>, и от&nbsp;<a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">текущего уровня привилегий</a>&nbsp;(<strong>CPL</strong>), позволяя изменять поле&nbsp;<strong>IOPL</strong> только при выполнении на&nbsp;<a href="http://www.club155.ru//x86addr-protection#segprot" style="line-height: 16.8px; text-align: justify;" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">нулевом уровне привилегий</a>&nbsp;(<strong>CPL</strong>&nbsp;=&nbsp;0), а <em>флаг разрешения прерываний</em> <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">IF</a> &mdash; только при условии <strong>CPL</strong>&nbsp;&le; <strong>IOPL</strong>. Однако, если эта команда не может изменить указанное поле или флаг из-за недостаточности <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">текущих привилегий</a>, то генерации&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особой ситуации общей защиты (#GP)</a>&nbsp;не происходит&nbsp;&mdash; продолжается выполнение последующих команд. Это поведение меняется в&nbsp;<a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>&nbsp;&mdash; здесь попытка использования команды&nbsp;<a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>&nbsp;при <strong>IOPL</strong>&nbsp;&lt;&nbsp;3 (кроме <a href="http://www.club155.ru/x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86">режима EV86</a>) всегда вызывает генерацию&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особой ситуации общей защиты (#GP)</a>.</p> <p style="text-align: justify;">В процессорах, начиная с Pentium, имеется специальный <a href="http://www.club155.ru/x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86">режим EV86</a>&nbsp;<span style="line-height: 1.4em;">(включается установкой флага </span><a href="http://www.club155.ru//x86internalreg-control#CR4VME" style="line-height: 1.4em;" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a><span style="line-height: 1.4em;"> = 1 в </span><a href="http://www.club155.ru//x86addr-lineaddress#V86" style="line-height: 1.4em;" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a><span style="line-height: 1.4em;">), в котором возникает дополнительная специфика для <em>IOPL-чувствительных</em> команд. Во-первых, команда&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>&nbsp;в этом режиме вообще перестает быть <em>IOPL-чувствительной</em> и не генерирует&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" style="line-height: 16.8px; text-align: justify;" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особую ситуацию общей защиты (#GP)</a>&nbsp;при <strong>IOPL</strong>&nbsp;&lt;&nbsp;3. Команды&nbsp;<a href="http://www.club155.ru/x86cmd/CLI" style="line-height: 16.8px; text-align: justify;" title="CLI - Запретить внешние прерывания">CLI</a>,&nbsp;<a href="http://www.club155.ru/x86cmd/STI" style="line-height: 16.8px; text-align: justify;" title="STI - Разрешить внешние прерывания">STI</a>&nbsp;при <strong>IOPL</strong>&nbsp;&lt;&nbsp; 3, вместо генерации указанной <em>особой ситуации</em>, оказывают влияние на <em>флаг виртуального прерывания</em>&nbsp;<a href="http://www.club155.ru//x86internalreg-eflags#VIF" style="line-height: 16.8px; text-align: justify;" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a>&nbsp;(также как и команда <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>), а для команды&nbsp;<a href="http://www.club155.ru/x86cmd/INTn" title="INT n - Вызов процедуры прерывания">INT n</a>&nbsp;вообще возникает несколько <a href="http://www.club155.ru/x86exceptions-v86mode#mode2" title="Виртуальные прерывания в режиме V86 (режим EV86) - Режим 2">режимов</a>, которые зависят от текущего контекста конкретной&nbsp;<a href="http://www.club155.ru/x86addr-multitasking#context" title="Адресация и многозадачность: Средства поддержки мультизадачности - Типы задач и контекст задачи">задачи V86</a>. И наконец, команда&nbsp;<a href="http://www.club155.ru/x86cmd/PUSHF" title="Поместить в стек значение регистра FLAGS">PUSHF</a>&nbsp;(16-битная), выполняемая в <a href="http://www.club155.ru/x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86">режиме EV86</a>&nbsp;при <strong>IOPL</strong>&nbsp;&lt;&nbsp;3, также не генериует&nbsp;<a href="http://www.club155.ru//x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">особую ситуацию общей защиты (#GP)</a>, а записывает в стек образ <em>регистра флагов</em> <strong>FLAGS</strong>, у которого биты, соответствующие полю <strong>IOPL</strong>,</span>&nbsp;устанавливаются равными 3, а бит <a href="http://www.club155.ru/x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">IF</a> записывается из текущего значения флага <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a>.</p> <p style="text-align: justify;">В ранних моделях процессоров до Intel286 (8086/8088, Intel186) биты 12 и 13 <em>регистра флагов</em> <strong>FLAGS</strong>, соответствующие полю <strong>IOPL</strong>, считались зарезервированными, а их значения всегда были равны единице. В процессоре Intel286 в <a href="http://www.club155.ru//x86addr-lineaddress#real" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Реальный режим">режиме реальной адресации</a> невозможно изменять значения этих битов &mdash; они всегда остаются нулевыми (они сбрасываются в момент инициализации процессора), а вот более поздние модели процессоров, начиная с Intel386, такого ограничения уже не имеют, то есть поле <strong>IOPL</strong> можно изменять и в <a href="http://www.club155.ru//x86addr-lineaddress#real" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Реальный режим">режиме реальной адресации</a>. Указанная особенность использовалась в процедурах идентификации процессоров вплоть до появления команды <a href="http://www.club155.ru//x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a> в процессоре Pentium.</p> <p>&nbsp;</p> <p><a name="NT"></a><strong>NT</strong> (Вложенная задача, бит 14: Intel286 &hellip;)</p> <p style="text-align: justify;">Процессор устанавливает и проверяет <em>флаг вложенной задачи</em> для контроля за прерванными задачами (задачи, во время исполнения которых имело место <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации">прерывание</a>) и при вызове процедур. Флаг <strong>NT</strong> влияет на действия, производимые командой <a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a>. Этот флаг может быть изменен командой <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>/<a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a> и&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a>/<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a>. Некорректные изменения этого флага могут привести к возникновению различных особых ситуаций в прикладных программах.</p> <p>&nbsp;</p> <p><a name="RF"></a><strong>RF</strong> (Флаг возобновления, бит 16: Intel386 &hellip;)</p> <p style="text-align: justify;"><em>Флаг возобновления</em> <strong>RF</strong> временно выключает обработку <a href="http://www.club155.ru//x86exceptions-conditions#DB" title="Прерывания и особые ситуации: Условия возникновения и особенности обработки &mdash; Прерывание 1 &mdash; Прерывание отладки (#DB)">особых ситуаций отладки (DB#)</a> для того, чтобы команда, вызвавшая такую ситуацию, могла быть перезапущена и не стала бы причиной новой особой ситуации. Отладчик устанавливает этот флаг командой&nbsp;<a href="http://www.club155.ru/x86cmd/IRETD" title="IRETD - Возврат из прерывания при 32-битном размере операнда">IRETD</a> при возврате в прерванную программу. Команды <a href="http://www.club155.ru/x86cmd/POPF" title="POPF - Восстановить из стека регистр FLAGS">POPF</a>, <a href="http://www.club155.ru/x86cmd/POPFD" title="POPFD - Восстановить из стека регистр EFLAGS">POPFD</a>&nbsp;(в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Режим V86">режиме V86</a>) и&nbsp;<a href="http://www.club155.ru/x86cmd/IRET" title="IRET - Возврат из прерывания при 16-битном размере операнда">IRET</a> на этот флаг не влияют.</p> <p>&nbsp;</p> <p><a name="VM"></a><strong>VM</strong> (Виртуальный режим, бит 17: Intel386 &hellip;)</p> <p style="text-align: justify;">Установка <em>флага виртуального режима</em> <strong>VM</strong> переключает процессор в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Режим V86">режим виртуального-8086</a> (специальный случай <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенного режима</a>).</p> <p>&nbsp;</p> <p><a name="AC"></a><strong>AC</strong> (Режим контроля выравнивания, бит 18: Intel486 &hellip;)</p> <p style="text-align: justify;">Установка <em>флага режима контроля выравнивания</em> (<strong>AC</strong>&nbsp;=&nbsp;1) и <a href="http://www.club155.ru/x86internalreg-control#CR0AM" title="Внутренние регистры: Управляющие регистры - Регистр CR0 - AM (Маска выравнивания, бит 18: Intel486 &hellip;)">бита AM регистра CR0</a> (<strong>CR0.AM</strong>&nbsp;=&nbsp;1) включает <strong><em>контроль выравнивания</em></strong> при обращении к памяти. При этом только при <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне сегментов">текущем уровне привилегий</a> равном 3 (<strong>CPL</strong> = 3) генерируется <a href="http://www.club155.ru/x86exceptions-conditions#AC" title="Прерывание 17 &mdash; Контроль выравнивания (#AC): Intel486 &hellip;">особая ситуация контроля выравнивания (#AC)</a>, если происходит обращение к невыровненному операнду (например, к <em>слову</em> по нечетному адресу или к <em>двойному слову</em> по адресу не кратному четырем).</p> <p style="text-align: center;"><strong><em>Таблица 3.5. Условия контроля выравнивания</em></strong></p> <p style="text-align: center;">{loadposition custom_position_T3-5}</p> <p>&nbsp;</p> <p><a name="VIF"></a><strong>VIF</strong> (Виртуальное прерывание, бит 19: Pentium &hellip;)</p> <p style="text-align: justify;"><em>Флаг виртуального прерывания</em> <strong>VIF</strong> используется совместно с флагом <a href="http://www.club155.ru//x86internalreg-eflags#VIP" title="Внутренние регистры: Регистр флагов - VIP (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)">VIP</a> и позволяет обеспечить нормальное выполнение старого ПО, использующего команды управления <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внешними маскируемыми прерываниями</a> (векторы от 32 до 255), в современной мультипроцессорной и мультизадачной программно-аппаратной среде.</p> <p style="text-align: justify;">Для этого в процессорах, начиная с Pentium, поддерживаются специальные расширенные режимы обработки прерываний:</p> <ul> <li><a href="http://www.club155.ru//x86exceptions-protectedmode#pvi" title="Прерывания и особые ситуации: Защищенный режим - Режим с поддержкой виртуальных флагов прерываний">режим с поддержкой виртуальных флагов прерываний</a> (включается установкой флага <a href="http://www.club155.ru//x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a> = 1 в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>);</li> <li><a href="http://www.club155.ru//x86exceptions-v86mode#vme" title="Прерывания и особые ситуации: Режим V86 - Виртуальные прерывания в режиме V86">режим виртуальных прерываний</a> (включается установкой флага <a href="http://www.club155.ru//x86internalreg-control#CR4VME" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a> = 1 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>);</li> </ul> <p>&nbsp;</p> <p style="text-align: justify;">В этих режимах флаг виртуального прерывания <strong>VIF</strong> выступает виртуальным подобием флага <a href="http://www.club155.ru//x86internalreg-eflags#IF" title="Внутренние регистры: Регистр флагов - IF (Флаг разрешения прерываний, бит 9)">IF</a>. При условии, что <em>виртуальные прерывания</em> инициализированы (<a href="http://www.club155.ru//x86internalreg-control#CR4PVI" title="Управляющие регистры - Регистр CR4 - PVI (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)">CR4.PVI</a>&nbsp;=&nbsp;1 в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Адресация и многозадачность: Правила формирования линейного и физического адреса - Защищенный режим">защищенном режиме</a>, <a href="http://www.club155.ru//x86internalreg-control#CR4VME" title="Управляющие регистры - Регистр CR4 - VME (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)">CR4.VME</a>&nbsp;=&nbsp;1 в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Адресация и многозадачность: Правила формирования линейного и физического адреса">режиме V86</a>), команды <a href="http://www.club155.ru//x86cmd/CLI" title="CLI - Запретить внешние прерывания">CLI</a> и <a href="http://www.club155.ru//x86cmd/STI" title="STI - Разрешить внешние прерывания">STI</a> оказывают влияние на флаг <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">EFLAGS.VIF</a>, а флаг <strong>IF</strong> при этом остается неизменным. При поступлении <a href="http://www.club155.ru//x86exceptions-types" title="Прерывания и особые ситуации: Типы прерываний">внешнего маскируемого прерывания</a> процессор производит стандартное обращение к обработчику прерываний защищенного режима через <a href="http://www.club155.ru//x86internalreg-system#IDTR" title="Внутренние регистры: Системные регистры - Регистр таблицы дескрипторов прерываний IDTR">таблицу дескрипторов прерываний</a> (<strong>IDT</strong>). При этом, при записи в стек значения регистра <a href="http://www.club155.ru//x86internalreg-eflags" title="Регист флагов">EFLAGS</a> процессор записывает поле <a href="http://www.club155.ru//x86internalreg-eflags#IOPL" title="Внутренние регистры: Регистр флагов - IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 &hellip;)">IOPL</a> равным 3 и флаг <strong>IF</strong> равным <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a>.</p> <p>&nbsp;</p> <p><a name="VIP"></a><strong>VIP</strong> (Ожидание виртуального прерывания, бит 20: Pentium &hellip;)</p> <p style="text-align: justify;"><em>Флаг ожидания виртуального прерывания</em> <strong>VIP</strong> используется совместно с флагом <a href="http://www.club155.ru//x86internalreg-eflags#VIF" title="Внутренние регистры: Регистр флагов - VIF (Виртуальное прерывание, бит 19: Pentium &hellip;)">VIF</a> и позволяет прикладным программам в режиме поддержки виртуальных прерываний отслеживать внешние вызовы прерываний даже тогда, когда программа замаскирует их выполнение (индикация отложенных виртуальных прерываний). За дополнительной информацией по использованию этих флагов обратитесь к описанию <a href="http://www.club155.ru/index.php?option=com_content&amp;view=article&amp;id=131" title="Прерывания и особые ситуации">прерываний и особых ситуаций</a>.</p> <p>&nbsp;</p> <p><a name="ID"></a><strong>ID</strong> (Флаг идентификации, бит 21: Pentium &hellip;)</p> <p style="text-align: justify;"><em>Флаг идентификации</em> <strong>ID</strong> предназначен для проверки &mdash; поддерживается ли процессором команда <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a>. Если в программе можно установить и сбросить этот флаг, значит команда <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a> данным процессором поддерживается.</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> Внутренние регистры: Системные регистры 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-system Administrator admin@club155.ru <p> </p> <p style="text-align: justify;"><strong><em>Системные регистры</em></strong> <a href="http://www.club155.ru/x86internalreg-system#GDTR">GDTR</a>, <a href="http://www.club155.ru/x86internalreg-system#LDTR">LDTR</a> и <a href="http://www.club155.ru/x86internalreg-system#IDTR">IDTR</a> введены в процессорах начиная с Intel286 и предназначены для хранения базовых адресов <strong><em>таблиц дескрипторов</em></strong> — важнейших составляющих системной архитектуры при работе в защищенном режиме. Регистр задачи <a href="http://www.club155.ru/x86internalreg-system#TR">TR</a> используется для слежения за тем, какая задача выполняется процессором в текущий момент.</p> <p style="text-align: justify;">Для доступа к системным регистрам используются команды: <a href="http://www.club155.ru/x86cmd/LGDT" title="LGDT - Загрузить регистр глобальной таблицы дескрипторов GDTR">LGDT</a>, <a href="http://www.club155.ru/x86cmd/SGDT" title="SGDT - Сохранить регистр глобальной таблицы дескрипторов GDTR">SGDT</a>, <a href="http://www.club155.ru/x86cmd/LLDT" title="LLDT - Загрузка регистра локальной таблицы дескрипторов LDTR">LLDT</a>, <a href="http://www.club155.ru/x86cmd/SLDT" title="SLDT - Сохранить регистр локальной таблицы дескрипторов LDTR">SLDT</a>, <a href="http://www.club155.ru/x86cmd/LIDT" title="LIDT - Загрузить регистр таблицы дескрипторов прерываний IDTR">LIDT</a>, <a href="http://www.club155.ru/x86cmd/SIDT" title="SIDT - Сохранить регистр таблицы дескрипторов прерываний IDTR">SIDT</a>, <a href="http://www.club155.ru/x86cmd/LTR" title="LTR - Загрузить регистр задачи">LTR</a>, <a href="http://www.club155.ru/x86cmd/STR" title="STR - Сохранить регистр задачи">STR</a>.</p> <p> </p> <h3><a name="GDTR"></a>Регистр глобальной таблицы дескрипторов GDTR</h3> <p style="text-align: justify;"><strong><em>Регистр глобальной таблицы дескрипторов GDTR</em></strong> содержит 32-битный (24-битный для Intel286) базовый адрес и 16-битный предел <strong><em>глобальной таблицы дескрипторов</em></strong> (GDT). Формат регистра GDTR приведен на рис. 1.4.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-4_GDTR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-4_GDTR.svgz" width="520" height="63" alt="Формат регистра глобальной таблицы дескрипторов"/> </p> <p align="center"><strong><em>Рис. 1.4. Формат регистра глобальной таблицы дескрипторов</em></strong></p> <p> </p> <h3><a name="LDTR"></a>Регистр локальной таблицы дескрипторов LDTR</h3> <p style="text-align: justify;">Видимая часть <strong><em>регистра локальной таблицы дескрипторов LDTR</em></strong> содержит только <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптора</a> <strong><em>локальной таблицы дескрипторов</em></strong> (LDT). Сам дескриптор LDT автоматически загружается в скрытую часть LDTR из глобальной таблицы дескрипторов. Формат регистра LDTR приведен на рис. 1.5.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-5_LDTR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-5_LDTR.svgz" width="450" height="128" alt="Формат регистра локальной таблицы дескрипторов"/> </p> <p align="center"><strong><em>Рис. 1.5. Формат регистра локальной таблицы дескрипторов</em></strong></p> <p> </p> <h3><a name="IDTR"></a>Регистр таблицы дескрипторов прерываний IDTR</h3> <p style="text-align: justify;"><strong><em>Регистр таблицы дескрипторов прерываний IDTR</em></strong> содержит 32-битный (24-битный для Intel286) базовый адрес и 16-битный предел <strong><em>таблицы дескрипторов прерываний</em></strong> (IDT). В реальном режиме может быть использован для изменения местоположения таблицы векторов прерываний. Формат регистра IDTR приведен на рис. 1.6.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-6_IDTR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-6_IDTR.svgz" width="520" height="64" alt="Формат регистра таблицы дескрипторов прерываний"/> </p> <p align="center"><strong><em>Рис. 1.6. Формат регистра таблицы дескрипторов прерываний</em></strong></p> <p> </p> <h3><a name="TR"></a>Регистр задачи TR</h3> <p style="text-align: justify;">Видимая часть <strong><em>регистра задачи TR</em></strong> содержит <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптора</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмента состояния задачи (TSS)</a>. Сам дескриптор TSS автоматически загружается в скрытую часть TR из глобальной таблицы дескрипторов. Формат регистра задачи приведен на рис. 1.7.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-7_TR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-7_TR.svgz" width="450" height="134" alt="Формат регистра задачи"/> </p> <p align="center"><strong><em>Рис. 1.7. Формат регистра задачи</em></strong></p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;"><strong><em>Системные регистры</em></strong> <a href="http://www.club155.ru/x86internalreg-system#GDTR">GDTR</a>, <a href="http://www.club155.ru/x86internalreg-system#LDTR">LDTR</a> и <a href="http://www.club155.ru/x86internalreg-system#IDTR">IDTR</a> введены в процессорах начиная с Intel286 и предназначены для хранения базовых адресов <strong><em>таблиц дескрипторов</em></strong> — важнейших составляющих системной архитектуры при работе в защищенном режиме. Регистр задачи <a href="http://www.club155.ru/x86internalreg-system#TR">TR</a> используется для слежения за тем, какая задача выполняется процессором в текущий момент.</p> <p style="text-align: justify;">Для доступа к системным регистрам используются команды: <a href="http://www.club155.ru/x86cmd/LGDT" title="LGDT - Загрузить регистр глобальной таблицы дескрипторов GDTR">LGDT</a>, <a href="http://www.club155.ru/x86cmd/SGDT" title="SGDT - Сохранить регистр глобальной таблицы дескрипторов GDTR">SGDT</a>, <a href="http://www.club155.ru/x86cmd/LLDT" title="LLDT - Загрузка регистра локальной таблицы дескрипторов LDTR">LLDT</a>, <a href="http://www.club155.ru/x86cmd/SLDT" title="SLDT - Сохранить регистр локальной таблицы дескрипторов LDTR">SLDT</a>, <a href="http://www.club155.ru/x86cmd/LIDT" title="LIDT - Загрузить регистр таблицы дескрипторов прерываний IDTR">LIDT</a>, <a href="http://www.club155.ru/x86cmd/SIDT" title="SIDT - Сохранить регистр таблицы дескрипторов прерываний IDTR">SIDT</a>, <a href="http://www.club155.ru/x86cmd/LTR" title="LTR - Загрузить регистр задачи">LTR</a>, <a href="http://www.club155.ru/x86cmd/STR" title="STR - Сохранить регистр задачи">STR</a>.</p> <p> </p> <h3><a name="GDTR"></a>Регистр глобальной таблицы дескрипторов GDTR</h3> <p style="text-align: justify;"><strong><em>Регистр глобальной таблицы дескрипторов GDTR</em></strong> содержит 32-битный (24-битный для Intel286) базовый адрес и 16-битный предел <strong><em>глобальной таблицы дескрипторов</em></strong> (GDT). Формат регистра GDTR приведен на рис. 1.4.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-4_GDTR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-4_GDTR.svgz" width="520" height="63" alt="Формат регистра глобальной таблицы дескрипторов"/> </p> <p align="center"><strong><em>Рис. 1.4. Формат регистра глобальной таблицы дескрипторов</em></strong></p> <p> </p> <h3><a name="LDTR"></a>Регистр локальной таблицы дескрипторов LDTR</h3> <p style="text-align: justify;">Видимая часть <strong><em>регистра локальной таблицы дескрипторов LDTR</em></strong> содержит только <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптора</a> <strong><em>локальной таблицы дескрипторов</em></strong> (LDT). Сам дескриптор LDT автоматически загружается в скрытую часть LDTR из глобальной таблицы дескрипторов. Формат регистра LDTR приведен на рис. 1.5.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-5_LDTR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-5_LDTR.svgz" width="450" height="128" alt="Формат регистра локальной таблицы дескрипторов"/> </p> <p align="center"><strong><em>Рис. 1.5. Формат регистра локальной таблицы дескрипторов</em></strong></p> <p> </p> <h3><a name="IDTR"></a>Регистр таблицы дескрипторов прерываний IDTR</h3> <p style="text-align: justify;"><strong><em>Регистр таблицы дескрипторов прерываний IDTR</em></strong> содержит 32-битный (24-битный для Intel286) базовый адрес и 16-битный предел <strong><em>таблицы дескрипторов прерываний</em></strong> (IDT). В реальном режиме может быть использован для изменения местоположения таблицы векторов прерываний. Формат регистра IDTR приведен на рис. 1.6.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-6_IDTR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-6_IDTR.svgz" width="520" height="64" alt="Формат регистра таблицы дескрипторов прерываний"/> </p> <p align="center"><strong><em>Рис. 1.6. Формат регистра таблицы дескрипторов прерываний</em></strong></p> <p> </p> <h3><a name="TR"></a>Регистр задачи TR</h3> <p style="text-align: justify;">Видимая часть <strong><em>регистра задачи TR</em></strong> содержит <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектор</a> <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптора</a> <a href="http://www.club155.ru/index.php?Itemid=491" title="Сегмент TSS">сегмента состояния задачи (TSS)</a>. Сам дескриптор TSS автоматически загружается в скрытую часть TR из глобальной таблицы дескрипторов. Формат регистра задачи приведен на рис. 1.7.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-7_TR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-7_TR.svgz" width="450" height="134" alt="Формат регистра задачи"/> </p> <p align="center"><strong><em>Рис. 1.7. Формат регистра задачи</em></strong></p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Внутренние регистры: Управляющие регистры 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-control Administrator admin@club155.ru <p>&nbsp;</p> <p style="text-align: justify;"><strong><em>Управляющие регистры</em></strong> впервые введены в микропроцессоре Intel386. Ранее в Intel286 имелось так называемое <strong><em>слово состояния машины</em></strong>, которое для сохранения совместимости целиком помещено в управляющий регистр <a href="http://www.club155.ru/x86internalreg-control#CR0">CR0</a>. Практически все режимы и специальные возможности микропроцессора устанавливаются определенными флагами в управляющих регистрах.</p> <p style="text-align: justify;">Доступ к управляющим регистрам возможен с помощью команд: <a href="http://www.club155.ru/x86cmd/MOVCR" title="MOV CR - Переслать в/из управляющего регистра">MOV CR</a>, <a href="http://www.club155.ru/x86cmd/SMSW" title="SMSW - Сохранить слово состояния машины">SMSW</a>, <a href="http://www.club155.ru/x86cmd/LMSW" title="LMSW - Загрузить слово состояния машины MSW">LMSW</a>, <a href="http://www.club155.ru/x86cmd/CLTS" title="CLTS - Очистить флаг переключения задач в регистре CR0">CLTS</a>. Формат управляющих регистров представлен на рис. 1.8.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-8_CR.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/1-8_CR.svgz" alt="Формат управляющих регистров" width="540" height="346" /></p> <p align="center"><strong><em>Рис. 1.8. Формат управляющих регистров</em></strong></p> <p>&nbsp;</p> <h3><a name="CR0"></a>Регистр CR0</h3> <p style="text-align: justify;">Первые 16 бит регистра <strong>CR0</strong> называются <strong><em>словом состояния машины</em></strong> (<strong>MSW</strong>). <em>Слово состояния машины</em> впервые появилось в процессоре Intel286. В более поздних процессорах оно является лишь частью управляющего регистра <strong>CR0</strong> и сохранено для совместимости. Биты <a href="http://www.club155.ru/x86internalreg-control#CR0NE" title="Регистр CR0 - NE, Ошибка сопроцессора, бит 5: Intel486 &hellip;">NE</a>, <a href="http://www.club155.ru/x86internalreg-control#CR0WP" title="Регистр CR0 - WP, Маска выравнивания, бит 18: Intel486 &hellip;">WP</a>, <a href="http://www.club155.ru/x86internalreg-control#CR0AM" title="Регистр CR0 - AM, Маска выравнивания, бит 18: Intel486 &hellip;">AM</a>, <a href="http://www.club155.ru/x86internalreg-control#CR0NW" title="Регистр CR0 - NW, Запрет сквозной записи, бит 29: Intel486 &hellip;">NW</a>, <a href="http://www.club155.ru/x86internalreg-control#CR0CD" title="Регистр CR0 - CD, (Разрешение работы КЭШ, бит 30: Intel486 &hellip;">CD</a> были введены в регистр <strong>CR0</strong> начиная с процессоров Intel486.</p> <p>&nbsp;</p> <p><a name="CR0PE"></a><strong>PE</strong> (Разрешение защиты, бит 0: Intel286 &hellip;)</p> <p style="text-align: justify;">Бит <strong>PE</strong> (<em>Protection Enable</em>) предназначен для переключения режимов работы процессора &mdash; <a href="http://www.club155.ru//x86addr-lineaddress#real" title="Реальный режим">режима реальной адресации</a> и <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенного режима</a>. При сброшенном <strong>PE</strong> процессор работает в <a href="http://www.club155.ru//x86addr-lineaddress#real" title="Реальный режим">режиме реальной адресации</a>, при установленном &mdash; в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенном режиме</a> (включая <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Режим V86">режим V86</a>).</p> <p style="text-align: justify;">Бит <strong>PE</strong> можно установить загрузкой <em>слова состояния машины</em> <strong>MSW</strong> с помощью команды <a href="http://www.club155.ru/x86cmd/LMSW" title="LMSW - Загрузить слово состояния машины MSW">LMSW</a> или всего регистра <strong>CR0</strong> командой <a href="http://www.club155.ru//x86cmd/MOVCR" title="MOV CR - Переслать в/из управляющего регистра">MOV CR</a>.</p> <p style="text-align: justify;">Сбросить <strong>PE</strong> можно только загрузкой <strong>CR0</strong> командой <a href="http://www.club155.ru//x86cmd/MOVCR" title="MOV CR - Переслать в/из управляющего регистра">MOV CR</a>. В целях прямой совместимости с Intel286 бит <strong>PE</strong> не может быть сброшен командой <a href="http://www.club155.ru/x86cmd/LMSW" title="LMSW - Загрузить слово состояния машины MSW">LMSW</a>.</p> <p>&nbsp;</p> <p><a name="CR0MP"></a><strong>MP</strong> (Слежение за сопроцессором, бит 1: Intel286 &hellip;)</p> <p style="text-align: justify;">В процессорах Intel286 и Intel386 используется совместно с битом <a href="http://www.club155.ru/x86internalreg-control#CR0TS" title="Регистр CR0 - TS, Задача переключена, бит 3: Intel286 &hellip;">TS</a> для определения &mdash; будет ли команда&nbsp;<a href="http://www.club155.ru/x86cmd/WAIT" title="WAIT - Ожидать">WAIT</a> генерировать <a href="http://www.club155.ru//x86exceptions-conditions#NM" title="Прерывание 7 &mdash; Сопроцессор отсутствует (#NM): Intel286 &hellip;">особую ситуацию #NM (сопроцессор отсутствует)</a>; ловушка генерируется при установленных <strong>MP</strong> и <a href="http://www.club155.ru/x86internalreg-control#CR0TS" title="Регистр CR0 - TS, Задача переключена, бит 3: Intel286 &hellip;">TS</a>. При запуске программ процессоров Intel286 и Intel386 на процессорах со встроенным сопроцессором (Intel486DX, Pentium, &hellip;) бит <strong>MP</strong> должен быть установлен; в случае процессора Intel486SX (нет встроенного сопроцессора) бит <strong>MP</strong> должен быть сброшен.</p> <p>&nbsp;</p> <p><a name="CR0EM"></a><strong>EM</strong> (Эмуляция сопроцессора, бит 2: Intel286 &hellip;)</p> <p style="text-align: justify;">Установка этого бита вызывает генерацию <a href="http://www.club155.ru//x86exceptions-conditions#NM" title="Прерывание 7 &mdash; Сопроцессор отсутствует (#NM): Intel286 &hellip;">особой ситуации #NM (сопроцессор отсутствует)</a> всеми кодами <a href="http://www.club155.ru/x86cmd?sid=9:--FPU" title="Система команд FPU ">команд сопроцессора</a>. Значение <strong>EM</strong> не влияет на выполнение команды <a href="http://www.club155.ru/x86cmd/WAIT" title="WAIT - Ожидать">WAIT</a>.</p> <p>&nbsp;</p> <p><a name="CR0TS"></a><strong>TS</strong> (Задача переключена, бит 3: Intel286 &hellip;)</p> <p style="text-align: justify;">Процессор устанавливает флаг <strong>TS</strong> при каждом переключении задач и анализирует его при поступлении <a href="http://www.club155.ru/x86cmd?sid=9:--FPU" title="Система команд FPU ">команд сопроцессора</a>, <a href="http://www.club155.ru/x86cmd?sid=10:--MMX" title="Набор команд MMX ">команд MMX</a>/<a href="http://www.club155.ru/x86cmd?sid=11:--3DNow" title="Набор команд 3DNow!">3DNow!</a> и <a href="http://www.club155.ru/x86cmd?sid=12:--SIMD" title="Набор команд SIMD ">SIMD</a>. Это делается для исключения исполнения этих команд над данными, перекочевавшими из другой задачи. Команда <a href="http://www.club155.ru/x86cmd/CLTS" title="CLTS - Очистить флаг переключения задач в регистре CR0">CLTS</a> очищает этот бит.</p> <p>&nbsp;</p> <p><a name="CR0ET"></a><strong>ET</strong> (Тип сопроцессора, бит 4: Intel386, Intel486SX)</p> <p style="text-align: justify;">При <strong>ET</strong> = 1, используется 32-битный протокол Intel387. При <strong>ET</strong> = 0, используется 16-битный протокол Intel287. При необходимости может быть сброшен или установлен загрузкой <strong>CR0</strong>. В целях прямой совместимости с Intel286 не изменяется командой <a href="http://www.club155.ru/x86cmd/LMSW" title="LMSW - Загрузить слово состояния машины MSW">LMSW</a>. В процессорах современных модификаций (Pentium &hellip;) данный бит считается зарезервированным (<strong>ET</strong> = 1).</p> <p>&nbsp;</p> <p><a name="CR0NE"></a><strong>NE</strong> (Ошибка сопроцессора, бит 5: Intel486 &hellip;)</p> <p style="text-align: justify;">Бит предназначен для управления режимом реагирования на ошибки сопроцессора. Если <strong>NE</strong> установлен, действует внутренний механизм, обеспечивающий генерацию&nbsp;<a href="http://www.club155.ru/x86exceptions-conditions#MF" title="Прерывание 16 &mdash; Ошибка сопроцессора (#MF): Intel286 &hellip;">ошибки сопроцессора #MF</a> сразу по поступлении очередной команды <a href="http://www.club155.ru/x86cmd?sid=9:--FPU" title="Система команд FPU ">FPU</a>/<a href="http://www.club155.ru/x86cmd?sid=10:--MMX" title="Набор команд MMX ">MMX</a>/<a href="http://www.club155.ru/x86cmd?sid=11:--3DNow" title="Набор команд 3DNow!">3DNow!</a> вслед за командой, вызвавшей незамаскированное исключение (с помощью <a href="http://www.club155.ru//x86internalreg-fpucw" title="Внутренние регистры: Регистр управления FPU">регистра управления сопроцессора CW</a> можно замаскировать все исключения).</p> <p style="text-align: justify;">Если <strong>NE</strong> сброшен, реакция на <a href="http://www.club155.ru//x86exceptions-fputypes" title="Прерывания и особые ситуации: Типы и средства индикации исключений FPU">исключительния FPU</a> происходит в так называемом <em>стиле MS-DOS</em>, который предполагает обработку ошибок сопроцессора через вызов внешнего прерывания. В этом режиме задействуются специальные выводы <strong>FERR#</strong> и <strong>IGNNE#</strong> (вывод <strong>FERR#</strong> аналогичен выводу <strong>ERROR#</strong> сопроцессоров Intel287 и Intel387 и обычно подключается к внешнему программируемому контроллеру прерываний).</p> <p style="text-align: justify;">Механизмы реакции различных моделей процессоров и сопроцессоров на возникновение <a href="http://www.club155.ru//x86exceptions-fputypes" title="Прерывания и особые ситуации: Типы и средства индикации исключений FPU">исключительных ситуаций сопроцессора</a> обладают некоторыми специфическими особенностями, варьирующимися от модели к модели. Подробное описание всех этих особенностей приведено в <a href="http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-1-manual.html">Intel 64 and IA-32 Architectures Developer's Manual: Vol. 1</a></p> <p>&nbsp;</p> <p><a name="CR0WP"></a><strong>WP</strong> (Защита записи, бит 16: Intel486 &hellip;)</p> <p style="text-align: justify;">Установка этого бита позволяет защитить <a href="http://www.club155.ru//x86addr-protection#pageprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне страниц">страницы пользовательского уровня</a> (которые определены как <em>страницы только для чтения</em>) от изменения их <em>программой супервизором</em>, работающей на более высоком <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне страниц">уровне привилегий</a>. Если этот бит сброшен, то <em>супервизор</em> может осуществлять запись в <em>страницы пользовательского уровня</em> защищенные от записи.</p> <p>&nbsp;</p> <p><a name="CR0AM"></a><strong>AM</strong> (Маска выравнивания, бит 18: Intel486 &hellip;)</p> <p style="text-align: justify;">Этот бит позволяет осуществлять контроль выравнивания, если он установлен. Если бит <strong>AM</strong> сброшен, контроль выравнивания запрещен. Контроль выравнивания осуществляется, только если установлены бит <strong>AM</strong>, флаг AC и CPL = 3 (режим пользователя). При этом генерируется <a href="http://www.club155.ru/x86exceptions-conditions#AC" title="Прерывание 17 &mdash; Контроль выравнивания (#AC): Intel486 &hellip;">особая ситуация контроля выравнивания (#AC)</a>, если происходит обращение к невыровненному операнду, например, к слову по нечетному адресу или к двойному слову по адресу не кратному четырем.</p> <p>&nbsp;</p> <p><a name="CR0NW"></a><strong>NW</strong> (Запрет сквозной записи, бит 29: Intel486 &hellip;)</p> <p style="text-align: justify;">Предназначен для управления встроенным КЭШ. Если этот бит сброшен, то <em>сквозная запись</em> (<em>write-through</em>) и <em>циклы недействительности КЭШ</em> разрешены. Если бит установлен, то <em>сквозная запись</em> и <em>циклы недействительности</em> запрещены. При <strong>NW</strong> = 1 бит&nbsp;<a href="http://www.club155.ru/x86internalreg-control#CR3PWT" title="Регистр CR3">CR3.PWT</a> и биты <strong>PWT</strong> в&nbsp;<a href="http://www.club155.ru/x86addr-catalogs" title="Элементы каталогов и таблиц страничных преобразований">таблицах страничных преобразований</a> игнорируются.</p> <p>&nbsp;</p> <p><a name="CR0CD"></a><strong>CD</strong> (Разрешение работы КЭШ, бит 30: Intel486 &hellip;)</p> <p style="text-align: justify;">Если <strong>CD</strong> = 0, работа внутреннего КЭШ (L1 и L2) разрешена, иначе &mdash; запрещена. Если работа внутреннего КЭШ запрещена, но он содержит некоторое количество достоверных данных, то при обращении к памяти данные поступают из КЭШ при попадании или извне при промахе. Во время записи ситуация аналогичная, т.е. когда записываются данные попадающие в КЭШ, то они сперва записываются в КЭШ, а затем методом обратной записи (Write-back) &mdash; в память (соответстующие ячейки КЭШ после этого считаются недействительными), а если нет попадания в КЭШ, то запись производится непосредственно во внешнюю память. Для предотвращения использования КЭШ, когда <strong>CD</strong> = 1, необходимо определить его как недействительный. Биты <a href="http://www.club155.ru/x86internalreg-control#CR3PCD" title="Регистр CR3">CR3.PCD</a> и <a href="http://www.club155.ru/x86internalreg-control#CR3PWT" title="Регистр CR3">CR3.PWT</a>, а также аналогичные биты <strong>PCD</strong> и <strong>PWT</strong> в <a href="http://www.club155.ru/x86addr-catalogs" title="Элементы каталогов и таблиц страничных преобразований">элементах таблиц страничных преобразований</a> при отключенном КЭШ игнорируются.</p> <p>&nbsp;</p> <p><a name="CR0PG"></a><strong>PG</strong> (Включение страничного механизма, бит 31: Intel386 &hellip;)</p> <p style="text-align: justify;">Если <strong>PG</strong> = 1, то <a href="http://www.club155.ru//x86addr-mempages" title="Адресация и многозадачность: Страничный механизм">страничный механизм</a> включен, иначе &mdash; выключен. Бит <strong>PG</strong> может использоваться только в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенном режиме</a> работы процессора (<a href="http://www.club155.ru/x86internalreg-control#CR0PE" title="Регистр CR0">CR0.PE</a> = 1). Попытка установить этот бит в <a href="http://www.club155.ru//x86addr-lineaddress#real" title="Реальный режим">реальном режиме адресации</a> приводит к генерации <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибки общей защиты (#GP)</a>.</p> <p>&nbsp;</p> <h3><a name="CR2"></a>Регистр CR2</h3> <p style="text-align: justify;">Если включен механизм страничной адресации (<a href="http://www.club155.ru/x86internalreg-control#CR0" title="Регистр CR0">CR0.PG</a> = 1), и генерируется особая ситуация 14 (Страничная ошибка), то регистр <strong>CR2</strong> будет содержать полный 32-разрядный линейный адрес, поступление которого в блок страничной адресации вызвало эту ошибку.</p> <p>&nbsp;</p> <h3><a name="CR3"></a>Регистр CR3</h3> <p style="text-align: justify;">При включенном страничном механизме регистр <strong>CR3</strong> (а именно, 20 его старших бит) содержит 20 старших бит физического адреса каталога страниц (младшие 12 бит 32-разрядного адреса каталога страниц принимаются равными 0). Иногда <strong>CR3</strong> называют <strong><em>регистром базы каталога страниц</em></strong> (<strong>PDBR</strong>). Начиная с процессора Intel486 используется еще два бита этого регистра (PWT, PCD), которые управляют кэшированием страниц. В процессорах начиная с Pentium, которые поддерживают расширения физического адреса (управляются битом <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Внутренние регистры: Управляющие регистры">CR4.PAE</a>), в режиме расширенного физического адреса 27 старших бит регистра <strong>CR3</strong> содержат адрес <a href="http://www.club155.ru/x86addr-catalogs" title="Элементы каталогов и таблиц страничных преобразований">таблицы указателей на каталоги страниц</a>&nbsp;(27 его старших бит, а младшие 5 бит принимаются равными 0).</p> <p>&nbsp;</p> <p><a name="CR3PWT"></a><strong>PWT</strong> (Сквозная запись страниц, бит 3: Intel486 &hellip;)</p> <p style="text-align: justify;">Бит используется для управления кэшированием текущего каталога страниц. При <strong>PWT</strong>&nbsp;=&nbsp;1, для текущего каталога обновление реализуется методом <em>сквозной записи</em> (<em>write-through</em>), при <strong>PWT</strong>&nbsp;=&nbsp;0 &mdash; методом <em>обратной записи</em> (<em>write-back</em>). Программы также могут управлять кэшированием таблиц страниц и отдельных страниц посредством специальных битов <strong>PCD</strong>, <strong>PWT</strong> в <a href="http://www.club155.ru/x86addr-catalogs" title="Элементы каталогов и таблиц страничных преобразований">элементах таблиц страничных преобразований</a>.</p> <p>&nbsp;</p> <p><a name="CR3PCD"></a><strong>PCD</strong> (Запрещение кэширования страниц, бит 4: Intel486 &hellip;)</p> <p style="text-align: justify;">Бит используется для управления кэшированием текущего каталога страниц. <strong>PCD</strong> = 1 запрещает кэширование. Программы также могут управлять кэшированием таблиц страниц и отдельных страниц посредством специальных битов <strong>PCD</strong>, <strong>PWT</strong> в <a href="http://www.club155.ru/x86addr-catalogs" title="Элементы каталогов и таблиц страничных преобразований">элементах таблиц страничных преобразований</a>.</p> <p>&nbsp;</p> <h3><a name="CR4"></a>Регистр CR4</h3> <p style="text-align: justify;">Регистр <strong>CR4</strong> впервые был введен в микропроцессоре Pentium, он обеспечивает включение/выключение поддержки самых разнообразных режимов и дополнительных возможностей процессора. Разные модификации процессоров поддерживают разные наборы возможностей. Поэтому перед программированием любых битов этого регистра, необходимо с помощью команды <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a> проверить наличие поддержки требуемого режима в конкретной модификации процессора. В случае, если какой-либо из режимов не поддерживается, то соответствующий бит регистра <strong>CR4</strong> считается зарезервированным и изменение его значения недопустимо (вызывает непредсказуемый результат).</p> <p>&nbsp;</p> <p><a name="CR4VME"></a><strong>VME</strong> (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)</p> <p style="text-align: justify;">Установка в 1 этого бита включает поддержку флагов виртуальных прерываний&nbsp;<a href="http://www.club155.ru/x86internalreg-eflags" title="Регистр флагов ">EFLAGS.VIF</a> и <a href="http://www.club155.ru/x86internalreg-eflags" title="Регистр флагов ">EFLAGS.VIP</a> в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Режим V86">режиме V86</a>.</p> <p>&nbsp;</p> <p><a name="CR4PVI"></a><strong>PVI</strong> (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)</p> <p style="text-align: justify;">Установка в 1 этого бита включает поддержку флагов виртуальных прерываний <a href="http://www.club155.ru/x86internalreg-eflags" title="Регистр флагов ">EFLAGS.VIF</a> и <a href="http://www.club155.ru/x86internalreg-eflags" title="Регистр флагов ">EFLAGS.VIP</a> в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенном режиме</a>. Использование виртуальных прерываний в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенном режиме</a> позволяет выполнять программы, предназначенные для уровня привилегий 0, на уровне привилегий 3.</p> <p>&nbsp;</p> <p><a name="CR4TSD"></a><strong>TSD</strong> (Ограничение маркера времени, бит 2: Pentium &hellip;)</p> <p style="text-align: justify;">Установка <strong>TSD</strong> в 1 разрешает выполнение привилегированной команды&nbsp;<a href="http://www.club155.ru/x86cmd/RDTSC" title="RDTSC - Чтение из регистра счета времени">RDTSC</a> (Read from time stamp counter) только на уровне привилегий 0. Сброс <strong>TSD</strong> разрешает указанную команду на всех уровнях привилегий.</p> <p>&nbsp;</p> <p><a name="CR4DE"></a><strong>DE</strong> (Расширение отладки, бит 3: Pentium &hellip;)</p> <p style="text-align: justify;">Установка <strong>DE</strong> = 1 разрешает <em>точки останова по вводу/выводу</em>. Помимо этого, при включенном расширении отладки (<strong>DE</strong> = 1) регистры <a href="http://www.club155.ru/x86internalreg-dr#DR0" title="Регистры отладки ">DR4</a>, <a href="http://www.club155.ru/x86internalreg-dr#DR0" title="Регистры отладки ">DR5</a> определены как зарезервированные и попытка обращения к ним приведет к генерации ошибки <a href="http://www.club155.ru/x86exceptions-conditions#UD" title="Прерывание 6 &mdash; Неопределенный код операции (#UD): Intel286 &hellip;">"неопределенный код операции" (#UD)</a>. При отключенном расширении отладки (DE = 0) и в процессорах Intel386 и Intel486 регистры <a href="http://www.club155.ru/x86internalreg-dr#DR0" title="Регистры отладки ">DR4</a>, <a href="http://www.club155.ru/x86internalreg-dr#DR0" title="Регистры отладки ">DR5</a> отображаются на регистры <a href="http://www.club155.ru/x86internalreg-dr#DR6" title="Регистры отладки ">DR6</a>, <a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистры отладки ">DR7</a>.</p> <p>&nbsp;</p> <p><a name="CR4PSE"></a><strong>PSE</strong> (Расширение размера страниц, бит 4: Pentium &hellip;)</p> <p style="text-align: justify;"><strong>PSE</strong> = 1 разрешает использование страниц расширенного размера (4Мб или 2Мб в зависимости от текущей разрядности физического адреса).</p> <p>&nbsp;</p> <p><a name="CR4PAE"></a><strong>PAE</strong> (Расширение физического адреса, бит 5: Pentium Pro &hellip;)</p> <p style="text-align: justify;"><strong>PAE</strong> = 1 разрешает использование расширенной 36-битной (вместо стандартной 32-битной) физической адресации. При этом логический адрес остается 32-битным, все изменения касаются только работы страничного механизма. Существует еще одно расширение физического адреса для процессоров Pentium Pro и выше. Это расширение (т.н. PSE-36) позволяет использовать 4Мб страницы в режиме 36-битной адресации. Однако каких-либо управляющих битов для PSE-36 не предусмотрено, а его наличие определяется командой <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a>. Подробную информацию о режимах адресации смотрите в главе 2.</p> <p>&nbsp;</p> <p><a name="CR4MCE"></a><strong>MCE</strong> (Расширение контроля машины, бит 6: Pentium &hellip;)</p> <p style="text-align: justify;"><strong>MCE</strong> = 1 разрешает расширенный контроль работы процессора и включает поддержку <a href="http://www.club155.ru/x86exceptions-conditions#MC" title="Прерывание 18 &mdash; Контроль машины (#MC): Pentium &hellip;">прерывания 18 (Контроль машины)</a>.</p> <p>&nbsp;</p> <p><a name="CR4PGE"></a><strong>PGE</strong> (Разрешение глобальных страниц, бит 7: Pentium Pro &hellip;)</p> <p style="text-align: justify;"><strong>PGE</strong> = 1 разрешает использование глобальных страниц, которые помечены специальным битом в таблице или каталоге страниц (бит G). Глобальные страницы предназначены для использования в системных процедурах, к которым часто происходят обращения, причем из разных пользовательских задач (например, для процедур ядра ОС). Если страница помечена как глобальная, то при переключении задач или записи в <a href="http://www.club155.ru/x86internalreg-control#CR3" title="Регистр CR3">CR3</a> не происходит автоматического вычеркивания данных об этой странице из TLB. Операционная система сама должна следить за действительностью информации о глобальных страницах в TLB и по мере надобности корректировать ее программно. При <strong>PGE</strong> = 0 поддержка глобальных страниц отключена.</p> <p>&nbsp;</p> <p><a name="CR4PCE"></a><strong>PCE</strong> (Разрешение счетчика производительности, бит 8: Pentium Pro &hellip;)</p> <p style="text-align: justify;">Данный флаг предназначен для разрешения мониторинга производительности в пользовательских программах, выполняющихся на уровне привилегий большем 0. Установка <strong>PCE</strong> = 1 разрешает выполнение команды&nbsp;<a href="http://www.club155.ru/x86cmd/RDPMC" title="RDPMC - Чтение из счетчиков мониторинга производительности">RDPMC</a> (<em>Read Performance-Monitoring Counters</em>) на всех уровнях привилегий. Сброс <strong>PCE</strong> разрешает указанную команду только на уровне привилегий 0.</p> <p>&nbsp;</p> <p><a name="CR4OSFXSR"></a><strong>OSFXSR</strong> (Использование команд быстрого сохранения/восстановления, бит 9: Pentium II &hellip;)</p> <p style="text-align: justify;">Данный флаг устанавливается операционной системой в 1 для индикации того, что она использует команды расширенного быстрого сохранения/восстановления состояния FPU/MMX/SIMD (<a href="http://www.club155.ru/x86cmd/FXSAVE" title="FXSAVE - Сохранить состояние FPU/MMX/SIMD">FXSAVE</a>/<a href="http://www.club155.ru/x86cmd/FXRSTOR" title="FXRSTOR - Восстановить состояние FPU/MMX/SIMD">FXRSTOR</a>) при переключении контекста.</p> <p>&nbsp;</p> <p><a name="CR4OSXMMEXCPT"></a><strong>OSXMMEXCPT</strong> (Разрешение особой ситуации SIMD: Pentium III &hellip;)</p> <p style="text-align: justify;">Бит <strong>OSXMMEXCPT</strong> управляет режимом реакции процессора на <a href="http://www.club155.ru/index.php?Itemid=502" title="Исключения SIMD">исключения SIMD</a>. Когда OSXMMEXCPT = 0, при возникновении <a href="http://www.club155.ru/index.php?Itemid=502" title="Исключения SIMD">исключения SIMD</a> генерируется особая ситуация <em>"</em><a href="http://www.club155.ru/x86exceptions-conditions#UD" title="Прерывание 6 &mdash; Неопределенный код операции (#UD): Intel286 &hellip;">"неопределенный код операции" (#UD)</a>, а <a href="http://www.club155.ru/x86exceptions-conditions#XM" title="Прерывание 19 &mdash; Исключение SIMD (#XM): Pentium III &hellip;">прерывание 19&nbsp;(#XM)</a>&nbsp;считается зарезервированным. Если же <strong>OSXMMEXCPT</strong> = 1, то все незамаскированные&nbsp;<a href="http://www.club155.ru/index.php?Itemid=502" title="Исключения SIMD">исключения SIMD</a> вызывают генерацию <a href="http://www.club155.ru/x86exceptions-conditions#XM" title="Прерывание 19 &mdash; Исключение SIMD (#XM): Pentium III &hellip;">особой ситуации #XM</a>.</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> <p>&nbsp;</p> <p style="text-align: justify;"><strong><em>Управляющие регистры</em></strong> впервые введены в микропроцессоре Intel386. Ранее в Intel286 имелось так называемое <strong><em>слово состояния машины</em></strong>, которое для сохранения совместимости целиком помещено в управляющий регистр <a href="http://www.club155.ru/x86internalreg-control#CR0">CR0</a>. Практически все режимы и специальные возможности микропроцессора устанавливаются определенными флагами в управляющих регистрах.</p> <p style="text-align: justify;">Доступ к управляющим регистрам возможен с помощью команд: <a href="http://www.club155.ru/x86cmd/MOVCR" title="MOV CR - Переслать в/из управляющего регистра">MOV CR</a>, <a href="http://www.club155.ru/x86cmd/SMSW" title="SMSW - Сохранить слово состояния машины">SMSW</a>, <a href="http://www.club155.ru/x86cmd/LMSW" title="LMSW - Загрузить слово состояния машины MSW">LMSW</a>, <a href="http://www.club155.ru/x86cmd/CLTS" title="CLTS - Очистить флаг переключения задач в регистре CR0">CLTS</a>. Формат управляющих регистров представлен на рис. 1.8.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-8_CR.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/1-8_CR.svgz" alt="Формат управляющих регистров" width="540" height="346" /></p> <p align="center"><strong><em>Рис. 1.8. Формат управляющих регистров</em></strong></p> <p>&nbsp;</p> <h3><a name="CR0"></a>Регистр CR0</h3> <p style="text-align: justify;">Первые 16 бит регистра <strong>CR0</strong> называются <strong><em>словом состояния машины</em></strong> (<strong>MSW</strong>). <em>Слово состояния машины</em> впервые появилось в процессоре Intel286. В более поздних процессорах оно является лишь частью управляющего регистра <strong>CR0</strong> и сохранено для совместимости. Биты <a href="http://www.club155.ru/x86internalreg-control#CR0NE" title="Регистр CR0 - NE, Ошибка сопроцессора, бит 5: Intel486 &hellip;">NE</a>, <a href="http://www.club155.ru/x86internalreg-control#CR0WP" title="Регистр CR0 - WP, Маска выравнивания, бит 18: Intel486 &hellip;">WP</a>, <a href="http://www.club155.ru/x86internalreg-control#CR0AM" title="Регистр CR0 - AM, Маска выравнивания, бит 18: Intel486 &hellip;">AM</a>, <a href="http://www.club155.ru/x86internalreg-control#CR0NW" title="Регистр CR0 - NW, Запрет сквозной записи, бит 29: Intel486 &hellip;">NW</a>, <a href="http://www.club155.ru/x86internalreg-control#CR0CD" title="Регистр CR0 - CD, (Разрешение работы КЭШ, бит 30: Intel486 &hellip;">CD</a> были введены в регистр <strong>CR0</strong> начиная с процессоров Intel486.</p> <p>&nbsp;</p> <p><a name="CR0PE"></a><strong>PE</strong> (Разрешение защиты, бит 0: Intel286 &hellip;)</p> <p style="text-align: justify;">Бит <strong>PE</strong> (<em>Protection Enable</em>) предназначен для переключения режимов работы процессора &mdash; <a href="http://www.club155.ru//x86addr-lineaddress#real" title="Реальный режим">режима реальной адресации</a> и <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенного режима</a>. При сброшенном <strong>PE</strong> процессор работает в <a href="http://www.club155.ru//x86addr-lineaddress#real" title="Реальный режим">режиме реальной адресации</a>, при установленном &mdash; в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенном режиме</a> (включая <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Режим V86">режим V86</a>).</p> <p style="text-align: justify;">Бит <strong>PE</strong> можно установить загрузкой <em>слова состояния машины</em> <strong>MSW</strong> с помощью команды <a href="http://www.club155.ru/x86cmd/LMSW" title="LMSW - Загрузить слово состояния машины MSW">LMSW</a> или всего регистра <strong>CR0</strong> командой <a href="http://www.club155.ru//x86cmd/MOVCR" title="MOV CR - Переслать в/из управляющего регистра">MOV CR</a>.</p> <p style="text-align: justify;">Сбросить <strong>PE</strong> можно только загрузкой <strong>CR0</strong> командой <a href="http://www.club155.ru//x86cmd/MOVCR" title="MOV CR - Переслать в/из управляющего регистра">MOV CR</a>. В целях прямой совместимости с Intel286 бит <strong>PE</strong> не может быть сброшен командой <a href="http://www.club155.ru/x86cmd/LMSW" title="LMSW - Загрузить слово состояния машины MSW">LMSW</a>.</p> <p>&nbsp;</p> <p><a name="CR0MP"></a><strong>MP</strong> (Слежение за сопроцессором, бит 1: Intel286 &hellip;)</p> <p style="text-align: justify;">В процессорах Intel286 и Intel386 используется совместно с битом <a href="http://www.club155.ru/x86internalreg-control#CR0TS" title="Регистр CR0 - TS, Задача переключена, бит 3: Intel286 &hellip;">TS</a> для определения &mdash; будет ли команда&nbsp;<a href="http://www.club155.ru/x86cmd/WAIT" title="WAIT - Ожидать">WAIT</a> генерировать <a href="http://www.club155.ru//x86exceptions-conditions#NM" title="Прерывание 7 &mdash; Сопроцессор отсутствует (#NM): Intel286 &hellip;">особую ситуацию #NM (сопроцессор отсутствует)</a>; ловушка генерируется при установленных <strong>MP</strong> и <a href="http://www.club155.ru/x86internalreg-control#CR0TS" title="Регистр CR0 - TS, Задача переключена, бит 3: Intel286 &hellip;">TS</a>. При запуске программ процессоров Intel286 и Intel386 на процессорах со встроенным сопроцессором (Intel486DX, Pentium, &hellip;) бит <strong>MP</strong> должен быть установлен; в случае процессора Intel486SX (нет встроенного сопроцессора) бит <strong>MP</strong> должен быть сброшен.</p> <p>&nbsp;</p> <p><a name="CR0EM"></a><strong>EM</strong> (Эмуляция сопроцессора, бит 2: Intel286 &hellip;)</p> <p style="text-align: justify;">Установка этого бита вызывает генерацию <a href="http://www.club155.ru//x86exceptions-conditions#NM" title="Прерывание 7 &mdash; Сопроцессор отсутствует (#NM): Intel286 &hellip;">особой ситуации #NM (сопроцессор отсутствует)</a> всеми кодами <a href="http://www.club155.ru/x86cmd?sid=9:--FPU" title="Система команд FPU ">команд сопроцессора</a>. Значение <strong>EM</strong> не влияет на выполнение команды <a href="http://www.club155.ru/x86cmd/WAIT" title="WAIT - Ожидать">WAIT</a>.</p> <p>&nbsp;</p> <p><a name="CR0TS"></a><strong>TS</strong> (Задача переключена, бит 3: Intel286 &hellip;)</p> <p style="text-align: justify;">Процессор устанавливает флаг <strong>TS</strong> при каждом переключении задач и анализирует его при поступлении <a href="http://www.club155.ru/x86cmd?sid=9:--FPU" title="Система команд FPU ">команд сопроцессора</a>, <a href="http://www.club155.ru/x86cmd?sid=10:--MMX" title="Набор команд MMX ">команд MMX</a>/<a href="http://www.club155.ru/x86cmd?sid=11:--3DNow" title="Набор команд 3DNow!">3DNow!</a> и <a href="http://www.club155.ru/x86cmd?sid=12:--SIMD" title="Набор команд SIMD ">SIMD</a>. Это делается для исключения исполнения этих команд над данными, перекочевавшими из другой задачи. Команда <a href="http://www.club155.ru/x86cmd/CLTS" title="CLTS - Очистить флаг переключения задач в регистре CR0">CLTS</a> очищает этот бит.</p> <p>&nbsp;</p> <p><a name="CR0ET"></a><strong>ET</strong> (Тип сопроцессора, бит 4: Intel386, Intel486SX)</p> <p style="text-align: justify;">При <strong>ET</strong> = 1, используется 32-битный протокол Intel387. При <strong>ET</strong> = 0, используется 16-битный протокол Intel287. При необходимости может быть сброшен или установлен загрузкой <strong>CR0</strong>. В целях прямой совместимости с Intel286 не изменяется командой <a href="http://www.club155.ru/x86cmd/LMSW" title="LMSW - Загрузить слово состояния машины MSW">LMSW</a>. В процессорах современных модификаций (Pentium &hellip;) данный бит считается зарезервированным (<strong>ET</strong> = 1).</p> <p>&nbsp;</p> <p><a name="CR0NE"></a><strong>NE</strong> (Ошибка сопроцессора, бит 5: Intel486 &hellip;)</p> <p style="text-align: justify;">Бит предназначен для управления режимом реагирования на ошибки сопроцессора. Если <strong>NE</strong> установлен, действует внутренний механизм, обеспечивающий генерацию&nbsp;<a href="http://www.club155.ru/x86exceptions-conditions#MF" title="Прерывание 16 &mdash; Ошибка сопроцессора (#MF): Intel286 &hellip;">ошибки сопроцессора #MF</a> сразу по поступлении очередной команды <a href="http://www.club155.ru/x86cmd?sid=9:--FPU" title="Система команд FPU ">FPU</a>/<a href="http://www.club155.ru/x86cmd?sid=10:--MMX" title="Набор команд MMX ">MMX</a>/<a href="http://www.club155.ru/x86cmd?sid=11:--3DNow" title="Набор команд 3DNow!">3DNow!</a> вслед за командой, вызвавшей незамаскированное исключение (с помощью <a href="http://www.club155.ru//x86internalreg-fpucw" title="Внутренние регистры: Регистр управления FPU">регистра управления сопроцессора CW</a> можно замаскировать все исключения).</p> <p style="text-align: justify;">Если <strong>NE</strong> сброшен, реакция на <a href="http://www.club155.ru//x86exceptions-fputypes" title="Прерывания и особые ситуации: Типы и средства индикации исключений FPU">исключительния FPU</a> происходит в так называемом <em>стиле MS-DOS</em>, который предполагает обработку ошибок сопроцессора через вызов внешнего прерывания. В этом режиме задействуются специальные выводы <strong>FERR#</strong> и <strong>IGNNE#</strong> (вывод <strong>FERR#</strong> аналогичен выводу <strong>ERROR#</strong> сопроцессоров Intel287 и Intel387 и обычно подключается к внешнему программируемому контроллеру прерываний).</p> <p style="text-align: justify;">Механизмы реакции различных моделей процессоров и сопроцессоров на возникновение <a href="http://www.club155.ru//x86exceptions-fputypes" title="Прерывания и особые ситуации: Типы и средства индикации исключений FPU">исключительных ситуаций сопроцессора</a> обладают некоторыми специфическими особенностями, варьирующимися от модели к модели. Подробное описание всех этих особенностей приведено в <a href="http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-1-manual.html">Intel 64 and IA-32 Architectures Developer's Manual: Vol. 1</a></p> <p>&nbsp;</p> <p><a name="CR0WP"></a><strong>WP</strong> (Защита записи, бит 16: Intel486 &hellip;)</p> <p style="text-align: justify;">Установка этого бита позволяет защитить <a href="http://www.club155.ru//x86addr-protection#pageprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне страниц">страницы пользовательского уровня</a> (которые определены как <em>страницы только для чтения</em>) от изменения их <em>программой супервизором</em>, работающей на более высоком <a href="http://www.club155.ru//x86addr-protection#segprot" title="Адресация и многозадачность: Механизм защиты - Защита на уровне страниц">уровне привилегий</a>. Если этот бит сброшен, то <em>супервизор</em> может осуществлять запись в <em>страницы пользовательского уровня</em> защищенные от записи.</p> <p>&nbsp;</p> <p><a name="CR0AM"></a><strong>AM</strong> (Маска выравнивания, бит 18: Intel486 &hellip;)</p> <p style="text-align: justify;">Этот бит позволяет осуществлять контроль выравнивания, если он установлен. Если бит <strong>AM</strong> сброшен, контроль выравнивания запрещен. Контроль выравнивания осуществляется, только если установлены бит <strong>AM</strong>, флаг AC и CPL = 3 (режим пользователя). При этом генерируется <a href="http://www.club155.ru/x86exceptions-conditions#AC" title="Прерывание 17 &mdash; Контроль выравнивания (#AC): Intel486 &hellip;">особая ситуация контроля выравнивания (#AC)</a>, если происходит обращение к невыровненному операнду, например, к слову по нечетному адресу или к двойному слову по адресу не кратному четырем.</p> <p>&nbsp;</p> <p><a name="CR0NW"></a><strong>NW</strong> (Запрет сквозной записи, бит 29: Intel486 &hellip;)</p> <p style="text-align: justify;">Предназначен для управления встроенным КЭШ. Если этот бит сброшен, то <em>сквозная запись</em> (<em>write-through</em>) и <em>циклы недействительности КЭШ</em> разрешены. Если бит установлен, то <em>сквозная запись</em> и <em>циклы недействительности</em> запрещены. При <strong>NW</strong> = 1 бит&nbsp;<a href="http://www.club155.ru/x86internalreg-control#CR3PWT" title="Регистр CR3">CR3.PWT</a> и биты <strong>PWT</strong> в&nbsp;<a href="http://www.club155.ru/x86addr-catalogs" title="Элементы каталогов и таблиц страничных преобразований">таблицах страничных преобразований</a> игнорируются.</p> <p>&nbsp;</p> <p><a name="CR0CD"></a><strong>CD</strong> (Разрешение работы КЭШ, бит 30: Intel486 &hellip;)</p> <p style="text-align: justify;">Если <strong>CD</strong> = 0, работа внутреннего КЭШ (L1 и L2) разрешена, иначе &mdash; запрещена. Если работа внутреннего КЭШ запрещена, но он содержит некоторое количество достоверных данных, то при обращении к памяти данные поступают из КЭШ при попадании или извне при промахе. Во время записи ситуация аналогичная, т.е. когда записываются данные попадающие в КЭШ, то они сперва записываются в КЭШ, а затем методом обратной записи (Write-back) &mdash; в память (соответстующие ячейки КЭШ после этого считаются недействительными), а если нет попадания в КЭШ, то запись производится непосредственно во внешнюю память. Для предотвращения использования КЭШ, когда <strong>CD</strong> = 1, необходимо определить его как недействительный. Биты <a href="http://www.club155.ru/x86internalreg-control#CR3PCD" title="Регистр CR3">CR3.PCD</a> и <a href="http://www.club155.ru/x86internalreg-control#CR3PWT" title="Регистр CR3">CR3.PWT</a>, а также аналогичные биты <strong>PCD</strong> и <strong>PWT</strong> в <a href="http://www.club155.ru/x86addr-catalogs" title="Элементы каталогов и таблиц страничных преобразований">элементах таблиц страничных преобразований</a> при отключенном КЭШ игнорируются.</p> <p>&nbsp;</p> <p><a name="CR0PG"></a><strong>PG</strong> (Включение страничного механизма, бит 31: Intel386 &hellip;)</p> <p style="text-align: justify;">Если <strong>PG</strong> = 1, то <a href="http://www.club155.ru//x86addr-mempages" title="Адресация и многозадачность: Страничный механизм">страничный механизм</a> включен, иначе &mdash; выключен. Бит <strong>PG</strong> может использоваться только в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенном режиме</a> работы процессора (<a href="http://www.club155.ru/x86internalreg-control#CR0PE" title="Регистр CR0">CR0.PE</a> = 1). Попытка установить этот бит в <a href="http://www.club155.ru//x86addr-lineaddress#real" title="Реальный режим">реальном режиме адресации</a> приводит к генерации <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибки общей защиты (#GP)</a>.</p> <p>&nbsp;</p> <h3><a name="CR2"></a>Регистр CR2</h3> <p style="text-align: justify;">Если включен механизм страничной адресации (<a href="http://www.club155.ru/x86internalreg-control#CR0" title="Регистр CR0">CR0.PG</a> = 1), и генерируется особая ситуация 14 (Страничная ошибка), то регистр <strong>CR2</strong> будет содержать полный 32-разрядный линейный адрес, поступление которого в блок страничной адресации вызвало эту ошибку.</p> <p>&nbsp;</p> <h3><a name="CR3"></a>Регистр CR3</h3> <p style="text-align: justify;">При включенном страничном механизме регистр <strong>CR3</strong> (а именно, 20 его старших бит) содержит 20 старших бит физического адреса каталога страниц (младшие 12 бит 32-разрядного адреса каталога страниц принимаются равными 0). Иногда <strong>CR3</strong> называют <strong><em>регистром базы каталога страниц</em></strong> (<strong>PDBR</strong>). Начиная с процессора Intel486 используется еще два бита этого регистра (PWT, PCD), которые управляют кэшированием страниц. В процессорах начиная с Pentium, которые поддерживают расширения физического адреса (управляются битом <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Внутренние регистры: Управляющие регистры">CR4.PAE</a>), в режиме расширенного физического адреса 27 старших бит регистра <strong>CR3</strong> содержат адрес <a href="http://www.club155.ru/x86addr-catalogs" title="Элементы каталогов и таблиц страничных преобразований">таблицы указателей на каталоги страниц</a>&nbsp;(27 его старших бит, а младшие 5 бит принимаются равными 0).</p> <p>&nbsp;</p> <p><a name="CR3PWT"></a><strong>PWT</strong> (Сквозная запись страниц, бит 3: Intel486 &hellip;)</p> <p style="text-align: justify;">Бит используется для управления кэшированием текущего каталога страниц. При <strong>PWT</strong>&nbsp;=&nbsp;1, для текущего каталога обновление реализуется методом <em>сквозной записи</em> (<em>write-through</em>), при <strong>PWT</strong>&nbsp;=&nbsp;0 &mdash; методом <em>обратной записи</em> (<em>write-back</em>). Программы также могут управлять кэшированием таблиц страниц и отдельных страниц посредством специальных битов <strong>PCD</strong>, <strong>PWT</strong> в <a href="http://www.club155.ru/x86addr-catalogs" title="Элементы каталогов и таблиц страничных преобразований">элементах таблиц страничных преобразований</a>.</p> <p>&nbsp;</p> <p><a name="CR3PCD"></a><strong>PCD</strong> (Запрещение кэширования страниц, бит 4: Intel486 &hellip;)</p> <p style="text-align: justify;">Бит используется для управления кэшированием текущего каталога страниц. <strong>PCD</strong> = 1 запрещает кэширование. Программы также могут управлять кэшированием таблиц страниц и отдельных страниц посредством специальных битов <strong>PCD</strong>, <strong>PWT</strong> в <a href="http://www.club155.ru/x86addr-catalogs" title="Элементы каталогов и таблиц страничных преобразований">элементах таблиц страничных преобразований</a>.</p> <p>&nbsp;</p> <h3><a name="CR4"></a>Регистр CR4</h3> <p style="text-align: justify;">Регистр <strong>CR4</strong> впервые был введен в микропроцессоре Pentium, он обеспечивает включение/выключение поддержки самых разнообразных режимов и дополнительных возможностей процессора. Разные модификации процессоров поддерживают разные наборы возможностей. Поэтому перед программированием любых битов этого регистра, необходимо с помощью команды <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a> проверить наличие поддержки требуемого режима в конкретной модификации процессора. В случае, если какой-либо из режимов не поддерживается, то соответствующий бит регистра <strong>CR4</strong> считается зарезервированным и изменение его значения недопустимо (вызывает непредсказуемый результат).</p> <p>&nbsp;</p> <p><a name="CR4VME"></a><strong>VME</strong> (Расширения виртуального-8086 режима, бит 0: Pentium &hellip;)</p> <p style="text-align: justify;">Установка в 1 этого бита включает поддержку флагов виртуальных прерываний&nbsp;<a href="http://www.club155.ru/x86internalreg-eflags" title="Регистр флагов ">EFLAGS.VIF</a> и <a href="http://www.club155.ru/x86internalreg-eflags" title="Регистр флагов ">EFLAGS.VIP</a> в <a href="http://www.club155.ru//x86addr-lineaddress#V86" title="Режим V86">режиме V86</a>.</p> <p>&nbsp;</p> <p><a name="CR4PVI"></a><strong>PVI</strong> (Виртуальные прерывания защищенного режима, бит 1: Pentium &hellip;)</p> <p style="text-align: justify;">Установка в 1 этого бита включает поддержку флагов виртуальных прерываний <a href="http://www.club155.ru/x86internalreg-eflags" title="Регистр флагов ">EFLAGS.VIF</a> и <a href="http://www.club155.ru/x86internalreg-eflags" title="Регистр флагов ">EFLAGS.VIP</a> в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенном режиме</a>. Использование виртуальных прерываний в <a href="http://www.club155.ru//x86addr-lineaddress#protected" title="Защищенный режим">защищенном режиме</a> позволяет выполнять программы, предназначенные для уровня привилегий 0, на уровне привилегий 3.</p> <p>&nbsp;</p> <p><a name="CR4TSD"></a><strong>TSD</strong> (Ограничение маркера времени, бит 2: Pentium &hellip;)</p> <p style="text-align: justify;">Установка <strong>TSD</strong> в 1 разрешает выполнение привилегированной команды&nbsp;<a href="http://www.club155.ru/x86cmd/RDTSC" title="RDTSC - Чтение из регистра счета времени">RDTSC</a> (Read from time stamp counter) только на уровне привилегий 0. Сброс <strong>TSD</strong> разрешает указанную команду на всех уровнях привилегий.</p> <p>&nbsp;</p> <p><a name="CR4DE"></a><strong>DE</strong> (Расширение отладки, бит 3: Pentium &hellip;)</p> <p style="text-align: justify;">Установка <strong>DE</strong> = 1 разрешает <em>точки останова по вводу/выводу</em>. Помимо этого, при включенном расширении отладки (<strong>DE</strong> = 1) регистры <a href="http://www.club155.ru/x86internalreg-dr#DR0" title="Регистры отладки ">DR4</a>, <a href="http://www.club155.ru/x86internalreg-dr#DR0" title="Регистры отладки ">DR5</a> определены как зарезервированные и попытка обращения к ним приведет к генерации ошибки <a href="http://www.club155.ru/x86exceptions-conditions#UD" title="Прерывание 6 &mdash; Неопределенный код операции (#UD): Intel286 &hellip;">"неопределенный код операции" (#UD)</a>. При отключенном расширении отладки (DE = 0) и в процессорах Intel386 и Intel486 регистры <a href="http://www.club155.ru/x86internalreg-dr#DR0" title="Регистры отладки ">DR4</a>, <a href="http://www.club155.ru/x86internalreg-dr#DR0" title="Регистры отладки ">DR5</a> отображаются на регистры <a href="http://www.club155.ru/x86internalreg-dr#DR6" title="Регистры отладки ">DR6</a>, <a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистры отладки ">DR7</a>.</p> <p>&nbsp;</p> <p><a name="CR4PSE"></a><strong>PSE</strong> (Расширение размера страниц, бит 4: Pentium &hellip;)</p> <p style="text-align: justify;"><strong>PSE</strong> = 1 разрешает использование страниц расширенного размера (4Мб или 2Мб в зависимости от текущей разрядности физического адреса).</p> <p>&nbsp;</p> <p><a name="CR4PAE"></a><strong>PAE</strong> (Расширение физического адреса, бит 5: Pentium Pro &hellip;)</p> <p style="text-align: justify;"><strong>PAE</strong> = 1 разрешает использование расширенной 36-битной (вместо стандартной 32-битной) физической адресации. При этом логический адрес остается 32-битным, все изменения касаются только работы страничного механизма. Существует еще одно расширение физического адреса для процессоров Pentium Pro и выше. Это расширение (т.н. PSE-36) позволяет использовать 4Мб страницы в режиме 36-битной адресации. Однако каких-либо управляющих битов для PSE-36 не предусмотрено, а его наличие определяется командой <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a>. Подробную информацию о режимах адресации смотрите в главе 2.</p> <p>&nbsp;</p> <p><a name="CR4MCE"></a><strong>MCE</strong> (Расширение контроля машины, бит 6: Pentium &hellip;)</p> <p style="text-align: justify;"><strong>MCE</strong> = 1 разрешает расширенный контроль работы процессора и включает поддержку <a href="http://www.club155.ru/x86exceptions-conditions#MC" title="Прерывание 18 &mdash; Контроль машины (#MC): Pentium &hellip;">прерывания 18 (Контроль машины)</a>.</p> <p>&nbsp;</p> <p><a name="CR4PGE"></a><strong>PGE</strong> (Разрешение глобальных страниц, бит 7: Pentium Pro &hellip;)</p> <p style="text-align: justify;"><strong>PGE</strong> = 1 разрешает использование глобальных страниц, которые помечены специальным битом в таблице или каталоге страниц (бит G). Глобальные страницы предназначены для использования в системных процедурах, к которым часто происходят обращения, причем из разных пользовательских задач (например, для процедур ядра ОС). Если страница помечена как глобальная, то при переключении задач или записи в <a href="http://www.club155.ru/x86internalreg-control#CR3" title="Регистр CR3">CR3</a> не происходит автоматического вычеркивания данных об этой странице из TLB. Операционная система сама должна следить за действительностью информации о глобальных страницах в TLB и по мере надобности корректировать ее программно. При <strong>PGE</strong> = 0 поддержка глобальных страниц отключена.</p> <p>&nbsp;</p> <p><a name="CR4PCE"></a><strong>PCE</strong> (Разрешение счетчика производительности, бит 8: Pentium Pro &hellip;)</p> <p style="text-align: justify;">Данный флаг предназначен для разрешения мониторинга производительности в пользовательских программах, выполняющихся на уровне привилегий большем 0. Установка <strong>PCE</strong> = 1 разрешает выполнение команды&nbsp;<a href="http://www.club155.ru/x86cmd/RDPMC" title="RDPMC - Чтение из счетчиков мониторинга производительности">RDPMC</a> (<em>Read Performance-Monitoring Counters</em>) на всех уровнях привилегий. Сброс <strong>PCE</strong> разрешает указанную команду только на уровне привилегий 0.</p> <p>&nbsp;</p> <p><a name="CR4OSFXSR"></a><strong>OSFXSR</strong> (Использование команд быстрого сохранения/восстановления, бит 9: Pentium II &hellip;)</p> <p style="text-align: justify;">Данный флаг устанавливается операционной системой в 1 для индикации того, что она использует команды расширенного быстрого сохранения/восстановления состояния FPU/MMX/SIMD (<a href="http://www.club155.ru/x86cmd/FXSAVE" title="FXSAVE - Сохранить состояние FPU/MMX/SIMD">FXSAVE</a>/<a href="http://www.club155.ru/x86cmd/FXRSTOR" title="FXRSTOR - Восстановить состояние FPU/MMX/SIMD">FXRSTOR</a>) при переключении контекста.</p> <p>&nbsp;</p> <p><a name="CR4OSXMMEXCPT"></a><strong>OSXMMEXCPT</strong> (Разрешение особой ситуации SIMD: Pentium III &hellip;)</p> <p style="text-align: justify;">Бит <strong>OSXMMEXCPT</strong> управляет режимом реакции процессора на <a href="http://www.club155.ru/index.php?Itemid=502" title="Исключения SIMD">исключения SIMD</a>. Когда OSXMMEXCPT = 0, при возникновении <a href="http://www.club155.ru/index.php?Itemid=502" title="Исключения SIMD">исключения SIMD</a> генерируется особая ситуация <em>"</em><a href="http://www.club155.ru/x86exceptions-conditions#UD" title="Прерывание 6 &mdash; Неопределенный код операции (#UD): Intel286 &hellip;">"неопределенный код операции" (#UD)</a>, а <a href="http://www.club155.ru/x86exceptions-conditions#XM" title="Прерывание 19 &mdash; Исключение SIMD (#XM): Pentium III &hellip;">прерывание 19&nbsp;(#XM)</a>&nbsp;считается зарезервированным. Если же <strong>OSXMMEXCPT</strong> = 1, то все незамаскированные&nbsp;<a href="http://www.club155.ru/index.php?Itemid=502" title="Исключения SIMD">исключения SIMD</a> вызывают генерацию <a href="http://www.club155.ru/x86exceptions-conditions#XM" title="Прерывание 19 &mdash; Исключение SIMD (#XM): Pentium III &hellip;">особой ситуации #XM</a>.</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> Внутренние регистры: Регистры отладки 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-dr Administrator admin@club155.ru <p style="text-align: justify;">&nbsp;</p> <p style="text-align: justify;"><em><strong>Отладочные регистры</strong></em> (или <strong><em>регистры отладки</em></strong>)&nbsp;введены в процессоры начиная с Intel386. Они предназначены для использования разработчиками ПО при проверке и отладке кода программы. Эти регистры позволяют устанавливать <strong><em>контрольные точки</em></strong> по коду и читаемым/записываемым данным, выполнять <strong><em>трассировку</em></strong>, отслеживая таким образом места возникновения ошибок. Отладочные регистры являются привилегированным ресурсом и доступны программе либо в режиме реальной адресации, либо в защищенном режиме при CPL = 0.</p> <p style="text-align: justify;">Доступ к отладочным регистрам осуществляется командой <a href="http://www.club155.ru/x86cmd/MOVDR" title="MOV DR - Переслать в/из отладочного регистра">MOV DR</a>. Попытка использования данной команды на уровне привилегий отличном от 0 приводит к генерации <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибки общей защиты (#GP)</a>. Для целей отладки и проверки программ могут использоваться и некоторые специальные регистры MSR (<a href="http://www.club155.ru/x86internalreg-msr" title="Специальные регистры модели">Специальные регистры модели</a>) поддерживаемые в процессорах Pentium, Pentium Pro, &hellip; Формат отладочных регистров приведен на рис. 1.9.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-9_DR.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/1-9_DR.svgz" alt="Формат отладочных регистров" width="540" height="449" /></p> <p align="center"><strong><em>Рис. 1.9. Формат отладочных регистров</em></strong></p> <p>&nbsp;</p> <h3><a name="DR0"></a>Регистры DR0&hellip;DR5</h3> <p style="text-align: justify;">Регистры DR0, DR1, DR2, DR3 содержат линейные адреса четырех точек останова. Сравнение этих адресов производится до трансляции физического адреса. Каждая из четырех точек останова описывается отдельно в регистре DR7.</p> <p style="text-align: justify;">Регистры DR4 и DR5 зарезервированы. Процессоры Intel386 и Intel486 ассоциируют эти регистры с регистрами DR6 и DR7 соответственно. Когда расширение отладки выключено (<a href="http://www.club155.ru/x86internalreg-control#CR4" title="Регистр CR4">CR4.DE</a> = 0), процессоры Pentium &hellip; поступают аналогично. Но если включено расширение отладки (<a href="http://www.club155.ru/x86internalreg-control#CR4" title="Регистр CR4">CR4.DE</a> = 1), то любые ссылки на регистры DR4 и DR5 приводят к генерации ошибки <a href="http://www.club155.ru/x86exceptions-conditions#UD" title="Прерывание 6 &mdash; Неопределенный код операции (#UD): Intel286 &hellip;">"неопределенный код операции" (#UD)</a>.</p> <p>&nbsp;</p> <h3><a name="DR6"></a>Регистр DR6</h3> <p style="text-align: justify;">Регистр состояния отладки DR6 содержит информацию о том, какая из точек останова вызвала особую ситуацию отладки, и некоторую другую информацию. Процессор никогда самостоятельно не очищает содержимое регистра DR6. Поэтому отладчик всегда должен следить за тем, чтобы на его работу не оказывали влияния старые данные в DR6.</p> <p><a name="DR6B0"></a><strong>B0..B3</strong> (биты 0..3)</p> <p style="text-align: justify;">Устанавливаются при встрече соответствующей контрольной точки (каждая контрольлная точка должна быть правильно описана битами LENi и R/Wi <a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистр DR7">регистра DR7</a>) несмотря на то, разрешена для нее генерация особой ситуации отладки или нет (задается битами Li и Gi <a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистр DR7">регистра DR7</a>).</p> <p><a name="DR6BD"></a><strong>BD</strong> (бит 13)</p> <p style="text-align: justify;">Используется совместно с флагом <a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистр DR7">DR7.GD</a> для обеспечения сверхзащиты отладчика. Когда сверхзащита включена (<a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистр DR7">DR7.GD</a> = 1), флаг BD будет устанавливаться, если следующая команда читает или записывает один из отладочных регистров, тем самым сигнализируя отладчику о том, что&nbsp;<a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 &mdash; Прерывание отладки (#DB)">особая ситуация отладки (#DB)</a> имеет место из-за отказа при попытке обращения к отладочным регистрам.</p> <p><a name="DR6BS"></a><strong>BS</strong> (бит 14)</p> <p style="text-align: justify;">Бит BS устанавливается, если ловушка отладки генерируется из-за включенного пошагового режима (<a href="http://www.club155.ru/x86internalreg-eflags" title="Регистр флагов ">EFLAGS.TF</a> = 1). Пошаговый режим является наиболее привилегированным, но когда установлен BS, также могут устанавливаться и любые из других битов состояния отладки.</p> <p><a name="DR6BT"></a><strong>BT</strong> (бит 15)</p> <p style="text-align: justify;">Процессор устанавливает бит BT перед входом в обработчик прерываний отладки, если происходит переключение задач и в TSS новой задачи бит T (бит шлюза отладки) установлен. Переключение происходит нормально, но перед выполнением первой команды новой задачи генерируется <a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 &mdash; Прерывание отладки (#DB)">ловушка отладки (#DB)</a>. Таким образом, бит T в TSS позволяет организовать точки останова при переключении задач (что не может быть задано каким-либо из битов <a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистр DR7">регистра управления отладкой DR7</a>), а бит DR6.BT индицирует отладчику о том, что особая ситуация отладки вызвана переключением задач.</p> <p>&nbsp;</p> <h3><a name="DR7"></a>Регистр DR7</h3> <p style="text-align: justify;">Регистр управления отладкой DR7 устанавливает режимы срабатывания точек останова и задает вызывающие их срабатывание формы доступа к памяти или вводу/выводу для каждой точки останова.</p> <p><a name="DR7Li"></a><strong>Li/Gi</strong> (биты 0&hellip;7)</p> <p style="text-align: justify;">Биты разрешения соответственно локальных и глобальных контрольных точек. Когда при выполнении программы процессор встречает одну из контрольных точек и для нее установлен соответствующий бит DR7.Li или DR7.Gi, генерируется особая ситуация отладки. Биты Li разрешают устанавливать контрольные точки для конкретных задач, не затрагивая другие. Gi влияют на все задачи. Биты Li автоматически очищаются при переключении задач.</p> <p><a name="DR7LE"></a><strong>LE, GE</strong> (биты 8, 9)</p> <p style="text-align: justify;">Управляют возможностью "точного соответствия контрольных точек данных". Если LE или GE установлен, сообщение о любой ловушке в контрольной точке по данным будет иметь место непосредственно после завершения команды, которая вызвала пересылку операнда. Если эти биты не установлены, сообщение об останове по данным может поступить спустя несколько команд или не поступить вообще. Рекомендуется устанавливать эти биты всякий раз, когда используются контрольные точки данных. При переключении задач LE очищается, GE &mdash; нет.</p> <p><a name="DR7LENi"></a><strong>LENi</strong> (биты 18, 19, 22, 23, 26, 27, 30, 31)</p> <p style="text-align: justify;">Поля LEN задают длину проверяемого значения для каждой контрольной точки (область, внутри которой условия останова могут сработать). Длина может составлять 1, 2 или 4 байта. Значение этих полей интерпретируется следующим образом:</p> <ul> <li>00 &ndash; один байт;</li> <li>01 &ndash; два байта;</li> <li>10 &ndash; неопределено;</li> <li>11 &ndash; четыре байта.</li> </ul> <p style="text-align: justify;">Если задано: поле RWi = 00 (прерывание при выполнении команды), то LENi должно быть равно нулю. В зависимости от LEN должно соблюдаться выравнивание адресов контрольных точек (содержаться в DR0&hellip;DR3) по границам слов (LENi = 01) или двойных слов (LENi = 11). Перед сравнением адресов процессор маскирует младшие биты записанного в DR0&hellip;DR3 адреса битами LENi, а адреса ввода/вывода расширяются нулями с 16 до 32-х бит. Срабатывание точки останова по данным происходит, если адрес хотя бы одного байта из записываемого/читаемого значения попадает в интервал задаваемый адресом в DR0&hellip;DR3 и соответствующим значением в поле DR7.LENi. Например, при DR = B0002h, R/W = 11b (чтение/запись данных), LEN = 01b (2 байта): чтение/запись 1 или 2-байтовых операндов по адресу B0002h приведут к срабатыванию ловушки, чтение/запись 4-байтового операнда по адресу B0001h приведет к срабатыванию ловушки, чтение/запись 1 или 2-байтовых операндов по адресу B0000h не приведут к срабатыванию ловушки.</p> <p><a name="DR7RWi"></a><strong>RWi</strong> (биты 16, 17, 20, 21, 24, 25, 28, 29)</p> <p style="text-align: justify;">Биты R и W задают, соответственно, для каждой контрольной точки в DR0&hellip;DR3 тип действия, при котором должна сработать ловушка.</p> <ul> <li>00 &ndash; выполнение команды;</li> <li>01 &ndash; запись данных;</li> <li>10 &ndash; Intel386, Intel486: неопределено; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pentium &hellip; : чтение/запись ввода/вывода (если <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Регистр CR4">CR4.DE</a> = 1 &mdash; включено расширение отладки); неопределено (если <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Регистр CR4">CR4.DE</a> = 0);</li> <li>11 &ndash; чтение/запись данных (исключая выборку команд).</li> </ul> <p><a name="DR7IR"></a><strong>IR</strong> (Перенаправление прерывания, бит 12: Intel386, Intel486, AMD K5)</p> <p style="text-align: justify;">Бит IR не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Назначение этого бита &ndash; управление <strong>перенаправлением прерывания</strong> (<em>Interrupt Redirection</em>) в связке с командой INT01. Когда IR&nbsp;=&nbsp;0, <a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 &mdash; Прерывание отладки (#DB)">особая ситуация 1&nbsp;(Прерывание отладки)</a> обрабатывается обычным образом. Если установить IR&nbsp;=&nbsp;1, то процессор будет пытаться вступить во взаимодействие с внешним оборудованием для входа в <em>режим эмуляции</em> (ICE). Только специальные версии процессоров могут использоваться в составе отладочных стендов в режиме эмуляции. Обычно же соответствующие выводы процессоров (необходимые для взаимодействия с <em>ICE-стендом</em>) не активны. В процессорах, начиная с Pentium и AMD K6, механизм <em>перенаправления прерывания</em> управляется через <a href="http://www.club155.ru//x86internalreg-msr" title="Внутренние регистры: Специальные регистры модели">специальный регистр модели</a> &mdash;&nbsp;<em><strong>Probe Mode Control Register</strong></em> (<em>PMCR</em>), а бит IR не используется.</p> <p><a name="DR7GD"></a><strong>GD</strong> (бит 13)</p> <p style="text-align: justify;">Бит предназначен для защиты отладчика. Используется совместно с битом <a href="http://www.club155.ru/x86internalreg-dr#DR6" title="Регистр DR6">DR6.BD</a>. Регистры отладки доступны только в реальном режиме или в защищенном режиме при уровне привилегий 0. Установка бита GD в реальном режиме и защищенном режиме на уровне привилегий 0 обеспечивает сверхзащиту всех обращений к регистрам отладки. При необходимости это гарантирует программному отладчику полный контроль над регистрами отладки. Когда бит GD установлен, попытка обратиться к любому из регистров отладки вызывает <a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 &mdash; Прерывание отладки (#DB)">особую ситуацию 1 (Прерывание отладки)</a>. При вызове процедуры обработки бит GD автоматически сбрасывается, что обеспечивает этой процедуре свободный доступ к регистрам отладки, в то же время бит&nbsp;<a href="http://www.club155.ru/x86internalreg-dr#DR6" title="Регистр DR6">DR6.BD</a> индицирует причину генерации прерывания.</p> <p><a name="DR7TR"></a><strong>TR</strong> (бит 14)</p> <p style="text-align: justify;">Бит TR (Trace 1) не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Установка TR&nbsp;=&nbsp;1 включает специальный режим трассировки, используемый при работе в составе отладочного стенда (<em>ICE-стенд</em>). В этом режиме после выполнения каждой команды процессор генерирует специальный цикл шины, который помогает внешнему оборудованию отслеживать всю последовательность выполняемых процессором команд.</p> <p><a name="DR7T2"></a><strong>T2</strong> (бит 15)</p> <p style="text-align: justify;">Бит T2 (Trace 2) не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Предположительно этот бит также необходим для взаимодействия с отладочным стендом (ICE-стенд). Вероятно он отвечает за индикацию переполнения внешнего лога трассировки, то есть информирует о том, что оборудование отладочного стенда не в состоянии отследить последовательность из множества обрабатываемых процессором команд.</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> <p style="text-align: justify;">&nbsp;</p> <p style="text-align: justify;"><em><strong>Отладочные регистры</strong></em> (или <strong><em>регистры отладки</em></strong>)&nbsp;введены в процессоры начиная с Intel386. Они предназначены для использования разработчиками ПО при проверке и отладке кода программы. Эти регистры позволяют устанавливать <strong><em>контрольные точки</em></strong> по коду и читаемым/записываемым данным, выполнять <strong><em>трассировку</em></strong>, отслеживая таким образом места возникновения ошибок. Отладочные регистры являются привилегированным ресурсом и доступны программе либо в режиме реальной адресации, либо в защищенном режиме при CPL = 0.</p> <p style="text-align: justify;">Доступ к отладочным регистрам осуществляется командой <a href="http://www.club155.ru/x86cmd/MOVDR" title="MOV DR - Переслать в/из отладочного регистра">MOV DR</a>. Попытка использования данной команды на уровне привилегий отличном от 0 приводит к генерации <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 &mdash; Общая защита (#GP): Intel286 &hellip;">ошибки общей защиты (#GP)</a>. Для целей отладки и проверки программ могут использоваться и некоторые специальные регистры MSR (<a href="http://www.club155.ru/x86internalreg-msr" title="Специальные регистры модели">Специальные регистры модели</a>) поддерживаемые в процессорах Pentium, Pentium Pro, &hellip; Формат отладочных регистров приведен на рис. 1.9.</p> <p>&nbsp;</p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-9_DR.pdf|500|354}</p> --> <p align="center"><img src="http://www.club155.ru/images/x86_images/1-9_DR.svgz" alt="Формат отладочных регистров" width="540" height="449" /></p> <p align="center"><strong><em>Рис. 1.9. Формат отладочных регистров</em></strong></p> <p>&nbsp;</p> <h3><a name="DR0"></a>Регистры DR0&hellip;DR5</h3> <p style="text-align: justify;">Регистры DR0, DR1, DR2, DR3 содержат линейные адреса четырех точек останова. Сравнение этих адресов производится до трансляции физического адреса. Каждая из четырех точек останова описывается отдельно в регистре DR7.</p> <p style="text-align: justify;">Регистры DR4 и DR5 зарезервированы. Процессоры Intel386 и Intel486 ассоциируют эти регистры с регистрами DR6 и DR7 соответственно. Когда расширение отладки выключено (<a href="http://www.club155.ru/x86internalreg-control#CR4" title="Регистр CR4">CR4.DE</a> = 0), процессоры Pentium &hellip; поступают аналогично. Но если включено расширение отладки (<a href="http://www.club155.ru/x86internalreg-control#CR4" title="Регистр CR4">CR4.DE</a> = 1), то любые ссылки на регистры DR4 и DR5 приводят к генерации ошибки <a href="http://www.club155.ru/x86exceptions-conditions#UD" title="Прерывание 6 &mdash; Неопределенный код операции (#UD): Intel286 &hellip;">"неопределенный код операции" (#UD)</a>.</p> <p>&nbsp;</p> <h3><a name="DR6"></a>Регистр DR6</h3> <p style="text-align: justify;">Регистр состояния отладки DR6 содержит информацию о том, какая из точек останова вызвала особую ситуацию отладки, и некоторую другую информацию. Процессор никогда самостоятельно не очищает содержимое регистра DR6. Поэтому отладчик всегда должен следить за тем, чтобы на его работу не оказывали влияния старые данные в DR6.</p> <p><a name="DR6B0"></a><strong>B0..B3</strong> (биты 0..3)</p> <p style="text-align: justify;">Устанавливаются при встрече соответствующей контрольной точки (каждая контрольлная точка должна быть правильно описана битами LENi и R/Wi <a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистр DR7">регистра DR7</a>) несмотря на то, разрешена для нее генерация особой ситуации отладки или нет (задается битами Li и Gi <a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистр DR7">регистра DR7</a>).</p> <p><a name="DR6BD"></a><strong>BD</strong> (бит 13)</p> <p style="text-align: justify;">Используется совместно с флагом <a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистр DR7">DR7.GD</a> для обеспечения сверхзащиты отладчика. Когда сверхзащита включена (<a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистр DR7">DR7.GD</a> = 1), флаг BD будет устанавливаться, если следующая команда читает или записывает один из отладочных регистров, тем самым сигнализируя отладчику о том, что&nbsp;<a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 &mdash; Прерывание отладки (#DB)">особая ситуация отладки (#DB)</a> имеет место из-за отказа при попытке обращения к отладочным регистрам.</p> <p><a name="DR6BS"></a><strong>BS</strong> (бит 14)</p> <p style="text-align: justify;">Бит BS устанавливается, если ловушка отладки генерируется из-за включенного пошагового режима (<a href="http://www.club155.ru/x86internalreg-eflags" title="Регистр флагов ">EFLAGS.TF</a> = 1). Пошаговый режим является наиболее привилегированным, но когда установлен BS, также могут устанавливаться и любые из других битов состояния отладки.</p> <p><a name="DR6BT"></a><strong>BT</strong> (бит 15)</p> <p style="text-align: justify;">Процессор устанавливает бит BT перед входом в обработчик прерываний отладки, если происходит переключение задач и в TSS новой задачи бит T (бит шлюза отладки) установлен. Переключение происходит нормально, но перед выполнением первой команды новой задачи генерируется <a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 &mdash; Прерывание отладки (#DB)">ловушка отладки (#DB)</a>. Таким образом, бит T в TSS позволяет организовать точки останова при переключении задач (что не может быть задано каким-либо из битов <a href="http://www.club155.ru/x86internalreg-dr#DR7" title="Регистр DR7">регистра управления отладкой DR7</a>), а бит DR6.BT индицирует отладчику о том, что особая ситуация отладки вызвана переключением задач.</p> <p>&nbsp;</p> <h3><a name="DR7"></a>Регистр DR7</h3> <p style="text-align: justify;">Регистр управления отладкой DR7 устанавливает режимы срабатывания точек останова и задает вызывающие их срабатывание формы доступа к памяти или вводу/выводу для каждой точки останова.</p> <p><a name="DR7Li"></a><strong>Li/Gi</strong> (биты 0&hellip;7)</p> <p style="text-align: justify;">Биты разрешения соответственно локальных и глобальных контрольных точек. Когда при выполнении программы процессор встречает одну из контрольных точек и для нее установлен соответствующий бит DR7.Li или DR7.Gi, генерируется особая ситуация отладки. Биты Li разрешают устанавливать контрольные точки для конкретных задач, не затрагивая другие. Gi влияют на все задачи. Биты Li автоматически очищаются при переключении задач.</p> <p><a name="DR7LE"></a><strong>LE, GE</strong> (биты 8, 9)</p> <p style="text-align: justify;">Управляют возможностью "точного соответствия контрольных точек данных". Если LE или GE установлен, сообщение о любой ловушке в контрольной точке по данным будет иметь место непосредственно после завершения команды, которая вызвала пересылку операнда. Если эти биты не установлены, сообщение об останове по данным может поступить спустя несколько команд или не поступить вообще. Рекомендуется устанавливать эти биты всякий раз, когда используются контрольные точки данных. При переключении задач LE очищается, GE &mdash; нет.</p> <p><a name="DR7LENi"></a><strong>LENi</strong> (биты 18, 19, 22, 23, 26, 27, 30, 31)</p> <p style="text-align: justify;">Поля LEN задают длину проверяемого значения для каждой контрольной точки (область, внутри которой условия останова могут сработать). Длина может составлять 1, 2 или 4 байта. Значение этих полей интерпретируется следующим образом:</p> <ul> <li>00 &ndash; один байт;</li> <li>01 &ndash; два байта;</li> <li>10 &ndash; неопределено;</li> <li>11 &ndash; четыре байта.</li> </ul> <p style="text-align: justify;">Если задано: поле RWi = 00 (прерывание при выполнении команды), то LENi должно быть равно нулю. В зависимости от LEN должно соблюдаться выравнивание адресов контрольных точек (содержаться в DR0&hellip;DR3) по границам слов (LENi = 01) или двойных слов (LENi = 11). Перед сравнением адресов процессор маскирует младшие биты записанного в DR0&hellip;DR3 адреса битами LENi, а адреса ввода/вывода расширяются нулями с 16 до 32-х бит. Срабатывание точки останова по данным происходит, если адрес хотя бы одного байта из записываемого/читаемого значения попадает в интервал задаваемый адресом в DR0&hellip;DR3 и соответствующим значением в поле DR7.LENi. Например, при DR = B0002h, R/W = 11b (чтение/запись данных), LEN = 01b (2 байта): чтение/запись 1 или 2-байтовых операндов по адресу B0002h приведут к срабатыванию ловушки, чтение/запись 4-байтового операнда по адресу B0001h приведет к срабатыванию ловушки, чтение/запись 1 или 2-байтовых операндов по адресу B0000h не приведут к срабатыванию ловушки.</p> <p><a name="DR7RWi"></a><strong>RWi</strong> (биты 16, 17, 20, 21, 24, 25, 28, 29)</p> <p style="text-align: justify;">Биты R и W задают, соответственно, для каждой контрольной точки в DR0&hellip;DR3 тип действия, при котором должна сработать ловушка.</p> <ul> <li>00 &ndash; выполнение команды;</li> <li>01 &ndash; запись данных;</li> <li>10 &ndash; Intel386, Intel486: неопределено; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pentium &hellip; : чтение/запись ввода/вывода (если <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Регистр CR4">CR4.DE</a> = 1 &mdash; включено расширение отладки); неопределено (если <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Регистр CR4">CR4.DE</a> = 0);</li> <li>11 &ndash; чтение/запись данных (исключая выборку команд).</li> </ul> <p><a name="DR7IR"></a><strong>IR</strong> (Перенаправление прерывания, бит 12: Intel386, Intel486, AMD K5)</p> <p style="text-align: justify;">Бит IR не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Назначение этого бита &ndash; управление <strong>перенаправлением прерывания</strong> (<em>Interrupt Redirection</em>) в связке с командой INT01. Когда IR&nbsp;=&nbsp;0, <a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 &mdash; Прерывание отладки (#DB)">особая ситуация 1&nbsp;(Прерывание отладки)</a> обрабатывается обычным образом. Если установить IR&nbsp;=&nbsp;1, то процессор будет пытаться вступить во взаимодействие с внешним оборудованием для входа в <em>режим эмуляции</em> (ICE). Только специальные версии процессоров могут использоваться в составе отладочных стендов в режиме эмуляции. Обычно же соответствующие выводы процессоров (необходимые для взаимодействия с <em>ICE-стендом</em>) не активны. В процессорах, начиная с Pentium и AMD K6, механизм <em>перенаправления прерывания</em> управляется через <a href="http://www.club155.ru//x86internalreg-msr" title="Внутренние регистры: Специальные регистры модели">специальный регистр модели</a> &mdash;&nbsp;<em><strong>Probe Mode Control Register</strong></em> (<em>PMCR</em>), а бит IR не используется.</p> <p><a name="DR7GD"></a><strong>GD</strong> (бит 13)</p> <p style="text-align: justify;">Бит предназначен для защиты отладчика. Используется совместно с битом <a href="http://www.club155.ru/x86internalreg-dr#DR6" title="Регистр DR6">DR6.BD</a>. Регистры отладки доступны только в реальном режиме или в защищенном режиме при уровне привилегий 0. Установка бита GD в реальном режиме и защищенном режиме на уровне привилегий 0 обеспечивает сверхзащиту всех обращений к регистрам отладки. При необходимости это гарантирует программному отладчику полный контроль над регистрами отладки. Когда бит GD установлен, попытка обратиться к любому из регистров отладки вызывает <a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 &mdash; Прерывание отладки (#DB)">особую ситуацию 1 (Прерывание отладки)</a>. При вызове процедуры обработки бит GD автоматически сбрасывается, что обеспечивает этой процедуре свободный доступ к регистрам отладки, в то же время бит&nbsp;<a href="http://www.club155.ru/x86internalreg-dr#DR6" title="Регистр DR6">DR6.BD</a> индицирует причину генерации прерывания.</p> <p><a name="DR7TR"></a><strong>TR</strong> (бит 14)</p> <p style="text-align: justify;">Бит TR (Trace 1) не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Установка TR&nbsp;=&nbsp;1 включает специальный режим трассировки, используемый при работе в составе отладочного стенда (<em>ICE-стенд</em>). В этом режиме после выполнения каждой команды процессор генерирует специальный цикл шины, который помогает внешнему оборудованию отслеживать всю последовательность выполняемых процессором команд.</p> <p><a name="DR7T2"></a><strong>T2</strong> (бит 15)</p> <p style="text-align: justify;">Бит T2 (Trace 2) не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Предположительно этот бит также необходим для взаимодействия с отладочным стендом (ICE-стенд). Вероятно он отвечает за индикацию переполнения внешнего лога трассировки, то есть информирует о том, что оборудование отладочного стенда не в состоянии отследить последовательность из множества обрабатываемых процессором команд.</p> <p>&nbsp;</p> <p style="text-align: center;">{loadposition article_footer}</p> <p>&nbsp;</p> Внутренние регистры: Тестовые регистры 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-tr Administrator admin@club155.ru <p> </p> <p style="text-align: justify;">В процессорах Intel386, Intel486 для тестирования некоторых элементов применялись т.н. <strong><em>тестовые регистры</em></strong>. TR3, TR4, TR5 — для тестирования встроенного КЭШ (Intel486), и TR6, TR7 — для тестирования TLB (Intel386, Intel486). Доступ к указанным регистрам осуществлялся при CPL = 0 с помощью команды <a href="http://www.club155.ru/x86cmd/movtr" title="MOV TR - Переслать данные в/из тестового регистра (Intel486, Intel386)">MOV TR</a>. В последующих моделях процессоров (Pentium …) Intel и другие производители отошли от данной архитектуры, функции тестирования процессора реализуются в них с помощью фирменной, зависимой от процессора архитектуры (для процессоров Intel через <a href="http://www.club155.ru/x86internalreg-msr" title="Специальные регистры модели">MSR-регистры</a>). Попытка выполнения команд доступа к тестовым регистрам <a href="http://www.club155.ru/x86cmd/movtr" title="MOV TR - Переслать данные в/из тестового регистра (Intel486, Intel386)">MOV TR</a> в этих процессорах приведет к генерации ошибки <a href="http://www.club155.ru/x86exceptions-conditions#UD" title="Прерывание 6 — Неопределенный код операции (#UD): Intel286 …">"неопределенный код опереции" (#UD)</a>.</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;">В процессорах Intel386, Intel486 для тестирования некоторых элементов применялись т.н. <strong><em>тестовые регистры</em></strong>. TR3, TR4, TR5 — для тестирования встроенного КЭШ (Intel486), и TR6, TR7 — для тестирования TLB (Intel386, Intel486). Доступ к указанным регистрам осуществлялся при CPL = 0 с помощью команды <a href="http://www.club155.ru/x86cmd/movtr" title="MOV TR - Переслать данные в/из тестового регистра (Intel486, Intel386)">MOV TR</a>. В последующих моделях процессоров (Pentium …) Intel и другие производители отошли от данной архитектуры, функции тестирования процессора реализуются в них с помощью фирменной, зависимой от процессора архитектуры (для процессоров Intel через <a href="http://www.club155.ru/x86internalreg-msr" title="Специальные регистры модели">MSR-регистры</a>). Попытка выполнения команд доступа к тестовым регистрам <a href="http://www.club155.ru/x86cmd/movtr" title="MOV TR - Переслать данные в/из тестового регистра (Intel486, Intel386)">MOV TR</a> в этих процессорах приведет к генерации ошибки <a href="http://www.club155.ru/x86exceptions-conditions#UD" title="Прерывание 6 — Неопределенный код операции (#UD): Intel286 …">"неопределенный код опереции" (#UD)</a>.</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Внутренние регистры: Специальные регистры модели 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-msr Administrator admin@club155.ru <p> </p> <p style="text-align: justify;">Современные микропроцессоры архитектуры x86 (начиная с Pentium, Pentium Pro, AMD-K6, Cyrix MII …) имеют достаточно большое количество дополнительных регистров, выполняющих контрольные, управляющие и иные функции. Эти регистры не являются стандартными, их количество и назначение (и даже методика доступа) различны в различных моделях процессоров. В процессорах производства Intel (Pentium …) такие регистры называются <strong><em>особыми регистрами модели</em></strong> — <strong>MSR</strong> (<em>Model Specific Registers</em>). Для чтения и записи этих регистров используются привилегированные команды <a href="http://www.club155.ru/x86cmd/RDMSR" title="RDMSR - Чтение из особого регистра модели">RDMSR</a> и <a href="http://www.club155.ru/x86cmd/WRMSR" title="WRMSR - Записать в особый регистр модели">WRMSR</a>. За полной информацией об этих регистрах обратитесь к техническому руководству фирмы Intel, здесь же описываются только некоторые из них.</p> <p> </p> <h3><a name="TSC"></a>Счетчик времени TSC: Pentium …</h3> <p style="text-align: justify;"><strong><em>Регистр подсчета времени TSC</em></strong> (<em>Time Stamp Counter</em>) представляет собой 64-разрядный счетчик, который устанавливается в нуль при сбросе и увеличивает свое значение на 1 в каждом процессорном такте. Однако не гарантируется, что это будет так и во всех последующих модификациях процессоров, гарантируется лишь то, что значение <strong>TSC</strong> будет монотонно возрастать не менее 10-ти лет от момента сброса процессора (реально, в процессорах Pentium, … Pentium III этот промежуток составляет сотни лет). Программы не должны использовать <strong>TSC</strong> для подсчета количества тактов. Счет продолжается и в случае останова процессора командой <a href="http://www.club155.ru/x86cmd/HLT" title="HLT - Останов">HLT</a> или сигналом <strong>STPCLK#</strong>.</p> <p style="text-align: justify;">Доступ к регистру <strong>TSC</strong> осуществляется с помощью команды <a href="http://www.club155.ru/x86cmd/RDTSC" title="RDTSC - Чтение из регистра счета времени">RDTSC</a> (в т.ч. и в некоторых процессорах производства Cyrix, AMD, …) или через привилегированные команды <a href="http://www.club155.ru/x86cmd/RDMSR" title="RDMSR - Чтение из особого регистра модели">RDMSR</a>/<a href="http://www.club155.ru/x86cmd/WRMSR" title="WRMSR - Записать в особый регистр модели">WRMSR</a> (в процессорах Pentium, … Pentium III адрес MSR-регистра — 10h), но в последующих реализациях процессоров доступ через эти команды не гарантируется. Перед началом работы с <strong>TSC</strong> пользовательская программа должна определить наличие этой функциональной возможности с помощью команды <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a> (EDX, бит 4).</p> <p style="text-align: justify;">По умолчанию, команда <a href="http://www.club155.ru/x86cmd/RDTSC" title="RDTSC - Чтение из регистра счета времени">RDTSC</a> доступна во всех режимах работы процессора — реальном, защищенном на всех уровнях привилегий, виртуальном-8086. Защищенные операционные системы могут использовать бит <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Внутренние регистры: Управляющие регистры - Регистр CR4">CR4.TSD</a> для запрета использования команды <a href="http://www.club155.ru/x86cmd/RDTSC" title="RDTSC - Чтение из регистра счета времени">RDTSC</a> на уровне привилегий отличном от 0 (<a href="http://www.club155.ru/x86internalreg-control#CR4" title="Внутренние регистры: Управляющие регистры - Регистр CR4">CR4.TSD</a> = 1). Это позволяет запретить пользовательским программам производить точный мониторинг производительности операционной системы (в обработчике <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 — Общая защита (#GP): Intel286 …">прерывания общей защиты</a> может быть реализована эмуляция данной команды).</p> <p style="text-align: justify;">Запись в регистр <strong>TSC</strong> с помощью команды <a href="http://www.club155.ru/x86cmd/WRMSR" title="WRMSR - Записать в особый регистр модели">WRMSR</a> возможна только в младшие 32 бита регистра. Старшие 32 бита при этом расширяются нулями (все сбрасываются в 0).</p> <p> </p> <h3><a name="CESR"></a><a name="CTR0"></a><a name="CTR1"></a>Регистры мониторинга производительности: Pentium</h3> <p style="text-align: justify;">Механизм мониторинга производительности процессора Pentium реализован на основе трех специальных MSR-регистров. Эти три регистра: <strong>CESR</strong> (11h), <strong>CTR0</strong> (12h), <strong>CTR1</strong> (13h) являются специфическими для процессора Pentium, в последующих моделях процессоров (Pentium Pro, Pentium II, Pentium III …) механизм мониторинга производительности значительно расширен и изменен.</p> <p style="text-align: justify;">Регистры <strong>CTR0</strong> и <strong>CTR1</strong> являются 40-рязрядными счетчиками. Каждый счетчик может быть запрограммирован для счета различных событий. Режимы работы счетчиков и типы считаемых ими событий устанавливаются программированием регистра <strong>CESR</strong> (<em>Control and Event Select Register</em>). Счетчики не изменяются при записи в регистр <strong>CESR</strong> и должны устанавливаться отдельно при переключении на новое событие. Счетчики могут работать либо в режиме счета числа событий, либо в режиме счета времени до события.</p> <p style="text-align: justify;">Подробную информацию об использовании регистров мониторинга производительности смотрите в технической документации фирмы Intel (<a href="http://www.scs.stanford.edu/nyu/04fa/lab/ia32/IA32-3.pdf" title="Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide">Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide</a>).</p> <p> </p> <h3><a name="PerfCtl0"></a><a name="PerfCtl1"></a><a name="PerfEvtSel0"></a>Регистры мониторинга производительности: Pentium Pro …</h3> <p style="text-align: justify;">В процессорах Pentium Pro, Pentium II, Pentium III механизм мониторинга производительности включает четыре MSR-регистра: <strong>PerfEvtSel0</strong> (186h), <strong>PerfEvtSel1</strong> (187h), <strong>PerfCtr0</strong> (C1h), <strong>PerfCtr1</strong> (C2h). Регистры <strong>PerfCtl0</strong> и <strong>PerfCtl1</strong> — это 40-разрядные счетчики. Счетчики могут осуществлять счет различных событий или времени до события. Управление режимами работы счетчиков осуществляется программированием регистров <strong>PerfEvtSel0</strong> и <strong>PerfEvtSel1</strong>. Для доступа к счетчикам введена новая команда <a href="http://www.club155.ru/x86cmd/RDPMC" title="RDPMC - Чтение из счетчиков мониторинга производительности">RDPMC</a>, которая позволяет считывать значения счетчиков в любом режиме работы процессора и при любом уровне привилегий, когда <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Внутренние регистры: Управляющие регистры - Регистр CR4">CR4.PCE</a> = 1 (или только при <nobr>CPL = 0</nobr>, когда <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Внутренние регистры: Управляющие регистры - Регистр CR4">CR4.PCE</a>&nbsp;=&nbsp;0).</p> <p style="text-align: justify;">Регистры мониторинга производительности процессора Pentium в более поздних моделях процессоров не поддерживаются. Аналогичные регистры процессоров Pentium Pro, … Pentium III также могут быть модифицированы в последующих устройствах.</p> <p style="text-align: justify;">Подробную информацию об использовании регистров мониторинга производительности смотрите в технической документации фирмы Intel (<a href="http://www.scs.stanford.edu/nyu/04fa/lab/ia32/IA32-3.pdf" title="Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide">Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide</a>).</p> <p> </p> <h3><a name="LastBranchToIP"></a><a name="LastBranchFromIP"></a><a name="DebugCtlMSR"></a>Регистры контроля отладки: Pentium Pro …</h3> <p style="text-align: justify;"><strong><em>Регистры контроля отладки</em></strong> расширяют возможности процессора по отслеживанию источников возникновения ошибок, упрощают трассировку и мониторинг производительности программ. В состав регистров контроля отладки входят: управляющий регистр <strong>DebugCtlMSR</strong> (1D9h), регистры адресов последнего перехода/прерывания/особой ситуации <strong>LastBranchToIP</strong> (1DCh), <strong>LastBranchFromIP</strong> (1DBh), а также регистры адресов последнего перехода перед последним прерыванием/особой ситуацией <strong>LastExceptionToIP</strong> (1DEh), <strong>LastExceptionFromIP</strong> (1DDh). Доступ ко всем указанным регистрам осуществляется при помощи привилегированных команд <a href="http://www.club155.ru/x86cmd/RDMSR" title="RDMSR - Чтение из особого регистра модели">RDMSR</a>, <a href="http://www.club155.ru/x86cmd/WRMSR" title="WRMSR - Записать в особый регистр модели">WRMSR</a>.</p> <p style="text-align: justify;">Все режимы работы регистров контроля отладки устанавливаются программированием регистра <strong>DebugCtlMSR</strong>, его формат приведен на рис.1.10.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-10_DebugCtlMSR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-10_DebugCtlMSR.svgz" width="540" height="188" alt="Формат регистра DebugCtlMSR"/> </p> <p align="center"><strong><em>Рис. 1.10. Формат регистра DebugCtlMSR</em></strong></p> <p> </p> <p><strong>LBR</strong> (бит 0)</p> <p style="text-align: justify;">Когда флаг LBR установлен, процессор автоматически производит запись адресов источника и назначения переходов, особых ситуаций (кроме <a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 — Прерывание отладки (#DB)">особых ситуаций отладки, #DB</a>) и прерываний. Каждый раз, когда происходит переход, особая ситуация или прерывание, процессор записывает указатель к команде, вызвавшей переход (особую ситуацию, прерывание), в <strong>LastBranchFromIP</strong> и указатель на адрес назначения в <strong>LastBranchToIP</strong>. Кроме того, для прерываний и особых ситуаций процессор копирует содержимое <strong>LastBranchToIP</strong> и <strong>LastBranchFromIP</strong> в <strong>LastExceptionToIP</strong> и <strong>LastExceptionFromIP</strong> до записи в них новых значений. Когда процессор генерирует <a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 — Прерывание отладки (#DB)">особую ситуацию отладки (#DB)</a>, флажок LBR автоматически очищается (перед выполнением программы реакции на особую ситуацию).</p> <p> </p> <p><strong>BTF</strong> (бит 1)</p> <p style="text-align: justify;">Когда флаг BTF установлен, процессор интерпретирует флаг трассировки <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">(E)FLAGS.TF</a> как флаг трассировки по переходам, т.е. особая ситуация отладки генерируется не после выполнения очередной команды, а после возникновения очередного перехода/прерывания/особой ситуации. Перед передачей управления в программу реакции на особую ситуацию отладки флаги <strong>DebugCtlMSR.BTF</strong> и <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">(E)FLAGS.TF</a> сбрасываются, так что для продолжения трассировки отладчик должен установить их вновь.</p> <p> </p> <p><strong>PB0, PB1, PB2, PB3</strong> (биты 2, 3, 4, 5)</p> <p style="text-align: justify;">Биты управления выводами мониторинга производительности <strong>PM0/BP0#</strong>, <strong>PM1/BP1#</strong>, <strong>PM2/BP2#</strong>, <strong>PM3/BP3#</strong>. Когда какой-либо из битов PBi установлен, процессор ассоциирует соответствующий из выводов <strong>PMi/BPi#</strong> с контрольной точкой, заданной <a href="http://www.club155.ru/x86internalreg-dr" title="Внутренние регистры: Регистры отладки ">регистром отладки DRi</a>. Сигнал на выводе сначала устанавливается по достижении соответствующей контрольной точки, а затем сбрасывается при ее следующей встрече и т.д. Когда флаг PBi сброшен, соответствующий вывод <strong>PMi/BPi#</strong> управляется регистрами мониторинга производительности.</p> <p> </p> <p><strong>TR</strong> (бит 6)</p> <p style="text-align: justify;">Бит предназначен для управления выдачей специальных сообщений трассировки внешнему устройству отладки. Сообщения трассировки представляют собой адреса источника и назначения, которые выдаются в специальных тактах на системную шину в случае возникновения перехода/прерывания/особой ситуации при <strong>DebugCtlMSR.TR</strong> = 1. Эти адреса несколько отличаются от адресов, сохраняемых в регистрах <strong>LastBranchToIP</strong> и <strong>LastBranchFromIP</strong> (подробнее смотрите в технической документации Intel — <a href="http://www.scs.stanford.edu/nyu/04fa/lab/ia32/IA32-3.pdf" title="Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide">Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide</a>).</p> <p> </p> <p style="text-align: justify;">Как указано выше, регистры <strong>LastBranchToIP</strong> и <strong>LastBranchFromIP</strong> служат для сохранения указателей для последнего перехода/прерывания/особой ситуации, а регистры <strong>LastExceptionToIP</strong> и <strong>LastExceptionFromIP</strong> — для сохранения указателей для последнего перехода перед последним прерыванием/особой ситуацией. Эти указатели могут быть использованы отладчиком в комбинации с селекторами сегмента кода, восстановленными из стека, чтобы отследить причины (источники) срабатывания контрольных точек в регистрах <a href="http://www.club155.ru/x86internalreg-dr#DR0" title="Внутренние регистры: Регистры отладки - Регистры DR0…DR5">DR0...DR3</a>. Так как указатели команды, записанные в <strong>LastBranchToIP</strong>, <strong>LastBranchFromIP</strong>, <strong>LastExceptionToIP</strong> и <strong>LastExceptionFromIP</strong> являются смещениями в сегменте кода, то для получения полного линейного адреса программное обеспечение прежде должно определить базовый адрес сегмента кода. Базовый адрес сегмента кода, в свою очередь, может быть определен чтением <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектора сегмента</a> кода из стека и использованием его для поиска <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптора сегмента</a> в <strong>GDT</strong> или <strong>LDT</strong> (базовый адрес сегмента содержится в его дескрипторе).</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;">Современные микропроцессоры архитектуры x86 (начиная с Pentium, Pentium Pro, AMD-K6, Cyrix MII …) имеют достаточно большое количество дополнительных регистров, выполняющих контрольные, управляющие и иные функции. Эти регистры не являются стандартными, их количество и назначение (и даже методика доступа) различны в различных моделях процессоров. В процессорах производства Intel (Pentium …) такие регистры называются <strong><em>особыми регистрами модели</em></strong> — <strong>MSR</strong> (<em>Model Specific Registers</em>). Для чтения и записи этих регистров используются привилегированные команды <a href="http://www.club155.ru/x86cmd/RDMSR" title="RDMSR - Чтение из особого регистра модели">RDMSR</a> и <a href="http://www.club155.ru/x86cmd/WRMSR" title="WRMSR - Записать в особый регистр модели">WRMSR</a>. За полной информацией об этих регистрах обратитесь к техническому руководству фирмы Intel, здесь же описываются только некоторые из них.</p> <p> </p> <h3><a name="TSC"></a>Счетчик времени TSC: Pentium …</h3> <p style="text-align: justify;"><strong><em>Регистр подсчета времени TSC</em></strong> (<em>Time Stamp Counter</em>) представляет собой 64-разрядный счетчик, который устанавливается в нуль при сбросе и увеличивает свое значение на 1 в каждом процессорном такте. Однако не гарантируется, что это будет так и во всех последующих модификациях процессоров, гарантируется лишь то, что значение <strong>TSC</strong> будет монотонно возрастать не менее 10-ти лет от момента сброса процессора (реально, в процессорах Pentium, … Pentium III этот промежуток составляет сотни лет). Программы не должны использовать <strong>TSC</strong> для подсчета количества тактов. Счет продолжается и в случае останова процессора командой <a href="http://www.club155.ru/x86cmd/HLT" title="HLT - Останов">HLT</a> или сигналом <strong>STPCLK#</strong>.</p> <p style="text-align: justify;">Доступ к регистру <strong>TSC</strong> осуществляется с помощью команды <a href="http://www.club155.ru/x86cmd/RDTSC" title="RDTSC - Чтение из регистра счета времени">RDTSC</a> (в т.ч. и в некоторых процессорах производства Cyrix, AMD, …) или через привилегированные команды <a href="http://www.club155.ru/x86cmd/RDMSR" title="RDMSR - Чтение из особого регистра модели">RDMSR</a>/<a href="http://www.club155.ru/x86cmd/WRMSR" title="WRMSR - Записать в особый регистр модели">WRMSR</a> (в процессорах Pentium, … Pentium III адрес MSR-регистра — 10h), но в последующих реализациях процессоров доступ через эти команды не гарантируется. Перед началом работы с <strong>TSC</strong> пользовательская программа должна определить наличие этой функциональной возможности с помощью команды <a href="http://www.club155.ru/x86cmd/CPUID" title="CPUID - Идентификация CPU">CPUID</a> (EDX, бит 4).</p> <p style="text-align: justify;">По умолчанию, команда <a href="http://www.club155.ru/x86cmd/RDTSC" title="RDTSC - Чтение из регистра счета времени">RDTSC</a> доступна во всех режимах работы процессора — реальном, защищенном на всех уровнях привилегий, виртуальном-8086. Защищенные операционные системы могут использовать бит <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Внутренние регистры: Управляющие регистры - Регистр CR4">CR4.TSD</a> для запрета использования команды <a href="http://www.club155.ru/x86cmd/RDTSC" title="RDTSC - Чтение из регистра счета времени">RDTSC</a> на уровне привилегий отличном от 0 (<a href="http://www.club155.ru/x86internalreg-control#CR4" title="Внутренние регистры: Управляющие регистры - Регистр CR4">CR4.TSD</a> = 1). Это позволяет запретить пользовательским программам производить точный мониторинг производительности операционной системы (в обработчике <a href="http://www.club155.ru/x86exceptions-conditions#GP" title="Прерывание 13 — Общая защита (#GP): Intel286 …">прерывания общей защиты</a> может быть реализована эмуляция данной команды).</p> <p style="text-align: justify;">Запись в регистр <strong>TSC</strong> с помощью команды <a href="http://www.club155.ru/x86cmd/WRMSR" title="WRMSR - Записать в особый регистр модели">WRMSR</a> возможна только в младшие 32 бита регистра. Старшие 32 бита при этом расширяются нулями (все сбрасываются в 0).</p> <p> </p> <h3><a name="CESR"></a><a name="CTR0"></a><a name="CTR1"></a>Регистры мониторинга производительности: Pentium</h3> <p style="text-align: justify;">Механизм мониторинга производительности процессора Pentium реализован на основе трех специальных MSR-регистров. Эти три регистра: <strong>CESR</strong> (11h), <strong>CTR0</strong> (12h), <strong>CTR1</strong> (13h) являются специфическими для процессора Pentium, в последующих моделях процессоров (Pentium Pro, Pentium II, Pentium III …) механизм мониторинга производительности значительно расширен и изменен.</p> <p style="text-align: justify;">Регистры <strong>CTR0</strong> и <strong>CTR1</strong> являются 40-рязрядными счетчиками. Каждый счетчик может быть запрограммирован для счета различных событий. Режимы работы счетчиков и типы считаемых ими событий устанавливаются программированием регистра <strong>CESR</strong> (<em>Control and Event Select Register</em>). Счетчики не изменяются при записи в регистр <strong>CESR</strong> и должны устанавливаться отдельно при переключении на новое событие. Счетчики могут работать либо в режиме счета числа событий, либо в режиме счета времени до события.</p> <p style="text-align: justify;">Подробную информацию об использовании регистров мониторинга производительности смотрите в технической документации фирмы Intel (<a href="http://www.scs.stanford.edu/nyu/04fa/lab/ia32/IA32-3.pdf" title="Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide">Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide</a>).</p> <p> </p> <h3><a name="PerfCtl0"></a><a name="PerfCtl1"></a><a name="PerfEvtSel0"></a>Регистры мониторинга производительности: Pentium Pro …</h3> <p style="text-align: justify;">В процессорах Pentium Pro, Pentium II, Pentium III механизм мониторинга производительности включает четыре MSR-регистра: <strong>PerfEvtSel0</strong> (186h), <strong>PerfEvtSel1</strong> (187h), <strong>PerfCtr0</strong> (C1h), <strong>PerfCtr1</strong> (C2h). Регистры <strong>PerfCtl0</strong> и <strong>PerfCtl1</strong> — это 40-разрядные счетчики. Счетчики могут осуществлять счет различных событий или времени до события. Управление режимами работы счетчиков осуществляется программированием регистров <strong>PerfEvtSel0</strong> и <strong>PerfEvtSel1</strong>. Для доступа к счетчикам введена новая команда <a href="http://www.club155.ru/x86cmd/RDPMC" title="RDPMC - Чтение из счетчиков мониторинга производительности">RDPMC</a>, которая позволяет считывать значения счетчиков в любом режиме работы процессора и при любом уровне привилегий, когда <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Внутренние регистры: Управляющие регистры - Регистр CR4">CR4.PCE</a> = 1 (или только при <nobr>CPL = 0</nobr>, когда <a href="http://www.club155.ru/x86internalreg-control#CR4" title="Внутренние регистры: Управляющие регистры - Регистр CR4">CR4.PCE</a>&nbsp;=&nbsp;0).</p> <p style="text-align: justify;">Регистры мониторинга производительности процессора Pentium в более поздних моделях процессоров не поддерживаются. Аналогичные регистры процессоров Pentium Pro, … Pentium III также могут быть модифицированы в последующих устройствах.</p> <p style="text-align: justify;">Подробную информацию об использовании регистров мониторинга производительности смотрите в технической документации фирмы Intel (<a href="http://www.scs.stanford.edu/nyu/04fa/lab/ia32/IA32-3.pdf" title="Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide">Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide</a>).</p> <p> </p> <h3><a name="LastBranchToIP"></a><a name="LastBranchFromIP"></a><a name="DebugCtlMSR"></a>Регистры контроля отладки: Pentium Pro …</h3> <p style="text-align: justify;"><strong><em>Регистры контроля отладки</em></strong> расширяют возможности процессора по отслеживанию источников возникновения ошибок, упрощают трассировку и мониторинг производительности программ. В состав регистров контроля отладки входят: управляющий регистр <strong>DebugCtlMSR</strong> (1D9h), регистры адресов последнего перехода/прерывания/особой ситуации <strong>LastBranchToIP</strong> (1DCh), <strong>LastBranchFromIP</strong> (1DBh), а также регистры адресов последнего перехода перед последним прерыванием/особой ситуацией <strong>LastExceptionToIP</strong> (1DEh), <strong>LastExceptionFromIP</strong> (1DDh). Доступ ко всем указанным регистрам осуществляется при помощи привилегированных команд <a href="http://www.club155.ru/x86cmd/RDMSR" title="RDMSR - Чтение из особого регистра модели">RDMSR</a>, <a href="http://www.club155.ru/x86cmd/WRMSR" title="WRMSR - Записать в особый регистр модели">WRMSR</a>.</p> <p style="text-align: justify;">Все режимы работы регистров контроля отладки устанавливаются программированием регистра <strong>DebugCtlMSR</strong>, его формат приведен на рис.1.10.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-10_DebugCtlMSR.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-10_DebugCtlMSR.svgz" width="540" height="188" alt="Формат регистра DebugCtlMSR"/> </p> <p align="center"><strong><em>Рис. 1.10. Формат регистра DebugCtlMSR</em></strong></p> <p> </p> <p><strong>LBR</strong> (бит 0)</p> <p style="text-align: justify;">Когда флаг LBR установлен, процессор автоматически производит запись адресов источника и назначения переходов, особых ситуаций (кроме <a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 — Прерывание отладки (#DB)">особых ситуаций отладки, #DB</a>) и прерываний. Каждый раз, когда происходит переход, особая ситуация или прерывание, процессор записывает указатель к команде, вызвавшей переход (особую ситуацию, прерывание), в <strong>LastBranchFromIP</strong> и указатель на адрес назначения в <strong>LastBranchToIP</strong>. Кроме того, для прерываний и особых ситуаций процессор копирует содержимое <strong>LastBranchToIP</strong> и <strong>LastBranchFromIP</strong> в <strong>LastExceptionToIP</strong> и <strong>LastExceptionFromIP</strong> до записи в них новых значений. Когда процессор генерирует <a href="http://www.club155.ru/x86exceptions-conditions#DB" title="Прерывание 1 — Прерывание отладки (#DB)">особую ситуацию отладки (#DB)</a>, флажок LBR автоматически очищается (перед выполнением программы реакции на особую ситуацию).</p> <p> </p> <p><strong>BTF</strong> (бит 1)</p> <p style="text-align: justify;">Когда флаг BTF установлен, процессор интерпретирует флаг трассировки <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">(E)FLAGS.TF</a> как флаг трассировки по переходам, т.е. особая ситуация отладки генерируется не после выполнения очередной команды, а после возникновения очередного перехода/прерывания/особой ситуации. Перед передачей управления в программу реакции на особую ситуацию отладки флаги <strong>DebugCtlMSR.BTF</strong> и <a href="http://www.club155.ru/index.php?Itemid=239" title="Регист флагов">(E)FLAGS.TF</a> сбрасываются, так что для продолжения трассировки отладчик должен установить их вновь.</p> <p> </p> <p><strong>PB0, PB1, PB2, PB3</strong> (биты 2, 3, 4, 5)</p> <p style="text-align: justify;">Биты управления выводами мониторинга производительности <strong>PM0/BP0#</strong>, <strong>PM1/BP1#</strong>, <strong>PM2/BP2#</strong>, <strong>PM3/BP3#</strong>. Когда какой-либо из битов PBi установлен, процессор ассоциирует соответствующий из выводов <strong>PMi/BPi#</strong> с контрольной точкой, заданной <a href="http://www.club155.ru/x86internalreg-dr" title="Внутренние регистры: Регистры отладки ">регистром отладки DRi</a>. Сигнал на выводе сначала устанавливается по достижении соответствующей контрольной точки, а затем сбрасывается при ее следующей встрече и т.д. Когда флаг PBi сброшен, соответствующий вывод <strong>PMi/BPi#</strong> управляется регистрами мониторинга производительности.</p> <p> </p> <p><strong>TR</strong> (бит 6)</p> <p style="text-align: justify;">Бит предназначен для управления выдачей специальных сообщений трассировки внешнему устройству отладки. Сообщения трассировки представляют собой адреса источника и назначения, которые выдаются в специальных тактах на системную шину в случае возникновения перехода/прерывания/особой ситуации при <strong>DebugCtlMSR.TR</strong> = 1. Эти адреса несколько отличаются от адресов, сохраняемых в регистрах <strong>LastBranchToIP</strong> и <strong>LastBranchFromIP</strong> (подробнее смотрите в технической документации Intel — <a href="http://www.scs.stanford.edu/nyu/04fa/lab/ia32/IA32-3.pdf" title="Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide">Intel Architecture Software Developer’s Manual. Volume 3: System Programming Guide</a>).</p> <p> </p> <p style="text-align: justify;">Как указано выше, регистры <strong>LastBranchToIP</strong> и <strong>LastBranchFromIP</strong> служат для сохранения указателей для последнего перехода/прерывания/особой ситуации, а регистры <strong>LastExceptionToIP</strong> и <strong>LastExceptionFromIP</strong> — для сохранения указателей для последнего перехода перед последним прерыванием/особой ситуацией. Эти указатели могут быть использованы отладчиком в комбинации с селекторами сегмента кода, восстановленными из стека, чтобы отследить причины (источники) срабатывания контрольных точек в регистрах <a href="http://www.club155.ru/x86internalreg-dr#DR0" title="Внутренние регистры: Регистры отладки - Регистры DR0…DR5">DR0...DR3</a>. Так как указатели команды, записанные в <strong>LastBranchToIP</strong>, <strong>LastBranchFromIP</strong>, <strong>LastExceptionToIP</strong> и <strong>LastExceptionFromIP</strong> являются смещениями в сегменте кода, то для получения полного линейного адреса программное обеспечение прежде должно определить базовый адрес сегмента кода. Базовый адрес сегмента кода, в свою очередь, может быть определен чтением <a href="http://www.club155.ru/index.php?Itemid=488" title="Селекторы">селектора сегмента</a> кода из стека и использованием его для поиска <a href="http://www.club155.ru/index.php?Itemid=489" title="Дескрипторы">дескриптора сегмента</a> в <strong>GDT</strong> или <strong>LDT</strong> (базовый адрес сегмента содержится в его дескрипторе).</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> Внутренние регистры: Регистры общего назначения FPU 2006-10-10T23:16:20Z 2006-10-10T23:16:20Z http://www.club155.ru/x86internalreg-fpucommon Administrator admin@club155.ru <p> </p> <p style="text-align: justify;"><strong><em>Блок вычислений с плавающей точкой</em></strong> (<strong>FPU</strong> — <em>Floating Point Unit</em>) также содержит набор внутренних регистров различного назначения. Эти регистры используются для хранения операндов, управления и индикации состояния.</p> <p style="text-align: justify;">Математический сопроцессор содержит восемь 80 рязрядных <strong><em>регистров общего назначения</em></strong> <strong>R0..R7</strong> (рис. 1.11.), которые образуют специальный <strong><em>регистровый стек FPU</em></strong>. Регистры стека обозначаются как <strong>ST(0)..ST(7)</strong> и ассоциируются с физическими регистрами <strong>R0..R7</strong> в порядке возрастания номеров. Номер регистра, соответствующего <strong><em>вершине стека</em></strong> <strong>ST(0)</strong>, определяется полем <strong>TOP</strong> <a href="http://www.club155.ru/index.php?Itemid=249" title="Регистр состояния FPU">регистра состояния SW</a>. Кроме этого, каждому регистру <strong>R0..R7</strong> соответствует двухбитовое поле в <a href="http://www.club155.ru/index.php?Itemid=248" title="Регистр тэгов FPU">регистре тэгов TW</a>. <strong>ST(0)</strong> также может обозначаться как <strong>ST</strong>.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-11_FPU-RON.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-11_FPU-RON.svgz" width="400" height="182" alt="Формат регистров общего назначения FPU"/> </p> <p align="center"><strong><em>Рис. 1.11. Формат регистров общего назначения FPU</em></strong></p> <p> </p> <p style="text-align: justify;"><strong>FPU</strong> — это функционально самостоятельный модуль, который вплоть до процессора Intel486 реализовывался в отдельной микросхеме (т.н. <strong><em>математический сопроцессор</em></strong>). Доступ к регистрам FPU возможен только с помощью специальных команд сопроцессора. В микропроцессорах начиная с Pentium математический сопроцессор встроенный.</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p> <p> </p> <p style="text-align: justify;"><strong><em>Блок вычислений с плавающей точкой</em></strong> (<strong>FPU</strong> — <em>Floating Point Unit</em>) также содержит набор внутренних регистров различного назначения. Эти регистры используются для хранения операндов, управления и индикации состояния.</p> <p style="text-align: justify;">Математический сопроцессор содержит восемь 80 рязрядных <strong><em>регистров общего назначения</em></strong> <strong>R0..R7</strong> (рис. 1.11.), которые образуют специальный <strong><em>регистровый стек FPU</em></strong>. Регистры стека обозначаются как <strong>ST(0)..ST(7)</strong> и ассоциируются с физическими регистрами <strong>R0..R7</strong> в порядке возрастания номеров. Номер регистра, соответствующего <strong><em>вершине стека</em></strong> <strong>ST(0)</strong>, определяется полем <strong>TOP</strong> <a href="http://www.club155.ru/index.php?Itemid=249" title="Регистр состояния FPU">регистра состояния SW</a>. Кроме этого, каждому регистру <strong>R0..R7</strong> соответствует двухбитовое поле в <a href="http://www.club155.ru/index.php?Itemid=248" title="Регистр тэгов FPU">регистре тэгов TW</a>. <strong>ST(0)</strong> также может обозначаться как <strong>ST</strong>.</p> <p> </p> <!-- <p align="center">{pdf=http://club155.ru/images/x86_images/1-11_FPU-RON.pdf|500|354}</p> --> <p align="center"> <img src="http://www.club155.ru/images/x86_images/1-11_FPU-RON.svgz" width="400" height="182" alt="Формат регистров общего назначения FPU"/> </p> <p align="center"><strong><em>Рис. 1.11. Формат регистров общего назначения FPU</em></strong></p> <p> </p> <p style="text-align: justify;"><strong>FPU</strong> — это функционально самостоятельный модуль, который вплоть до процессора Intel486 реализовывался в отдельной микросхеме (т.н. <strong><em>математический сопроцессор</em></strong>). Доступ к регистрам FPU возможен только с помощью специальных команд сопроцессора. В микропроцессорах начиная с Pentium математический сопроцессор встроенный.</p> <p> </p> <p style="text-align: center;">{loadposition article_footer}</p> <p> </p>