Какой набор регистров содержит типичный микропроцессор intel
Перейти к содержимому

Какой набор регистров содержит типичный микропроцессор intel

  • автор:

Архитектура процессоров 80×86

Появление первых микропроцессоров можно смело назвать эпохальным событием второй половины XX века, которым мы обязаны фирме Intel Corporation of Santa Clara, что в знаменитой Кремниевой долине в Калифорнии.

Все началось в 1971 году, когда фирма создала микросхему 4004, сумев разместить в одном кристалле большую часть компонентов процессора. Раньше подобное устройство представляло собой весьма объемистый блок. На базе 4004 был сделан первый микрокалькулятор, по тем временам казавшийся чудом техники. Почти в то же время появился специализированный микропроцессор 8008, который предназначался для использования в терминале вычислительной машины. Несмотря на то, что эти микросхемы были встречены без всеобщего восторга, видимо из-за их высокой стоимости и традиционной инертности мышления производителей электронной аппаратуры, фирма Intel продолжила свои работы в этой области, и после объявления в 1974 году о выпуске микропроцессора второго поколения 8080, компьютерная промышленность наконец зашевелилась.

Intel 8080 был первым универсальным устройством, предназначенным не только для замены жесткой логики, но и для вычислений. Он имел довольно высокую производительность, позволял адресовать значительный объем памяти, да и спектр его возможностей был существенно шире, чем у предшественников. Все это, очевидно, послужило причиной того, что микропроцессор быстро стал общепризнанным стандартом, и многие фирмы начали выпускать его по лицензии. Стали появляться улучшенные версии, например, Z80 фирмы Zilog или V10 фирмы NEC, но структура оставалась прежней. Кстати, и сама фирма Intel в 1976 году тоже выпустила модернизированный вариант кристалла 8080,— микропроцессор 8085 — заметно улучшенный аппаратно и, кроме того, дополненный несколькими командами. В него был встроен тактовый генератор и контроллер шины, добавлен простой последовательный порт и увеличена тактовая частота.

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

Здесь хотелось бы упомянуть, что фирма Intel неоднократно делала, как сказали бы военные, «маневры тактического отступления», приводившие ее к очередному успеху. Например, в 1979 году она упростила процессор 8086, создав микросхему 8088 с 8-разрядной внешней шиной данных. Двумя годами позже фирмой IBM на основе этого кристалла был создан один из первых «настоящих» персональных компьютеров, и всемирное триумфальное шествие микропроцессоров фирмы Intel началось.

Другим «отступлением» явилось создание однокристальной микро-ЭВМ 8748, объединившей процессор, тактовый генератор, контроллер шины, постоянное запоминающее устройство для хранения программ, маленькое ОЗУ и два дополнительных параллельных порта — и все это в единственной микросхеме. Возможности этого. устройства были сильно ограничены — объем оперативной памяти составлял мизерную величину в 64 байта, да и адресуемое пространство программ и количество внешних устройств также были небольшими. Правда, несмотря ни на что, 8748 вместе с еще более простым вариантом — 8035 — быстро завоевали рынок несложных устройств управления.

Но вернемся к семейству 8086. В 1983 году Intel разработала еще два микропроцессора, представлявших собой усовершенствованные варианты 8086 и 8088 — 80186 и 80188, однако получить широкого распространения они не успели, так как в том же году появился процессор 80286, ставший серьезным шагом вперед. Всего через год на его базе был создан персональный компьютер IBM PC/AT, предоставивший в распоряжение пользователя вычислительные мощности средней ЭВМ. С появлением виртуального режима стало возможным создавать на базе 80286 системы с разделением ресурсов, что раньше было прерогативой больших машин. В микропроцессоре было также реализовано управление памятью.

О более поздних моделях процессоров фирмы Intel мы попытаемся рассказать в следующих статьях, посвященных их архитектуре.

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

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

Зачастую, в однокристальных микропроцессорах используется совмещенная шина данных и адреса, что объясняется небольшим количеством выводов корпуса микросхемы (обычно 40-48). Устройство управления реализует определенный набор команд, выдавая соответствующие управляющие сигналы различным узлам и внешним устройствам. Набор команд (фактически — логика работы устройства управления) реализован аппаратно и не может быть изменен разработчиком вычислительного устройства.

В многокристальных микропроцессорах используется несколько микросхем, каждая из которых реализует отдельный узел процессора. Как правило такими узлами являются секции АЛУ, блок микропрограммного управления, специальное постоянное запоминающее устройство, содержащее команды, представляющие собой последовательности микроинструкций процессора, а также узлы, обеспечивающие работу микропроцессора. Обычно секции АЛУ выпускаются с определенной разрядностью, но возможно параллельное соединение секций, что дает возможность получения вычислительных систем практически любой разрядности. Такие микропроцессоры применяются в мощных и быстродействующих устройствах, в частности, предназначенных для управления сложными объектами, производствами и т.д.

Однокристальные микро-ЭВМ отличаются тем, что в одной БИС реализован не только микропроцессор, но и другие узлы микроЭВМ, обычно ОЗУ, память программ, тактовый генератор, несложный контроллер прерываний, последовательные и/или параллельные порты, таймеры и т.д. Существуют специализированные однокристальные микроЭВМ для обработки аналоговых сигналов, содержащие еще и многоканальные аналогово-цифровые и цифро-аналоговые преобразователи. Однокристальные микроЭВМ — наиболее универсальные устройства, однако обычно их производительность невелика, поэтому они используются в несложных управляющих системах, в измерительных приборах, в бытовой технике, в электронных игрушках и других подобных вещах.

Архитектура микропроцессоров

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

Кроме того, в микропроцессоре обязательно используются шины. Шина — это совокупность линий, по которым передаются цифровые сигналы, необходимые для обмена информацией между устройствами. В микропроцессорах фирмы Intel выделяют три шины: шину данных, шину адреса и шину управления. Кроме того, под шиной может подразумеваться стандартный набор линий, объединяющий в себе все эти три группы.

Архитектура микропроцессора i8080

8080 является однокристальным микропроцессором, работающим с 8-разрядной шиной данных и 16-разрядной шиной адреса. Управляющие сигналы передаются по шине управления. Шины отделены друг от друга. Структура Intel 8080 приведена на рис. 1.

Микропроцессор содержит внутреннюю шину данных, посредством которой происходит обмен информацией между внутренними регистрами, арифметико-логическим устройством, обрабатывающим 8-разрядные данные и передающим их через буфер на внешнюю шину данных. Кроме того, в состав 8080 входит устройство управления, буфер адресной шины, связанный с регистром команд и блок регистров. В общих чертах работа микропроцессора выглядит следующим образом: в регистре, называемом программным счетчиком, хранится адрес следующей команды, которую необходимо выполнить. Устройство управления подключает этот регистр к шине адреса (конечно, через буфер) и выдает управляющие сигналы, необходимые для чтения кода команды из памяти. На этом завершается первый такт.

В следующем такте микропроцессор проверяет состояние сигналов на входе готовности и запрос останова. При их наличии микропроцессор переходит в соответствующее состояние. В противном случае, после появления на шине управления сигналов, подтверждающих выдачу кода команды на шину данных, устройство управления подключает к ней регистр команды и записывает в нее полученный код. Это требуется потому, что команда передается только в первом машинном цикле, а сохранить ее нужно на все время выполнения команды. Из регистра команды ее код поступает в дешифратор команды и затем в устройство управления, которое в зависимости от поступившей команды либо сразу переходит к ее выполнению, либо считывает данные или адрес, расположенные сразу после кода команды и необходимые для ее выполнения. На это тратится третий такт и, если это необходимо, четвертый и пятый такты. Таким образом, вся команда выполняется за 3-5 тактов. При тактовой частоте 2 МГц это составляет 1.5-2.5 мкс.

Перед выполнением команды проверяется состояние сигнала на входе захвата шины HLD (этот сигнал отключает микропроцессор от шины, давая внешним устройствам возможность прямого доступа в память по общей шине). При его обнаружении микропроцессор переходит в состояние захвата и вырабатывает сигнал подтверждения захвата шины. После снятия сигнала HLD процессор продолжает выполнение команды. В конце машинного цикла вновь анализируется состояние входа захвата, а затем проверяется, завершено ли выполнение команды. Если нет, то микропроцессор переходит к выполнению следующего цикла команды. Это может быть цикл работы с оперативной памятью или с внешним устройством.

После выполнения каждой команды проверяется состояние входа запроса прерывания. Если этот сигнал присутствует, то текущая программа приостанавливается и на шину данных выдается сигнал «подтверждение прерывания». Затем внешний контроллер прерываний передает по шине данных команду и адрес перехода к подпрограмме обработки прерывания. По окончании обработки прерывания происходит возврат к выполнению прерванной программы.

Сигнал готовности позволяет синхронизировать работу микропроцессора с работой более медленных устройств, и, кроме того, используется для пошагового выполнения программ.

Следующим важным узлом микропроцессора является блок регистров. Он включает в себя 16-разрядный регистр для временного хранения данных WZ, шесть 8-разрядных регистров общего назначения B, C, D, E, H, L, которые могут использоваться парами в качестве 16-разрядных — BC, DE, HL (это сделано прежде всего для удобной работы с адресами). Кроме того, блок регистров содержит 16-разрядный регистр адреса команды IP (программный счетчик), 16-разрядный регистр указателя стека SP, а также 16-разрядную схему инкремента-декремента. С помощью последней изменяется, например, состояние программного счетчика после выполнения каждой следующей команды.

Еще один важный узел — регистр результата (аккумулятор), связанный с АЛУ и используемый для хранения одного из исходных операндов или результата выполнения команды.

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

Архитектура микропроцессора i8086

Микропроцессор Intel 8086 — существенно отличается от i8080. В нем применена новая значительно более мощная и гибкая система команд, есть возможность адресации 1 Мбайта памяти, обращения к 65536 устройствам ввода и такому же количеству устройств вывода информации.

В i8086 имеется возможность изменения внутренней аппаратной конфигурации с помощью специального управляющего сигнала. В более простом режиме 8086 ориентирован на использование в простых вычислительных и управляющих устройствах. При этом микропроцессор сам вырабатывает сигналы управления шиной и обеспечивает прямой доступ к ней посредством контроллера Intel 8257. В режиме полной конфигурации обеспечивается работа с контроллером шины 8288, который декодирует три сигнала состояния процессора и в зависимости от них выдает семь сигналов управления шиной. Такой режим используется в мультипроцессорных системах и в сложных вычислительных устройствах, в частности, в компьютере IBM PC/XT.

Интересно организована память: хранение 16-разрядных слов осуществляется в виде отдельных байтов, причем байты, передающиеся по восьми младшим линиям шины данных (D7-D0), собраны в банк 0, а передаваемые по восьми старшим линиям — в банк 1. Объем каждого банка составляет 512 Кбайт. Таким образом, нечетные байты хранятся в банке 1, а четные. — в банке 0. Выбор банка осуществляется с помощью младшего адреса и сигнала управления старшими разрядами шины данных.

Еще одна важная особенность — возможность обработки 256 типов прерываний (от 0 до 255), в том числе есть прерывания, определяемые пользователем, и пошаговые прерывания.

Микропроцессор Intel 8086 приспособлен для работы с несколькими процессорами в одной системе, причем возможно использование как независимых процессоров, так и сопроцессоров. Отличие заключается в том, что независимый процессор выполняет свою собственную последовательность команд, а сопроцессор следит за потоком команд центрального процессора и выделяет из него «свои» команды, расширяя набор команд основного процессора и улучшая таким образом характеристики системы. Для поддержки этих режимов используются команды ESC, LOCK и XCHG, а также специальные управляющие сигналы, позволяющие разрешать конфликты доступа к общим ресурсам.

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

Микропроцессор i8086 состоит из трех основных частей: устройства сопряжения шины, устройства обработки и устройства управления и синхронизации.

Устройство сопряжения шины состоит из шести 8-разрядных регистров очереди команд, четырех 16-разрядных регистров адреса команды, 16-разрядного регистра команды и 16-разрядного сумматора адреса (см. рис. 2). Оно выполняет следующие функции: выбирает команды из памяти и записывает их в регистр очереди команд, вычисляет и формирует физический адрес, читает операнды из памяти или из регистров и записывает результат выполнения команд в память или в регистры.

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

Устройство обработки содержит 16-разрядное арифметико-логическое устройство, восемь 16-разрядных регистров общего назначения и 16-разрядный регистр флагов. Регистры могут использоваться как 16-разрядные или как пары 8-разрядных (при этом их количество удваивается).

Архитектура микропроцессора i80286

Кристалл 80286 представляет для читателя интерес прежде всего потому, что является, пожалуй, наиболее распространенным микропроцессором из применяющихся в персональных компьютерах. Как и его предшественник — 8086 — он имеет 16-разрядные шины данных и адреса и самым характерным его отличием можно считать, помимо большей тактовой частоты, возможность работы в режиме виртуальной адресации (адресация памяти объемом более 1 Мбайта), речь о котором пойдет ниже.

Регистры

Как и любой процессор, Intel 80286 содержит некоторое количество ячеек памяти быстрого доступа, называемых регистрами. В состав i286 входят три набора по четыре регистра и один специальный регистр — указатель команды.

Регистры общего назначения

Первый набор включает в себя регистры общего назначения или РОН, необходимые для временного хранения тех операндов и результатов вычислений, доступ к которым постоянно повторяется в процессе выполнения программы. Использование РОН в подобных случаях существенно ускоряет работу системы за счет сокращения времени чтения/записи и пересылки данных из ОЗУ. Всего регистров общего назначения четыре, они, разумеется, 16-разрядные, но могут использоваться и как 8-разрядные (однобайтные), при этом их количество удваивается.

Функции всех РОН, в основном, идентичны, но в некоторых случаях архитектура предполагает их строгую специализацию. Например, при выполнении команд обработки строк и циклов, в одном из регистров должно храниться число, равное количеству итераций. Этот регистр выполняет роль счетчика (counter) и носит название CX. Остальные регистры выполняют функции аккумулятора (AX), базы (BX) и ячейки временного хранения данных (DX). Как мы уже знаем, каждый регистр из числа РОН может быть разделен на два однобайтных, один из которых (0-7) называется младшим (Low), а другой (7-15) — старшим (High). В соответствии с этим, каждый 8-разрядный регистр получил свое название: младшие именуются AL, BL, CL, DL, а старшие — AН, BН, CН и DH (рис. 3).

Перед тем как познакомиться с назначением и функциями остальных наборов регистров, разберемся, каким образом процессору с 16-разрядной шиной адреса удается работать с памятью объемом в 1 Мбайт.

Режим реального адреса

Адресная шина процессора 80286 имеет ширину 16 бит, к тому же известно, что максимальное двоичное число длиной в два байта равно 2 16 или 64 Кбайт и, если адрес задается таким числом, то, вроде бы, пространство ОЗУ, с которым может работать процессор, не должно превышать 64 Кбайт. С другой стороны, 1 Мбайт памяти можно адресовать с помощью двоичного числа длиной 20 бит (2 20 ). Как быть?

Можно, например, воспользоваться двойным адресом, ведь в повседневной жизни нам приходится постоянно сталкиваться с многоступенчатыми адресами: мы пишем на почтовом конверте сначала название города, потом — улицы, дома и т.д. (Предположим на мгновенье, что все квартиры в СССР пронумерованы последовательно, каково придется почте в такой ситуации?) Разработчики 80286 решили проблему подобным же образом: полный адрес ячейки памяти состоит из комбинации двух 16-разрядных чисел, причем одно из них предназначили для адресации внутри некоторой области ОЗУ размером 64 К байта, а второе — для локализации этой области во всем пространстве ОЗУ. Область, внутри которой происходит адресация, называется сегментом, а адрес внутри сегмента — внутрисегментным смещением. Адрес, локализующий положение сегмента в оперативной памяти, содержится в одном из специальных сегментных регистров процессора, но он тоже 16-разрядный. Для того, чтобы при помощи этого адреса можно было перекрыть все пространство ОЗУ, со стороны младшего байта его дополняют четырьмя нулями. Например, если содержимое сегментного регистра: 0001.1101.1000.1111 (или 1D8F16) то адрес начала соответствующего сегмента будет равен: 0001.1101.1000.1111.0000 (или 1D8F016). Таким образом можно искусственно разделить всю память на сегменты, начинающиеся по адресам, кратным 1610. Предположим, что внутрисегментное смещение нашей ячейки задано числом 1001.1011.0010.0101 или 9В2516, в этом случае ее реальный адрес будет равен сумме адреса сегмента и внутрисегментного смещения: 1D8F016+9B2516 = 2701516 (рис. 4).

Выполняемая программа может обращаться к любому из четырех сегментов, именуемых: текущий сегмент кода (то есть программы), текущий сегмент данных, текущий сегмент стека и текущий дополнительный сегмент.

Теперь вернемся к регистрам.

Указательные и индексные регистры

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

Регистры SI (индекс источника) и DI (индекс приемника) называются указательными и содержат смещения в текущем сегменте данных. Регистры SP (указатель стека) и ВР (указатель базы) называются базовыми и содержат смещения в текущем сегменте стека (рис. 5). Для тех, кто забыл или не знает, напомню, что стек — это способ организации работы с оперативной памятью по принципу LIFO (Last In — First Out), что в переводе означает: «последним вошел — первым вышел», то есть слово данных, помещенное в стек последним, будет извлечено оттуда в первую очередь. Само слово стек произошло от английского stack — скирда. И действительно, область памяти, организованную в виде стека, можно сравнить со скирдой сена: последние, уложенные сверху снопы будут использованы первыми — никому не придет в голову выгребать сено из середины. Для работы со стеком необходимо знать две величины: адрес дна и адрес вершины стека. Если адрес дна — число фиксированное, то адрес вершины зависит от того, сколько байтов данных содержится в стеке. В нашем случае адрес вершины находится в регистре SP.

Регистры SI и DI содержат смещения, соответственно, источника и приемника при выполнении команд обработки строк MOVSB, MOVSW, LODSB, LODSW, STOSB, STOSW и команды LOOP.

Сегментные регистры

Если мы вспомним, что программа в любой момент может обратиться к одному из четырех сегментов: к текущему сегменту кода, данных, стека или к дополнительному (сегменту данных), то нас вряд ли удивит, что в состав процессора входят четыре 16-разрядных регистра, являющихся указателями адресов текущих Сегментов. Их функции строго дифференцированы, а потому каждый регистр имеет свою «профессию»: CS определяет сегмент кода, DS — сегмент данных, SS — сегмент стека и ES — дополнительный сегмент (рис. 6).

Теперь для того, чтобы, к примеру, произвести выборку слова данных из стека, программе достаточно обратиться к регистрам SS и SP, сложить находящиеся в них числа по уже известному нам правилу и в качестве результата получить реальный адрес вершины стека.

Флажки

Не знаю как для вас, а для нас более привычно звучит термин «слово состояния», ведь, собственно говоря, совокупность значений флажков и определяет состояние процессора во время его работы. В самом общем случае слово состояния — это двоичное число, каждый бит которого отражает строго определенный параметр состояния устройства. Что касается 80286, то здесь биты слова состояния называются флажками, всего их девять, причем шесть из них регистрируют состояние процессора, а три — применяются для управления его работой (рис. 7).

К флажкам состояния относятся: флажок переноса CF (имеет значение равное 1 при переносе из старшего бита) флажок вспомогательного переноса AF (индицирует перенос из младших 4-х бит) флажок переполнения OF (устанавливается равным единице при выходе знакового результата за границу диапазона) флажок нуля ZF (фиксирует нулевой результат выполнения команды) флажок знака SF (фиксирует отрицательный результат выполнения команды) флажок четности PF (фиксирует четное число единиц в последнем байте, полученном в результате выполнения команды)

К флажкам управления относятся: флажок направления DF (указывает направление прохождения строк в строковых командах) флажок разрешения прерывания IF (разрешает или запрещает прерывание по входу INTR) флажок трассировки TF (переводит процессор в пошаговый режим)

В следующем номере мы расскажем вам о режимах адресации процессора i286.

И. Вязаничев, И. Липкин
КомпьютерПресс 1’91

Поддержите сайт, пожертвуйте биткоины:
17Fnmua2H2ct91b4QzogCsjv4tj48tjKXP

Intel x86 Краткое описание

MS Windows. Элементы архитектуры и системное программирование. ИУ-3.МГТУ. 2000. Программная архитектура микропроцессоров семейства Intel x86. Краткое описание. Автор: Сидякин И.М. Московский Государственный Технический Университет им. Н.Э. Баумана. Кафедра ИУ-3, (11.1998) Email:sidiakin@iu3.bmstu.ru В этой главе даётся представление об основных элементах программной архитектуры микропроцессоров семейства x86. Системное программное обеспечение работает в тесном взаимодействии с аппаратурой. Основные принципы, на которых строится современная операционная система, такие как мультизадачность, управление памятью, защита данных, являются развитием свойств аппаратуры. Знание основ работы аппаратуры необходимо разработчику программного обеспечения. Информация, которая приводится в этой главе, послужит основой для последующего изложения принципов работы системного программного обеспечения. Основные программные характеристики МП 8086. Первое, и наиболее простое устройство из серии процессоров х86, которое мы рассмотрим это МП 8086. Старые операционные системы, такие как, например, DOS, разрабатывались в основном в расчёте на этот микропроцессор. Основные особенности программной архитектуры МП 8086 приведены в таблице.

Регистры данных. 16(8/8) бит: AX (AH/AL), BX(BH/BL), CX(CH/CL), DX(DH/DL)
Индексные регистры 16 бит: SI, DI , BP, SP, IP
и регистры
указателей.
Сегментные 16 бит: CS, DS, SS, ES
регистры.
Разрядность шины 16 бит.
данных
Разрядность шины 20 бит.
адреса
Адресуемый 1 МБ.
диапазон памяти

Для доступа к памяти это устройство использует так называемую сегментную схему адресации. Физический адрес вычисляется по двум заданным 16-ти разрядным значениям: СМЕЩЕНИЕ и СЕГМЕНТ. Эти значения МП извлекает из кода команды. Они могут быть определены косвенно или прямо в аргументах команды. Значение сегмента всегда извлекается из сегментного регистра. Имя сегментного регистра определяется кодом команды. В случае если имя регистра не определено в исходном тексте команды, используется ряд соглашений (см. ниже примеры). СМЕЩЕНИЕ может располагаться в одном из регистров данных, указателей или индексных регистров (пример.1), прямо прописываться в аргументах команды (пример.2), или вычислятся (пример. 3).

Ex.1 Mov [SI], AX ; сегмент DS, смещение в SI
Ex.2 Mov ES:[555h], AX ; сегмент ES, смещение равно 555

;(hexadecimal) Ex.3 Mov [BP-2], AX ; сегмент SS, смещение равно ;содержимому BP минус 2. МП вычисляет физический адрес (PHA) по следующей простой формуле: PHA = (СЕГМЕНТ * 16) + СМЕЩЕНИЕ; Содержимое 16-ти разрядного сегментного регистра умножается на 16 ( (или, что тоже самое, сдвигается влево на 4 разряда), затем к полученному 20 разрядному значению прибавляется 16ти разрядное смещение.

MS Windows. Элементы архитектуры и системное программирование. ИУ-3.МГТУ. 2000. МП 8086 имеет 20 разрядную шину адреса, что ограничивает адресуемое пространство одним мегабайтом (2 20 -1 максимальное значение адреса). Рассмотренная схема адресации позволяет вычислить любой адрес в пределах 1 МБ. Архитектура МП 8086 имеет ряд особенностей. Среди прочих следует отметить: — отсутствие аппаратной поддержки защиты памяти. Это означает, что любая пользовательская или системная программа имеет доступ ко всей физически адресуемой памяти без ограничений. Часто это служит причиной сбоев. — Относительно небольшой диапазон адресного пространства. Современное программное обеспечение требует для работы, как правило, гораздо больше одного мегабайта памяти. Перечисленные выше характеристики МП 8086 определяют сферу применения этого устройства, например, в качестве микроконтроллера в измерительной системе или системе управления. Но приложения такого типа здесь обсуждаться не будут. Основные программные характеристики МП 80286. В MП 80268 реализован новый защищённый режим работы. Этот МП может работать в двух режимах. В защищённом режиме доступны новые свойства, к которым относится отличное от схемы СЕГМЕНТ:СМЕЩЕНИЕ управление памятью, включая и защиту памяти. В то же время МП 80286 может работать как МП 8086. Этот режим называется реальным. В таблице приведены основные характеристики микропроцессора 80286.

Реальный режим Защищённый режим
Регистры Те же 16 разрядные регистры МП 8086
Шина данных 16 бит
Шина адреса 24 бита
Адресуемый диапазон до 1MБ + 64КБ — 16 байт до 16 МБ
памяти
Защита памяти Не возможна Возможна

Он имеет тот же, что и МП 8086 набор 16-ти разрядных регистров и 16-ти разрядную шину данных. Но шина адреса расширена до 24 разрядов, что позволяет адресоваться к 2 24 (= 16МБ) внешней памяти. К сожалению, эту возможность нельзя использовать в реальном режиме потому, что изложенная выше схема вычисления адреса работает в пределах немного превышающих 1МБ. Шина адреса МП 8086 имеет 20 линий, что ограничивает максимальный физический адрес значением 2 20 -1. МП 80286 имеет дополнительные линии шина адреса, что позволяет, хотя и незначительно, увеличить адресное пространство доступное программам работающим в реальном режиме. Определим максимальное значение адреса, которое может быть получено схемой сегментной адресации принятой в МП 8086 и реальных режимах следующих моделей семейства. Подставив максимальные (2 16 = 0xFFFF) значения сегмента и смещения в формулу для вычисления физического адреса получим PHA = (СЕГМЕНТ * 16) + СМЕЩЕНИЕ = 0xFFFF*16 + 0xFFFF = 0xFFFF0 + 0xFFFF = 0x10FFEF. «1 мегабайт плюс 64 килобайта минус 16 байт». Таким образом, используя дополнительно 21-ю линию шины адреса, можно расширить адресное пространство процессора в реальном режиме примерно на на 64 килобайта. Приведённые расчеты определяют предел схемы вычисления адреса в реальном режиме. Эти дополнительные 64К – 16 байт называются верхней областью памяти (High Memory Area /HMA/) и используются, как правило, операционной системой (DOS) для размещения драйверов. HMA используется в реальном режиме всех микропроцессоров семейства, начиная с МП 80286. В защищённом режиме применяется другой метод адресации, который позволяет адресоваться к памяти в полном диапазоне 0 – 16МБ. Этот метод получил развитие в последующих моделях МП x86. Адресное пространство было увеличено до четырёх гигабайт. Более подробно схема работы процессора в защищённом режиме описана в следующем параграфе, который посвящён МП80386.

MS Windows. Элементы архитектуры и системное программирование. ИУ-3.МГТУ. 2000. Основные программные характеристики МП 80386. Этот микропроцессор является базовой моделью, на основе которой были разработаны последующие МП компании Intel включая МП 80486 и Pentium. Несмотря на значительные усовершенствования, отличающие последние модели микропроцессоров, существуют основные принципы архитектуры, которые их объединяют. Архитектура МП80386 построена на классических концепциях, которые операционные системы используют для управления памятью и процессом исполнения программ. Основные программные характеристики процессора приводятся в таблице:

Режимы работы Реальный, Защищённый, Режим
виртуального MП8086 (V86)
Регистры общего назначения 32-х разрядные. (доступны)
Сегментные регистры 16-ти разрядные (используются по
разному в различных режимах)
Шина данных 32 бита
Шина адреса 32 бита
Адресуемый диапазон памяти До 4-х ГБ в защищённом режиме
Основные свойства защищённого Защита памяти, Мультизадачность,
режима: Управление виртуальной памятью.

Это устройство может работать в трёх различных режимах. 1. Реальный режим. Регистры общего назначения процессора расширены до 32-х бит. Например регистр 16-ти разрядный регистр Aх составляет младшее слово 32-х разрядного регистра Eax. 32-х разрядные регистры могут использоваться в реальном режиме в логических и арифметических операциях. Однако для формирования смещения адреса в реальном режиме используются только младшие 16 разрядов этих регистров. Сегментные регистры этого МП так же 16-ти разрядные. 2. Режим виртуального МП8086 (V86). В этом режиме процессор эмулирует работу МП8086. Одновременно может быть запущено несколько виртуальных машин V86 которые разделяют процессорное время. 3. Защищённый режим. Этот режим работы процессора является основным. В защищённом режиме адресуемая память расширяется до 4ГБ. Появляется новые мощные средства управления памятью и псевдопараллельным исполнением программ. Управление памятью эта одна из наиболее важных проблем, которые операционная система решает в тесном взаимодействии с аппаратурой. Адресация в защищённом режиме МП8086 В защищённом режиме для управления памятью микропроцессор использует дополнительные «внешние» данные. Эти данные располагаются в памяти. Поэтому процессоры Intel начиная с 808386, после включения питания запускаются в реальном, а не в защищённом режиме. Системное программное обеспечение перед переключением МП в защищённый режим размещает в памяти и инициализирует все необходимые структуры данных. Ссылки на эти структуры помещаются в специальные служебные регистры МП. После этих подготовительных операций МП переключается в защищённый режим. Сегменты и схема вычисления виртуального адреса. С «точки зрения» процессора память это набор блоков, которые называются сегментами. Следует отметить, что в реальном режиме СЕГМЕНТом называется параметр в формуле вычисления адреса. В защищённом режиме термин сегмент просто имеет другой смысл. Сегменты могут размещаться в любом месте 32-х разрядного адресного пространства процессора и могут иметь размеры до 4ГБ. Диапазоны адресов сегментов могут перекрываться. Характеристики каждого сегмента описываются в структуре, которая называется дескриптор сегмента. Дескриптор содержит начальный адрес сегмента, размер (limit), информацию о типе,

MS Windows. Элементы архитектуры и системное программирование. ИУ-3.МГТУ. 2000. уровне привилегий и других атрибутах сегмента. Упрощённый формат дескриптора приведён на рисунке 1. Следует отметить, что дескрипторы используются не только для описания сегментов содержащих код, данные или стеки программ. Некоторые системные структуры, как например, локальные дескрипторные таблицы и шлюзы так же описываются дескрипторами. Форматы дескрипторов различных типов могут отличаться.

31 20 16 8 0
Base G x 0 x Limit P DPL Type Base 23..16
31..24 19..16
Base 15..0 Limit 15..0
Base 32-х битовый базовый адрес сегмента.
Limit Размер сегмента в байтах или страницах (зависит от значения бита G).

G Гранулярность. Если G = 0 Limit указан в байтах, иначе в страницах (Размер страницы 4096 байт). Type тип дескриптора. DPL Уровень привилегий дескриптора. P бит присутствия. Рисунок 1. Формат дескриптора. Дескрипторы размешаются во внешней памяти в нескольких системных таблицах. Операционная система должна создать и проинициализировать некоторые из этих таблиц перед переключением МП в защищённый режим. ОС, по крайней мере, должна создать Глобальную дескрипторную таблицу (GDT) с одним или несколькими дескрипторами сегментов содержащих системный код, данные и стек. Кроме этого следует создать Дескрипторную таблицу прерываний (IDT) которая содержит дескрипторы обработчиков прерываний. Во время работы МП в защищённом режиме дескрипторы могут модифицироваться удаляться и добавляться. Обычно операционная система создаёт одну таблицу GDT и одну таблицу IDT. Дополнительно система может создать одну или несколько Локальных дескрипторных таблиц (LDT). Каждая такая таблица выделяется для дескрипторов сегментов отдельной пользовательской программы. Такой способ используется для защиты программ друг от друга. Адреса и размеры таблиц записываются в служебные регистры микропроцессора. В регистр GDTR заносится адрес GDT, в регистр IDTR адрес IDT и в регистр LDTR адрес текущей LDT. Содержимое регистра LDTR изменяется каждый раз, когда операционная система выделяет время для исполнения очередной программы. Сегментные регистры процессора используются для ссылки на дескриптор в одной из дескрипторных таблиц. Содержимое сегментного регистра называется селектором. Селектор содержит номер дескриптора в таблице и флаг, по которому определяется в какой из таблиц LDT или GDT расположен дескриптор. Кроме этого в селекторе указываются атрибуты защиты. 13 старших разрядов занимает номер дескриптора. Следовательно, каждая таблица может содержать до 2 13 = 8K дескрипторов. Бит 2 (считая с нуля) определяет таблицу, и два младших бита используются в механизме защиты памяти (Рисунок 2).

15 2 0
Index TI RPL

Index номер дескриптора в таблице. TI выбор таблицы. Если TI = 0 используется GDT иначе LDT. RPL запрашиваемый уровень привилегий. Рисунок 2. Формат селектора. При обращении к сегменту памяти процессор дополнительно должен считать содержимое дескриптора этого сегмента. Такой способ обмена данными с памятью может существенно снизить производительность работы системы. Однако в действительности при обращении к памяти чтение дескриптора не производится. Микропроцессор имеет так называемые теневые сегментные регистры, в которых сохраняются дескрипторы сегментов. Для каждого сегментного регистра имеется теневой регистр. Теневой регистр содержит дескриптор, на который указывает селектор, записанный в сегментном регистре. Дескриптор записывается в теневой регистр, при

MS Windows. Элементы архитектуры и системное программирование. ИУ-3.МГТУ. 2000. изменении содержимого сегментного регистра. Эта технология особенно эффективна при работе с так называемой плоской моделью памяти. В такой модели используется единственный сегмент, перекрывающий всё адресное пространство. Так как вся память доступна через этот единственный сегмент, во время работы нет необходимости изменять значение сегментных регистров. Рассмотрим процедуру вычисления адреса в защищённом режиме на примере исполнения инструкции чтения памяти MOV AL, [EDI]. Эта инструкция считывает в регистр AL байт из ячейки памяти, адрес которой вычисляется по схеме изображённой на рисунке 3.

ПАМЯТЬ
Считать это в AL
Mov AL, [EDI]
GDT (или LDT)
Дескриптор
GDTR ( или LDTR) Процессор
+ База и размер таблицы
Регистр DS. Теневой регистр DS
Index Base Limit Др. атрибуты
EDI
+ СМЕЩЕНИЕ
ВИРТУАЛЬНЫЙ АДРЕС

Рисунок 3. Схема вычисления виртуального адреса в защищённом режиме. Страничная адресация. Физический адрес, это значение, которое выставляется на шину адреса процессора. Схема представленная на рисунке 3 используется для вычисления так называемого виртуального адреса. Процессор имеет встроенный механизм преобразования виртуального адреса в физический. Значения этих адресов могут не совпадать. Этот механизм называется трансляция страниц. Трансляция страниц разрешается программно установкой бита PG(31) в служебном регистре процессора CR0. Если трансляция страниц запрещена, физический адрес всегда равен виртуальному. Трансляция страниц позволяет изменить 20 старших бит виртуального адреса перед выдачей его на шину. Таблица перекодировки виртуальных адресов в физические задаётся программно. Это важное свойство аппаратуры используется операционной системой для решения ряда важнейших задач. Управление физической памятью может быть скрыто от пользовательских программ. Каждая пользовательская программа работает с линейным непрерывным диапазоном виртуальных адресов, в то время как физическую основу этого диапазона формирует операционная система. Физически данные могут быть разделены на фрагменты,

MS Windows. Элементы архитектуры и системное программирование. ИУ-3.МГТУ. 2000. которые располагаться в любом порядке в оперативной памяти или на диске. Эта гибкость в размещении данных позволяет операционной системе оптимизировать работу с памятью. Для использования механизма трансляции станиц операционная система должна разместить в памяти специальные таблицы перекодировки адресов: каталог таблиц страниц (Page Directory (PD)) и таблицы страниц (Page Tables(PT)). Форматы записей каталога и таблиц страниц приведены на рисунке 4. Схема трансляции адресов приведена на рисунке 5. Начальные адреса таблиц выровнены по границе 4К. Размер одой таблицы не может больше 4К. Следовательно, каждая таблица может содержать до 1024 32-х разрядных записей. Двухуровневая схема трансляции адресов (см. рисунок 5) позволяет охватить 1024 (записи в PD)*1024(записи в PT)*4096(размер страницы) = 4GB адресов.

31 11 0
Физический адрес страницы (или таблицы станиц xx00 D A 00 U/S R/W P
для каталога)

Физический адрес измеряется в страницах, т.о. для адресации к любой станице в пределах 4GB достаточно 20 бит. A бит доступа. МПУ устанавливает этот бит перед записью или чтением из страницы. D МПУ устанавливает этот бит (только в записях таблиц страниц) перед записью в страницу. U/S пользователь/супервизор. Определяет уровень привелегий страницы. Используется для защиты страниц. R/W чтение/запись. Ограничивает доступ к странице чтением. P бит присутствия. Указывает на то, что страница присутствует в физической памяти. Рисунок 4. Формат записи таблицы страниц/каталога страниц (PTE/PDE).

MS Windows. Элементы архитектуры и системное программирование. ИУ-3.МГТУ. 2000. ВИРТУАЛЬНЫЙ АДРЕС

31 21 11 0
номер таблицы в номер страницы в смещение внутри 4к
каталоге таблице страницы.
Регистр CR3
+ физический адрес каталога
каталог Таблица страниц
+ адрес страницы +

адрес таблицы страниц Страница (4096 байт) ФИЗИЧЕСКИЙ АДРЕС Рисунок 5. Трансляция виртуального адреса в физический. Адресное пространство процессора разбивается на блоки размером 4096 байт. Эти блоки называются страницами. Процессор может отобразить любую страницу из виртуального диапазона адресов в физический. Операционная система управляет трансляцией страниц, модифицируя записи каталога и таблиц страниц. С помощью этого механизма решаются следующие основные задачи управления памятью. Защита памяти. МП 80386 обеспечивает защиту памяти на уровне сегментов и на уровне страниц. Это разные методы защиты. Защита на уровне сегментов основана на использовании битов поля DPL дескриптора сегмента. Значение этого поля определяет уровень приоритета сегмента: 0 – самый высокий уровень (сегмент «наиболее защищён»), 1, 2 и 3. Эти уровни так же называются кольцами защиты. Основное правило защиты заключается в том, что код расположенный в сегменте с более низким уровнем приоритета не может получить доступ к данным (или коду), расположенным в сегменте с более высоким приоритетом. Пользовательские программы размещаются в сегментах с DLP > 0. Системные структуры, включая дескрипторные таблицы и таблицы страниц, располагаются в сегментах с DLP = 0. Защищённый код операционной системы так же располагается в сегментах с наивысшим уровнем привилегий. Этот код может модифицировать системные структуры и содержать привилегированные инструкции МП, которые используются для изменения содержимого служебных регистров. Пользовательское программное обеспечение может получить доступ к защищённым данным и коду, только под контролем операционной системы. Защита на уровне сегментов использует четыре уровня приоритетов. В механизме защиты памяти на уровне страниц применяется только два уровня. Для защиты страниц используются биты U/S и R/W записей таблиц страниц. Если бит U/S сброшен, страница относится к классу supervisor. Такая страница доступна только из 0-го кольца защиты. Если значение бита R/W равно 0, страница из любого кольца доступна только для чтения. В 32-х разрядных ОС Windows применяется двухуровневая схема защиты.

MS Windows. Элементы архитектуры и системное программирование. ИУ-3.МГТУ. 2000. Пользовательские приложения Win32 размещаются в сегментах (DPL = 3) покрывающих всё адресное пространство процессора. Однако, страницы в которых размещаются системные данные и код защищены от пользовательских приложений (U/S = 0). К этим страницам может обращаться только системное ПО размещённое в сегментах с DPL = 3. Сегменты с уровнями привилегий DPL = 1 и DPL = 2 не используются. 2.Расширение памяти за счёт дискового пространства. Оперативная память вычислительной системы, как правило, занимает незначительную часть адресного пространства. Однако современное программное обеспечение, например, системы управления базами данных или обработки изображений требует для нормальной работы значительных объемов памяти. В мультизадачной операционной системе память расходуется на все параллельно работающие приложения. Объем памяти может быть существенно увеличен с помощью механизма трансляции страниц. В оперативной памяти можно располагать только необходимые в данный момент страницы. Остальные страницы могут быть временно сохранены на жёстком диске. Эта выгрузка страниц на диск производится операционной системой, в случае если ресурсы оперативной памяти исчерпаны. Бит присутствия (P) в записях таблиц станиц (PTE) используется для организации загрузки страницы с диска в оперативную память по запросу. Если страница находится в физической памяти бит P установлен в единицу и запись PTE содержит адрес страницы в памяти. Если страница находится на диске, бит P сброшен, и запись PTE содержит ссылку на месторасположения страницы на диске, вместо её адреса . При попытке обращения к не присутствующей в оперативной памяти странице процессор вырабатывает исключение (page fault exception). Исключение приводит к передаче управления по заранее определённому операционной системой адресу. Вызывается программа обработчик исключения. Обработчик загружает страницу в оперативную память по какому либо физическому адресу и корректирует запись в таблице страниц. После этого обработчик возвращает управление и операция, которая привела к исключению, повторяется. Операционная система также отвечает за выгрузку страниц на диск для освобождения памяти. При этом каждый раз выбирается страница, обращение к которой производилось наиболее давно. Схема загрузки страниц по запросу приводится на рисунке 6. Данные из страницы

Физическая Страница
присутствует в Аппаратура
память
памяти управления ЧТЕНИЕ ПАМЯТИ
Страница виртуальной
памятью
Аппаратное исключение.
(страница не присутствует в
памяти)
Системное ПО
Таблица загружает страницу
страниц в память и
модифицирует
запись PTE.
запись PTE

Рисунок 6. Обработка исключения при обращении к памяти. 3.Поддержка многозадачного исполнения кода. Плоская модель памяти. Процесс трансляции адресов управляется программно. Операционная система может модифицировать запись таблицы страниц, для изменения физического адреса одной страницы,, модифицировать запись каталога таблиц страниц изменив сразу же адреса 1024 страниц или полностью изменить структуру перекодировки адресов записав новое значение в регистр CR3. Корректировка таблиц используется для поддержки псевдопараллельного исполнения программ в операционных системах MS Windows. Код и данные 32-х разрядных пользовательских

MS Windows. Элементы архитектуры и системное программирование. ИУ-3.МГТУ. 2000. приложений Windows размещается в сегментах, размер которых равен 4ГБ. Эти сегменты перекрывают друг друга и покрывают всё адресное пространство процессора. Реально приложения могут использовать только часть страниц этих сегментов. В Windows 95, например, приложению выделяется область виртуальных адресов в диапазоне от 4МВ до 2ГБ. Каждое приложение имеет своё собственное виртуальное пространство. Это означает, что одинаковые виртуальные адреса двух разных приложений проецируются в разные физические. В виртуальном адресном пространстве приложения Win32 как бы наложены друг на друга. Однако для каждого приложения операционная система создаёт отдельную структуру таблиц страниц. Приложения Windows 95 исполняются псевдопараллельно. Операционная система выделяет каждому приложению небольшие интервалы процессорного времени. Когда время очередного интервала истекает, система передаёт управление очередному приложению. В этот момент происходит модификация структуры таблиц страниц.

Архитектура x86

Процессор Intel x86 использует сложную архитектуру компьютера с набором инструкций (CISC), что означает, что существует небольшое количество специальных регистров вместо большого количества регистров общего назначения. Это также означает, что будут преобладать сложные специальные инструкции.

Процессор x86 отслеживает свое наследие, по крайней мере, еще до 8-разрядного процессора Intel 8080. Многие особенности набора инструкций x86 обусловлены обратной совместимостью с этим процессором (и с его вариантом Zilog Z-80).

Microsoft Win32 использует процессор x86 в 32-разрядном неструктурированном режиме. В этой документации основное внимание уделяется только плоскому режиму.

Регистров

Архитектура x86 состоит из следующих непривилегированных целых регистров.

Eax

Ebx

ecx

Edx

Регистр данных — можно использовать для доступа к портам ввода-вывода и арифметических функций.

Esi

Регистр исходного индекса

Edi

Регистр целевого индекса

Ebp

Регистр базового указателя

Esp

Все целочисленные регистры являются 32-разрядными. Однако многие из них имеют 16-разрядные или 8-разрядные подрегистры.

ax

Низкий 16 бит eax

Bx

Низкий 16 бит ebx

Cx

Низкий 16 бит ecx

dx

Низкий 16 бит edx

si

Низкий 16 бит esi

di

Низкий 16 бит edi

Bp

Низкий 16 бит ebp

sp

Низкий 16 бит esp

Аль

Низкий 8 бит eax

ah

Высокий 8 бит топор

Bl

Низкий 8 бит ebx

Bh

Высокие 8 бит bx

Cl

Низкий 8 бит ecx

ch

Высокие 8 бит cx

Dl

Низкий 8 бит edx

Dh

High 8 bits of dx

Работа с подрегистром влияет только на подрегистр и ни на одну из частей за пределами подрегистра. Например, сохранение в регистре оси оставляет высокие 16 бит регистра eax без изменений.

При использовании ? (Вычисление выражения) команда , регистры должны иметь префикс со знаком «at» ( @ ). Например, следует использовать ? @ax , а не ?ax. Это гарантирует, что отладчик распознает топор как регистр, а не символ.

Однако (@) не требуется в команде r (Registers). Например, r ax=5 всегда будет интерпретироваться правильно.

Два других регистра важны для текущего состояния процессора.

Eip

flags

Указатель инструкции — это адрес выполняемой инструкции.

Реестр флагов представляет собой коллекцию однобитовых флагов. Многие инструкции изменяют флаги, чтобы описать результат инструкции. Затем эти флаги можно проверить с помощью инструкций условного перехода. Дополнительные сведения см. в разделе Флаги x86 .

Соглашения о вызовах

Архитектура x86 имеет несколько различных соглашений о вызовах. К счастью, все они следуют тем же правилам сохранения регистра и возврата функций:

  • Функции должны сохранять все регистры, кроме eax, ecx и edx, которые могут быть изменены в вызове функции, и esp, которые должны обновляться в соответствии с соглашением о вызовах.
  • Регистр eax получает возвращаемые значения функции, если результат равен 32 бита или меньше. Если результат равен 64 битам, результат сохраняется в паре edx:eax .

Ниже приведен список соглашений о вызовах, используемых в архитектуре x86.

  • Win32 (__stdcall) Параметры функции передаются в стек, отправляются справа налево, а вызываемый очищает стек.
  • Вызов собственного метода C++ (также известный как thiscall) Параметры функции передаются в стек, отправляются справа налево, указатель «this» передается в регистр ECX , а вызываемый очищает стек.
  • COM (__stdcall для вызовов методов C++) Параметры функции передаются в стек, отправляются справа налево, затем указатель this помещается в стек, а затем вызывается функция. Вызываемый объект очищает стек.
  • __fastcall Первые два аргумента DWORD или меньше передаются в регистры ecx и edx . Остальные параметры передаются в стек и отправляются справа налево. Вызываемый объект очищает стек.
  • __cdecl Параметры функции передаются в стек, помещаются справа налево, а вызывающий объект очищает стек. Соглашение о вызовах __cdecl используется для всех функций с параметрами переменной длины.

Отображение регистров и флагов отладчика

Ниже приведен пример отображения регистра отладчика:

eax=00000000 ebx=008b6f00 ecx=01010101 edx=ffffffff esi=00000000 edi=00465000 eip=77f9d022 esp=05cffc48 ebp=05cffc54 iopl=0 nv up ei ng nz na po nc cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000286 

При отладке в пользовательском режиме можно игнорировать iopl и всю последнюю строку отображения отладчика.

Флаги x86

В предыдущем примере двухбуквенный код в конце второй строки — это флаги. Это одноразрядные регистры и имеют различные способы использования.

В следующей таблице перечислены флаги x86:

Код флага Имя флага Значение Состояние флага Описание
из Флаг переполнения 0 1 nvov Без переполнения — переполнение
df Флаг направления 0 1 updn Направление вверх — направление вниз
if (если); Флаг прерывания 0 1 diei Прерывания отключены — прерывания включены
Sf Флаг подписи 0 1 г. Положительный (или нулевой) — отрицательный
Zf Нулевой флаг 0 1 nzzr Ненулевое — ноль
Af Флаг вспомогательной переноски 0 1 naac Вспомогательная переноска отсутствует — Вспомогательная переноска
pf Флаг четности 0 1 pepo Нечетный четность — четность
Cf Перенос флага 0 1 nccy Без перевозки — Carry
Tf Флаг ловушки Если значение tf равно 1, процессор вызовет исключение STATUS_SINGLE_STEP после выполнения одной инструкции. Этот флаг используется отладчиком для реализации одношаговой трассировки. Его не следует использовать другими приложениями.
iopl Уровень привилегий ввода-вывода Уровень привилегий ввода-вывода— это двух битовое целое число со значениями от нуля до 3. Он используется операционной системой для управления доступом к оборудованию. Он не должен использоваться приложениями.

Когда регистры отображаются в результате выполнения какой-то команды в окне Команда отладчика, отображается состояние флага . Однако если вы хотите изменить флаг с помощью команды r (Registers), на него следует ссылаться в коде флага.

В окне Регистры WinDbg код флага используется для просмотра или изменения флагов. Состояние флага не поддерживается.

Ниже приведен пример. В предыдущем отображении регистра отображается состояние флага ng . Это означает, что флаг знака в настоящее время имеет значение 1. Чтобы изменить это, используйте следующую команду:

r sf=0 

При этом флаг знака будет равен нулю. При выполнении другого отображения регистра код состояния ng не будет отображаться. Вместо этого будет отображаться код состояния pl .

Флаг подписи, нулевой флаг и флаг переноса являются наиболее часто используемыми флагами.

Условия

Условие описывает состояние одного или нескольких флагов. Все условные операции в x86 выражаются с точки зрения условий.

Для представления условия ассемблер использует сокращение из одной или двух букв. Условие может быть представлено несколькими сокращениями. Например, AE («выше или равно») является тем же условием, что и NB («не ниже»). В следующей таблице перечислены некоторые распространенные условия и их значение.

Результат последней операции равен нулю.

Результат последней операции не равен нулю.

Последняя операция требовала переноса или заимствования. (Для целых чисел без знака это означает переполнение.)

Последняя операция не требовала переноса или заимствования. (Для целых чисел без знака это означает переполнение.)

Результат последней операции имеет высокий бит.

Результат последней операции имеет высокий бит ясности.

При обработке как целочисленной операции со знаком последняя операция вызывала переполнение или недополук.

При обработке как целочисленная операция со знаком последняя операция не приводила к переполнению или недополуку.

Условия также можно использовать для сравнения двух значений. Инструкция cmp сравнивает два операнда, а затем устанавливает флаги, как если бы вычитал один операнд из другого. Для проверка результата cmpvalue1, value2 можно использовать следующие условия.

Регистры микропроцессоров Intel

По назначению и способу использования регистры процессоров Intel можно разбить на группы:

  • регистры общего назначения
  • сегментные регистры
  • регистр флагов
  • регистр указателя команд
  • регистры управления памятью
  • регистры управления процессором
  • отладочные регистры
  • регистры MMX

Регистры общего назначения

Как следует из названия, эти регистры могут использоваться для любых целей.

EAX AX
AH AL
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
EBX BX
BH BL
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ECX CX
CH CL
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
EDX DX
DH DL
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ESI SI
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
EDI DI
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
EBP BP
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ESP SP
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Хотя эти регистры и могут использоваться для различных целей, но часть из них используются при выполнении некоторых специфичных действий:

Регистр ESP используется в качестве указателя стека, и с ним работают команды PUSH, POP и т.п.

Регистр ECX используется в качестве счетчика цикла в командах LOOP.

Регистры ESI и EDI используются как индексные регистры при работе со строковыми командами.

Для каждого 32-разрядного регистра общего назначения можно обращаться к его младшей половине как к отдельному 16-разрядному регистру (AX, BX, CX, DX, SI, DI, BP, SP). Кроме того к старшим и младшим половинам регистров AX, BX, CX и DX можно обращаться как к 8-разрядным регистрам (AH, AL, BH, BL, CH, CL, DH, DL).

Все обращения к памяти происходят через один из шести сегментных регистров: CS, DS, ES, GS, FS и SS. В этих регистрах хранятся 16-разрядные селекторы сегментов. Регистры CS и SS закреплены за сегментами кода и стека соответственно. Остальные сегментные регистры могут использоваться для любых целей, однако регистры DS и ES используются командами, работающими со строками, а регистр DS по-умолчанию используется при обращении к данным.

Регистр флагов FLAGS (EFLAGS в 32-разрядном процессоре) — это специальный регистр, отображающий состояние процессора на момент выполнения команды.

0 0 0 0 0 0 0 0 0 0 0 ID VIP VIF AC VM RF 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Зарезервированы.
Флаг идентификации ID. Если программа смогла установить или сбросить этот флаг, то это означает, что процессор поддерживает инструкцию CPUID.
Флаг ожидания виртуального прерывания VIP (P5+). Этот флаг указывает процессору, что произошло аппаратное прерывание. Флаги VIF и VIP используются в многозадачных средах для того, чтобы каждая задача имела собственный виртуальный образ флага IF.
Флаг виртуального прерывания VIF (P5+).
Флаг контроля выравнивания AC (486+). Если установить этот флаг и флаг AM в регистре CR0, каждое обращение к памяти из программ, выполняющихся с CPL = 3, не выровненное на границу слова для слов и на границу двойного слова для двойных слов, будет вызывать исключение #АС.
Флаг режима V86 (386+).
Флаг возобновления RF. Когда этот флаг равен 1, отладочные исключения временно запрещены.
Зарезервирован.
Флаг вложенной задачи NT (286+). Этот флаг устанавливается в 1, если текущая задача является вложенной по отношению к какой-то другой — в обработчиках прерываний и исключений и вызванных командой call задачах. Флаг влияет на работу команды IRET.
Уровень привилегий ввода-вывода IOPL (286+). Уровень привилегий ввода-вывода, с которым выполняется текущая программа или задача
Флаг переполнения OF. Этот флаг устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице (то есть отрицательное) и наоборот.
Флаг направления DF. Этот флаг контроллирует поведение команд обработки строк — когда он установлен в 1, строки обрабатываются в сторону уменьшения адресов, а когда DF = 0 — наоборот.
Флаг разрешения прерываний IF. Установка этого флага в 1 приводит к тому, что процессор перестает обрабатывать прерывания от внешних устройств. Обычно его устанавливают на короткое время для выполнения критических участков кода.
Флаг трассировки TF. Этот флаг был предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в 1 приводит к тому, что после выполнения каждой команды программы управление временно передается отладчику (вызывается прерывание 01h).
Флаг знака SF. Этот флаг всегда равен старшему биту результата.
Флаг нуля ZF. Устанавливается в 1, если результат предыдущей команды — ноль.
Зарезервирован
Флаг вспомогательного переноса AF. Флаг полупереноса или вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос (или заем) из третьего бита в четвертый. Этот флаг используется автоматически командами двоично-десятичной коррекции.
Зарезервирован
Флаг четности PF. Устанавливается в 1, если младший байт результата предыдущей команды содержит четное число бит, равных 1; устанавливается в 0, если число единичных бит нечетное. (Это не то же самое, что делимость на два. Число делится на два без остатка, если его самый младший бит равен нулю, и не делится, если он равен 1.).
Зарезервирован
Флаг переноса CF. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита или если требуется заем (при вычитании), иначе устанавливается в 0.

Регистр указателя команд

Регистр указателя команд IP (или EIP в 32-разрядных процессорах) — это специальный регистр процессора, указывающий на ячейку памяти, где находится следующая выполняемая команда. Значение этого регистра нельзя изменить явным образом, с помощью команд присваивания. Единственные команды, влияющие на его значение — это команды перехода (JMP, JE, JNC, . ) и команды вызова и возврата из процедур (CALL, INT, RET, . ).

Регистры управления памятью

Эти регистры используются для указания положения структур данных, ответственных за сегментацию в защищенном режиме.

GDTR Linear address Limit
47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

GDTR (Global Descriptor Table Register): 6-байтный регистр, в котором содержатся 32-битный линейный адрес начала таблицы глобальных дескрипторов (GDT) и ее 16-битный размер (минус 1). Каждый раз, когда происходит обращение к памяти, по селектору, находящемуся в сегментном регистре, определяется дескриптор из таблицы GDT или LDT, в котором записан адрес начала сегмента и другая информация.

IDTR Linear address Limit
47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

IDTR (Interrupt Descriptor Table Register): 6-байтный регистр, в котором содержатся 32-битный линейный адрес начала таблицы глобальных дескрипторов обработчиков прерываний (IDT) и ее 16-битный размер (минус 1). Каждый раз, когда происходит прерывание или исключение, процессор передает управление на обработчик, описываемый дескриптором из IDT с соответствующим номером.

LDTR Selector
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

LDTR (Local Descriptor Table Register): 16-битный регистр, в котором содержится селектор для GDT, описывающий текущую таблицу локальных дескрипторов (LDT).

TR Selector
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

TR (Task Register): 16-битный регистр, в котором содержится селектор для GDT, описывающий TSS текущей задачи.

Регистры управления процессором

Пять 32-битных регистров CR0 – CR4 управляют функционированием процессора и работой отдельных его внутренних блоков.

CR0 PG CD NW AM WP NE ET TS EM MP PE
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CR0 (Control Register 0): 32-битный регистр, содержащий флаги управления процессором:

Флаг страничной адресации PG (386+). Если бит установлен, то включен режим страничной адресации.
Флаг отключения кэширования CD (486+). Если флаг установлен, то отключается запись в кэш 1 уровня. Считывание из кэша все равно будет происходить.
Флаг сквозного кэширования NW (486+). Если флаг установлен, то отключается сквозная запись во внутренний кэш, то есть данные, записываемые в кэш, не появляются на внешних выводах процессора.
Флаг контроля выравнивания AM (486+). Если флаг установлен, то флагу АС разрешается включать режим выравнивания данных.
Флаг защиты от записи WP (486+). Если флаг установлен, то запрещается запись в страницы, помеченные как только для чтения на всех уровнях привилегий
Флаг ошибки сопроцессора NE (486+). Если флаг установлен, то процессор при возникновении ошибки в операциях с плавающей точкой генерирует соответствующее исключение. Если флаг сброшен, то процессор генерирует прерывание, которое должно обрабатываться внешним контроллером прерываний.
Флаг типа сопроцессора ET (386, 486). Если флаг сброшен, то это означает, что используется внешний сопроцессор. Если флаг установлен, то сопроцессор — встроенный. На всех новых процессорах этот флаг равен 1.
Флаг переключенния задачи TS (286+). Процессор устанавливает этот флаг после переключения задачи. Если после этого выполнить любую команду сопроцессора, то процессор сгенерирует исключение.
Флаг эмуляции сопроцессора EM (286+). Если флаг установлен, то каждая команда сопроцессора будет вызывать исключение.
Флаг наличия сопроцессора MP (286+). Этот флаг влияет на выполнение команд WAIT и FWAIT. Должен быть установлен для совместимости с программами, написанными для 80286 и 80386 и использующими эту команду.
Флаг защищенного режима PE (286+). Если флаг установлен, то процессор переключается в защищенный режим работы.
CR1
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CR1 (Control Register 1): Зарезервирован.

CR2 Page-Fault Linear Address
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CR2 (Control Register 2): 32-битный регистр, содержащий линейный адрес, вызвавший исключение «ошибка страницы». Код ошибки, запоминаемый при возникновении исключения сохраняется в стеке обработчика страничного нарушения.

CR3 Page-Directory Base PCD PWT
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CR3 (Control Register 3): 32-битный регистр, содержащий физический адрес корневого каталога страниц памяти (биты 31-11, если флаг PAE в регистре CR4 сброшен; биты 31-5, если флаг PAE в регистре CR4 установлен), а также биты по управлению кэшированием страниц памяти:

бит 4: Флаг запрещения кэширования страниц PCD (486+). Если бит установлен, то текущая страница не будет загружена в кэш.
бит 3: Флаг сквозного кэширования страниц PWT (486+). Этот флаг управляет методом записи страниц во внешний кэш.
CR4 FPE FSR PCE PGE MCE PAE PSE DE TSD PVI VME
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

CR4 (Control Register 4): 32-битный регистр, управляющий использованием архитектурных расширений процессоров Pentium и более новых. Наличие этих расширений необходимо проверять при помощи команды CPUID:

Флаг поддержки операционной системой исключений XMM (PIII+). Если бит установлен, то разрешается генерация исключения #19 (ошибка SIMD). Если бит сброшен, будет генерироваться исключение #6 (недействительный код операции).
Флаг поддержки команд FXSAVE/FXRSTOR (PII+). Этот флаг разрешает командам FXSAVE и FXRESTOR, сохранять и восстанавливать контекст XMM.
Флаг разрешения команды RDPMC (P6+). Если этот флаг установлен, то выполнение команды RDPMC разрешено на всех уровнях привилегий. Если этот флаг сброшен, то выполнение команды RDPMC разрешено только на нулевом уровне привилегий.
Флаг разрешения глобальности PGE (P6+). Если этот флаг установлен, то для элементов таблиц страниц допускается использование бита 8 (атрибут глобальности страницы).
Флаг разрешения машинного контроля MCE (P5+). Если флаг установлен, то разрешается генерирование исключения #19, возникающего, когда блок внутреннего контроля операций обнаруживает ошибку.
Флаг расширения физического адреса PAE (P6+). Если флаг установлен, то включается режим 36-битного физического адресного пространства.
Флаг расширения размера страниц PSE (P5+). Если флаг установлен, то включается режим адресации с 4-мегабайтными страницами памяти.
Флаг расширенной отладки DE (P5+). Позволяет устанавливать отладочные точки останова на обращение к портам ввода-вывода. Если флаг установлен, то любое обращение к регистрам DR4 и DR5 вызовет исключение #06 (недопустимый код операции). Если бит сброшен, то обращение к регистрам DR4 и DR5 приведет к обращению к регистрам DR6 и DR7 соответственно.
Флаг запрещения счетчика времени RDTSC (P5+). Если флаг установлен, то выполнение команды RDTSC возможно только на нулевом уровне привилегий. Если флаг сброшен, то выполнение команды RDTSC возможно на всех уровнях привилегий.
Флаг поддержки VIF (P5+). Если флаг установлен, то разрешается использование флага VIF.
Флаг расширения виртуального режима VME (P5+). Если флаг установлен, то включается расширенная обработка прерываний и исключений в состоянии V86

Восемь 32-разрядных регистров DR0-DR7 расширяют возможности по отладке программ на микропроцессорах Intel, начиная с 386 модели. Они устанавливают точки останова по данным и позволяют устанавливать точки останова по командам без модификации кода программ.

Линейный адрес точки останова
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Регистры DR0-DR3 содержат 32-битные линейные адреса четырех возможных точек останова по доступу к памяти.

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Регистры DR4-DR5 зарезервированы. На процессорах до Pentium, или если бит DE регистра CR4 равен нулю, обращение к этим регистрам приводит к обращению к DR6 и DR7 соответственно. Если бит DE = 1, происходит исключение #06 (недопустимая операция).

1 BT BS BD 0 1 B3 B2 B1 B0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Регистр DR6: 32-разрядный регистр состояния отладки. Он содержит информацию о причине отладочного останова для обработчика исключения #01 (отладочное прерывание):

Зарезервированы. Должны быть 1.
Если флаг BT установлен, то причина прерывания — установленный отладочный бит в TSS задачи, в которую произошло переключение.
Если флаг BS установлен, то причина прерывания — установленный флаг трассировки TF в регистре EFLAGS.
Если флаг BD установлен, то причина прерывания — попытка обращения программы к отладочным регистам при установленном бите GD регистра DR7.
Зарезервирован. Должен быть 0.
Зарезервированы. Должны быть 1.
Если флаг B3 установлен, то причина прерывания — точка останова 3.
Если флаг B2 установлен, то причина прерывания — точка останова 2.
Если флаг B1 установлен, то причина прерывания — точка останова 1.
Если флаг B0 установлен, то причина прерывания — точка останова 0.

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

LEN3 R/W3 LEN2 R/W2 LEN1 R/W1 LEN0 R/W0 0 0 GD 0 0 1 GE LE G3 L3 G2 L2 G1 L1 G0 L0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Регистр DR7: 32-разрядный регистр, задающий условие для точек останова:

Размер точки останова 3.
00 — 1 байт
01 — 2 байта
10 — зарезервировано
11 — 4 байта
Тип точки останова 3.
00 — на выполнение команды
01 — на запись
10 — на порт ввода-вывода (при установленном бите DE регистра CR4)
11 — на чтение/запись
Размер точки останова 2.
Тип точки останова 2.
Размер точки останова 1.
Тип точки останова 1.
Размер точки останова 0.
Тип точки останова 0.
Зарезервированы. Должны быть 0.
Флаг защиты отладочных регистров GD. Если флаг установлен, то включается режим, при котором обращение к любому отладочному регистру, даже из уровня привилегий 0, вызывает исключение #01. Этот бит автоматически сбрасывается внутри обработчика этого исключения.
Зарезервированы. Должны быть 0.
Зарезервирован. Должен быть 1.
Флаг точного обнаружения инструкции в глобальной точке останова GE. Начиная с Pentium Pro не поддерживается. Должен быть 1.
Флаг точного обнаружения инструкции в локальной точке останова LE. Начиная с Pentium Pro не поддерживается. Должен быть 1.
Флаг включения глобальной точки останова 3. Действует на все задачи и не сбрасывается при переключении задач.
Флаг включения локальной точки останова 3. Действует только на текущую задачу и сбрасывается при переключении на другую задачу.
Флаг включения глобальной точки останова 2.
Флаг включения локальной точки останова 2.
Флаг включения глобальной точки останова 1.
Флаг включения локальной точки останова 1.
Флаг включения глобальной точки останова 0.
Флаг включения локальной точки останова 0.

Регистры MMX — это восемь 64-разрядных регистров MM0-MM7. Однако, физически никаких новых регистров с введением ММХ не появилось — ММ0 – ММ7 — это в точности мантиссы восьми регистров FPU, от R0 до R7. При записи числа в регистр ММХ оно появляется в битах 63 – 0 соответствующего регистра FPU, а экспонента (биты 78 – 64) и ее знаковый бит (бит 79) заполняются единицами. Запись числа в регистр FPU также приводит к изменению соответствующего регистра ММХ. Таким образом, нельзя одновременно пользоваться командами для работы с числами с плавающей запятой и командами ММХ, а если это необходимо — следует пользоваться командами FSAVE/FRSTQR,каждый раз перед переходом от использования FPU к ММХ и обратно (эти команды сохраняют состояние регистров ММХ точно так же, как и FPU).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *