Основы микропроцессорной техники | |
Раздел 3. Функционирование процессора | |
| «Структура курса | Раздел 1 | Раздел 2 | Раздел 3 | Раздел 4 | Раздел 5 | Раздел 6 | Раздел 7 | Глава 8 | Дополнения | |
| Раздел 3 - Страницы: 1 | 2 | 3 | 4 | 5 | » | |
Основная функция любого процессора, ради которой он и создается, - это выполнение команд. Система команд, выполняемых процессором, представляет собой нечто вроде таблицы истинности логических элементов или таблицы режимов работы более сложных логических микросхем. То есть она определяет логику работы процессора и его реакцию на те или иные комбинации внешних событий. Написание программ для микропроцессорной системы - важнейший и часто трудоемкий этап разработки такой системы. А для создания эффективных программ необходимо иметь хотя бы самое общее представление о системе команд используемого процессора. Самые компактные и быстрые программы и подпрограммы создаются языке Ассемблер, использование которого без знания системы команд абсолютно невозможно, ведь речь Ассемблер - символьная запись цифровых кодов машинного языка, кодов команд процессора. Конечно, для разработки программного обеспечения существуют всевозможные программные средства. Пользоваться ими обычно можно и без знания системы команд процессора. Наиболее часто применяются языки программирования высокого уровня, такие как Паскаль и Си. Однако знание системы команд и языка Ассемблер позволяет в несколько раз повысить эффективность некоторых наиболее важных частей программного обеспечения любой микропроцессорной системы - от микроконтроллера к персональному компьютеру. Именно поэтому в данном разделе мы рассмотрим основные типы команд, существующих в большинстве процессоров, и особенности их применения. Каждая команда, выбранная (прочитана) из памяти процессором, определяет алгоритм поведения процессора на ближайшие несколько тактов. Код команды говорит о том, какую операцию должно быть выполнено процессором и с какими операндами (т.е. кодами данных), где взять исходную информацию для выполнения команды и куда поместить результат (если необходимо). Код команды может занимать от одного до нескольких байт, причем процессор узнает о том, сколько байт команды ему надо читать, с первого прочитанного им байта или слова. В процессоре код команды расшифровывается и превратится в набор микроопераций, выполняемых отдельными узлами процессора. Но производителю микропроцессорных систем это знание не слишком важно, ему важен только результат выполнения той или другой команды. 3.1. Адресация операндовБольшая часть команд процессора работает с кодами данных (операндами). Одни команды требуют входных операндов (одного или двух), другие выдают выходные операнды (чаще один операнд). Входные операнды называются еще операндами-источниками, а выходные называются операндами-приемниками. Все эти коды операндов (входные и выходные) должны где располагаться. Они могут находиться во внутренних регистрах процессора (наиболее удобный и быстрый вариант). Они могут располагаться в системной памяти (наиболее распространенный вариант). Наконец, они могут находиться в устройствах ввода / вывода (редчайший случай). Определение места положения операндов происходит кодом команды. Причем существуют различные методы, с помощью которых код команды может определить, откуда брать входной операнд и куда помещать выходной операнд. Эти методы называются методами адресации. Эффективность выбранных методов адресации во многом определяет эффективность работы всего процессора в целом. 3.1.1. Методы адресацииКоличество методов адресации в разных процессорах может быть от 4 до 16. Рассмотрим несколько типичных методов адресации операндов, используемых сейчас в большинстве микропроцессоров. Непосредственная адресация (Рис. 3.1) предполагает, что операнд (входной) находится в памяти непосредственно за кодом команды. Операнд обычно представляет собой константу, которую надо куда-то переслать, к чему добавить и т.д. Например, команда может состоять в том, чтобы добавить число 6 к содержимому некоего внутреннего регистра процессора. Это число 6 будет располагаться в памяти, внутри программы в адресе, который следует за кодом данной команды добавления.
Прямая (она же абсолютная) адресация (рис. 3.2) предполагает, что операнд (входящий или исходящий) находится в памяти по адресу, код которого находится внутри программы сразу же по коду команды. Например, команда может состоять в том, чтобы очистить (сделать нулевым) содержимое ячейки памяти с адресом 1000000. Код этого адреса 1000000 будет располагаться в памяти, внутри программы в следующей адресу по коду данной команды очистки.
Регистровая адресация (Рис. 3.3) предполагает, что операнд (входящий или исходящий) находится во внутреннем регистре процессора. Например, команда может состоять в том, чтобы переслать число с нулевого регистра в первый. Номера обоих регистров (0 и 1) будут определяться кодом команды пересылки. Косвенно-реестровая (она же косвенная) адресация предполагает, что во внутреннем регистре процессора находится не сам операнд, а его адрес в памяти (Рис. 3.4). Например, команда может состоять в том, чтобы очистить ячейку памяти с адресом, который находится в нулевом регистре. Номер этого регистра (0) будет определяться кодом команды очистки.
Реже встречаются еще два метода адресации. Автоинкрементным адресация очень близка к косвенной адресации, но отличается от нее тем, что после выполнения команды содержимое используемого регистра увеличивается на единицу или на два. Этот метод адресации очень удобен, например, при последовательной обработке кодов из массива данных, находящейся в памяти. После обработки какого кода адрес в регистре будет указывать уже на следующий код из массива. При использовании косвенной адресации в данном случае пришлось бы увеличивать содержимое этого регистра отдельной командой. Автодекрементна адресация работает подобно автоинкрементным, но только содержимое выбранного регистра уменьшается на единицу или на два перед выполнением команды. Эта адресация также удобна при обработке массивов данных. Совместное использование автоинкрементным и автодекрементнои адресаций позволяет организовать память стеков типа (см. раздел 2.4.2). Из других распространенных методов адресации можно упомянуть о индексные методы, предполагающие для вычисления адреса операнда добавления к содержимому регистра заданной константы (индекса). Код этой константы располагается в памяти непосредственно за кодом команды. Отметим, что выбор того или иного метода адресации в значительной степени определяет время выполнения команды. Самая быстрая адресация - это регистровая, так как она не требует дополнительных циклов обмена магистралью. Если же адресация требует обращения к памяти, то время выполнения команды будет увеличиваться за счет продолжительности необходимых циклов обращения к памяти. Понятно, что чем больше внутренних регистров у процессора, тем чаще и свободнее можно применять регистровая адресацию, и тем быстрее будет работать система в целом. 3.1.2. Сегментирование памяти.Говоря о адресацию, нельзя обойти вопрос о сегментации памяти, которое применяется в некоторых процессорах, например в процессорах IBM PC-совместимых персональных компьютеров. В процессоре Intel 8086 сегментирование памяти организовано следующим образом: Вся память системы представляется не в виде непрерывного пространства, а в виде нескольких частей - сегментов заданного размера (по 64 байт), положение которых в пространстве памяти можно изменять программным путем. Для сохранения кодов адресов памяти используются не отдельные регистры, а пары регистров:
При этом физическое 20-разрядный адрес памяти, которая выставляется на внешнюю шину адреса, образуется так, как показано на Рис. 3.5, то есть путем добавления смещения и адреса сегмента со смещением на 4 бита. Положения этого адреса в памяти показано на Рис. 3.6. Сегмент может начинаться только на 16-байтных пределы памяти (так как адрес начала сегмента, по сути, четыре младших нулевых разряда, как видно из Рис. 3.5), т.е. с адреса, которая кратна 16. Эти допустимые границы сегментов называются границами параграфов. Отметим, что ввод сегментирование, прежде всего, связано с тем, что внутренние регистры процессора 16-разрядные, а физический адрес памяти 20-разрядный (16-разрядный адрес позволяет использовать память только в 64 Кбайт, что явно недостаточно) . В процессоре, который появился в то же время, MC68000 фирмы Motorola внутренние регистры 32-разрядные, поэтому там проблемы сегментирования памяти не возникает.
Применяются и более сложные методы сегментации памяти. Например, в процессоре Intel 80286 в так называемом безопасном режиме адрес памяти исчисляется в соответствии с Рис. 3.7. В сегментном регистре в данном случае сохраняется не базовая (начальная) адрес сегментов, а коды селекторов, определяющие адреса в памяти, по которым сохраняются дескрипторы (т.е. описания) сегментов. Область памяти с дескрипторы называется таблицей дескрипторов. Каждый дескриптор сегмента содержит базовую адрес сегмента, размер сегмента (от 1 до 64 Кбайт) и его атрибуты. Базовый адрес сегмента имеет разрядность 24 бит, что обеспечивает адресацию 16 Мбайт физической памяти.
Таким образом, на сумматор, вычисляемый физический адрес памяти, подается не содержимое сегментного регистра, как в предыдущем случае, а базовый адрес сегмента из таблицы дескрипторов. Еще более сложный метод адресации памяти с сегментирование использован в процессоре Intel 80386 и в более поздних моделях процессоров фирмы Intel. Этот метод иллюстрируется Рис. 3.8. Адрес памяти (физический адрес) исчисляется в три этапа. Сначала вычисляется так называемая эффективная адрес (32-разрядная) путем суммирования трех компонентов: базы, индекса и смещения (Base, Index, Displacement), причем возможно умножения индекса на масштаб (Scale). Эти компоненты имеют следующий смысл:
Затем специальный блок сегментации вычисляет 32-разрядную линейную адрес, представляющий собой сумму базового адреса сегмента из сегментного регистра с эффективной адресу. Наконец, физическая 32-разрядный адрес памяти образуется путем преобразования линейной адреса блоком страничной переадресации, которая осуществляет перевод линейной адреса в физический страницами по 4 байт. В любом случае сегментирование позволяет выделить в памяти один или несколько сегментов для данных и один или несколько сегментов для программ. Переход от одного сегмента к другому сводится всего лишь к изменению содержимого сегментного регистра. Иногда это бывает очень удобно. Но для программиста работать с сегментированной памятью обычно сложнее, чем с непрерывной, несегментованою памятью, так как приходится следить за пределами сегментов, по их описанию, переключением и т.д. 3.1.3. Адресация байтов и словМногие процессоров, имеют разрядность 16 или 32, способные адресовать не только целое слово в памяти (16-разрядной или 32-разрядное), но и отдельные байта. Каждому байту в каждом слове при этом уделяется свой адрес. Так, в случае 16-разрядных процессоров все слова в памяти (16-разрядные) имеют четные адреса. А байта, входящих в эти слова, могут иметь как четные адреса, так и нечетные. Например, пусть 16-разрядная ячейка памяти имеет адрес 23420, и в ней хранится код 2А5Е (Рис. 3.9).
При обращении к целому слова (с содержимым 2А5Е) процессор выставляет адрес 23420. При обращении к младшему байту этой ячейки (с содержимым 5Е) процессор выставляет ту же адрес 23420, но использует команду, адресует байт, а не слово. При обращении к старшему байта этой же ячейки (с содержимым 2А) процессор выставляет адрес 23421 и использует команду, адресует байт. Следующая 16-разрядная ячейка памяти с содержанием 487F будет иметь адрес 23422, то есть опять же парную. Ее байты будут иметь адреса 23422 и 23423. Для возможности отличить байтовые и сливни циклы обмена на магистрали в шине управления предусматривается специальный сигнал байтового обмена. Для работы с байтами в систему команд процессора вводятся специальные команды или предусматриваются методы байтов адресации. | |
| «Структура курса Раздел 3 - Страницы: 1 | 2 | 3 | 4 | 5 |» | |