В 1978 г. рынок 8-битных микропроцессоров был переполнен, и вместо того, чтобы продолжать борьбу на нём, фирма Intel сделала качественный шаг вперёд и выпустила первый в мире 16-битный микропроцессор.
16-битный микропроцессор Intel 8086, выпущенный 8 июня 1978 г., содержал на кристалле размером 5,5x5,5 мм около 29000 транзисторов. Производительность процессора 8086 значительно превышает производительность его 8-битного предшественника – микропроцессора 8080 – и составляет от 330 до 750 тыс. операций в секунду. Хотя и имеется определённая совместимость микропроцессора 8086 с архитектурой ЦП 8080, разработчики не ставили перед собой цели достичь её полностью. Число линий адреса увеличено с 16 до 20, что позволяет адресовать память 1 Мбайт вместо 64 Кбайт. Увеличение ёмкости памяти упрощает переход к мультипрограммированию, поэтому в микропроцессоре 8086 предусмотрено несколько мультипрограммных возможностей. Кроме того, в микропроцессор 8086 встроены некоторые средства, упрощающие реализацию мультипроцессорных систем, что позволяет применять его с другими процессорами, например с процессором числовых данных 8087.
То обстоятельство, что 16 из линий адреса микропроцессора используются и как линии данных, приводит к тому, что на системную шину нельзя одновременно выдавать адреса и данные. Мультиплексирование адресов и данных во времени сокращает число контактов корпуса до 40, но и замедляет скорость передачи данных. Однако благодаря тщательно разработанной временной диаграмме работы скорость передачи уменьшается не столь значительно, как этого следовало бы ожидать. Микропроцессор имеет 16 линий управления, предназначенных для сигналов квитирования во время передач данных и внешнего управления ЦП. Он рассчитан на одно напряжение питания +5 В и однофазную синхронизацию, частота которой достигает 5 МГц. (Модель 8086-2 имеет частоту синхронизации до 8 МГц, а модель 8086-1 – до 10 МГц.) Потребляемая процессором 8086 мощность составляет 1,75 Вт.
Хотя микропроцессор 8086 может обращаться к слову по любому адресу, при нечётном адресе требуются два обращения к памяти: для младшего и для старшего байтов. Следовательно, возможна некоторая экономия времени, если хранить слова только по чётным адресам.
Внутри микропроцессора имеются следующие регистры: регистр команд, которым фактически служит 6-байтная очередь; 4 регистра данных, представляющих собой, по существу, набор арифметических регистров; группа указательных регистров, содержащая базовый и два индексных регистра, а также программный счётчик и указатель стека; группа из четырёх сегментных регистров; 16-битное слово состояния процессора (регистр флажков). Все регистры имеют длину 16 бит. Регистры данных допускают адресацию не только целых регистров, но и их младшей и старшей половин.
Из 16 бит слова состояния процессора семь не используются, а остальные делятся на флажки условий (флажки знака, нуля, чётности, переноса, вспомогательного переноса и переполнения), отражающие результат предыдущей операции, и флажки управления (флажки направления, прерываний и трассировки), от которых зависит выполнение специальных функций. Все флажки условий, кроме флажка переполнения, размещены в младшем байте регистра.
Как говорилось ранее, участвующие в формировании адреса указательные регистры имеют длину всего 16 бит, поэтому эффективный адрес (сумма базового и индексного адресов и смещения) имеет такую же длину. Но, с другой стороны, выдаваемый на шину адреса физический адрес должен содержать 20 бит. Дополнительные 4 бита образуются при сложении эффективного адреса с содержимым одного из сегментных регистров, умноженным на 16. Если результат сложения превосходит 220 – 1, 21-й бит отбрасывается; это называется «заворачиванием» адреса, потому что за максимальным адресом как бы следует нулевой.
Применение сегментных регистров, по существу, разделяет пространство памяти на перекрывающиеся сегменты, каждый из которых имеет размер 64 Кбайт и начинается на 16-байтной границе (называемой границей параграфа), т.е. начинается с адреса, кратного 16. 16 сегментов, начинающихся с адресов, кратных 64К, называют страницами памяти, а такие адреса – границами страниц. Как нетрудно увидеть, страницы не пересекаются между собой и покрывают всю доступную память. Обычно деление на страницы используется для совместного функционирования устройств, интерфейсы которых отображены на адресное пространство памяти; тогда каждое такое устройство использует одну страницу памяти, и адрес ячейки в адресном пространстве устройства будет совпадать с её адресом в сегменте, начинающемся там же, где и эта страница памяти. Также страничное деление упрощает разработку устройств, совместимых друг с другом, поскольку оно допускает лишь 16 типов устройств, отображающих свои интерфейсы на память. Так, в компьютере IBM PC страницы памяти с A по E используются как «видеопамять» (адресное пространство видеоадаптера), а страница F занята БСВВ, размещённой в ПЗУ. Это ограничивает память, доступную пользователю, до 640 Кбайт. В защищённом режиме при использовании виртуальной памяти понятию «страница памяти» придаётся совершенно иное значение. Об этом будет рассказано в дальнейшем.
Наличие сегментных регистров обеспечивает следующие преимущества:
· ёмкость памяти может доходить до 1 Мбайт, хотя команды оперируют 16-битными адресами;
· секции кода, данных и стека могут иметь длину более 64 Кбайт благодаря использованию нескольких сегментов кода, данных или стека;
· упрощается использование отдельных областей памяти для программы, её данных и стека;
· при каждом выполнении программы она сама и (или) её данные могут размещаться в разных областях памяти. (Это связано также с мультипрограммированием, поскольку позволяет динамически перемещать программы между различными областями памяти.)
Сигнал сброса процессора обнуляет все его регистры, кроме регистра сегмента кода, в который загружается шестнадцатеричное значение FFFF. Таким образом, при перезагрузке процессора управление передаётся по физическому адресу FFFF0 (шестнадцатеричное значение). Обычно блок памяти, адресуемый этим значением, располагается в ПЗУ и содержит инструкции инициализации компьютера.
Очередь команд микропроцессора непрерывно заполняется, когда системная шина не требуется для других операций. Такое «опережение» значительно увеличивает пропускную способность ЦП, так как к моменту завершения текущей команды следующая команда чаще всего уже находится в ЦП, и нет необходимости дополнительно считывать её из памяти. В случае перехода очередь сбрасывается и заполняется заново, что не даёт экономии времени, но в среднем это происходит нечасто. Длина команд микропроцессора 8086 составляет от одного до шести байт, но организация очереди позволяет считывать команды только словами по чётным адресам. Имеется только одно исключение, связанное с переходом по нечётному адресу. В этом случае ЦП считывает сначала один байт, а затем продолжает считывать слова по чётным адресам.
Система команд микропроцессора 8086 состоит из 98 команд: 19 команд передачи данных, 38 команд их обработки, 24 команд перехода и 17 команд управления процессором. Каждая команда состоит из кода операции (КОП, или опкод), идентифицирующего её, и операндов, несущих требуемую для операции информацию. Команды могут содержать несколько операндов, но чем больше операндов и чем они длиннее, тем больше места занимает команда в памяти и тем больше времени требуется для передачи её в ЦП. КОП и операнды могут иметь произвольную длину и не обязаны быть непрерывными; в то же время общая длина команды должна выражаться целым числом байт. Часто КОП занимает первый байт команды и три средних бита второго байта (это 3-битовое поле часто называют mod). КОП других команд занимает часть первого байта команды, а остальные биты этого байта занимает(ют) операнд(ы). Команды, добавленные к системе команд процессора 8086 в более совершенных процессорах (главным образом, в процессорах 80186 и 80386), содержат КОП в первых двух байтах и операнд(ы) – в остальных. Всего же в системе команд процессора 8086 насчитывается более 3800 команд вместе со всеми их вариантами.
Чтобы минимизировать общее число бит в команде, большинство команд процессора 8086 имеют не более двух операндов, причём минимум одним из операндов в двухоперандной команде является регистр, так как адреса памяти и ввода-вывода требуют сравнительно много бит (8…20), а из-за ограниченного числа регистров для определения регистра требуется всего несколько бит. Ограничение двумя операндами, конечно, уменьшает гибкость многих операций, но в действительности излишняя гибкость и не нужна. Например, команда сложения, в которой необходимо указывать два слагаемых и результат, приводится к двум операндам посредством загрузки суммы на место одного из слагаемых. При этом оно теряется, но обычно это не играет роли. Если же слагаемое потребуется в дальнейшем, его приходится дублировать (запоминать где-то ещё) до выполнения сложения.
Для микропроцессора 8086 фирмой Digital Research была разработана операционная система CP/M-86, совместимая с её предыдущей версией CP/M-80 для 8-битных процессоров, а затем и её многопользовательская однозадачная версия MP/M-86 и мультизадачная версия Concurrent CP/M. Однако эти ОС не применялись в персональных компьютерах и потому не получили большого распространения.
В персональных компьютерах микропроцессор 8086 практически не использовался, т.к. до 1980 г. 16-битные микросхемы поддержки для него были весьма дороги и дефицитны, а в 1979 г. уже был выпущен микропроцессор 8088, системы на базе которого дешевле в производстве. Однако в компьютерах Compaq DeskPro использовался именно этот процессор, что повышало производительность таких ПК по сравнению с IBM PC, построенным на основе микропроцессора 8088.
Технические характеристики