8086 [3] (также называемый iAPX 86 ) [ 4] — это 16-разрядный микропроцессорный чип, разработанный Intel в период с начала 1976 года по 8 июня 1978 года, когда он был выпущен. Intel 8088 , выпущенный 1 июля 1979 года, [5] представляет собой слегка модифицированный чип с внешней 8-разрядной шиной данных (что позволяет использовать более дешевые и менее поддерживающие ИС ), [примечание 1] и примечателен тем, что именно он использовался в оригинальной конструкции IBM PC .
8086 дал начало архитектуре x86 , которая в конечном итоге стала самой успешной линейкой процессоров Intel. 5 июня 2018 года Intel выпустила ограниченный тираж процессора в честь 40-летия Intel 8086, названный Intel Core i7-8086K . [5] [ мертвая ссылка ]
В 1972 году Intel выпустила 8008 , первый 8-битный микропроцессор Intel. [примечание 2] Он реализовал набор инструкций, разработанный Datapoint Corporation с учетом программируемых терминалов CRT , который также оказался довольно универсальным. Для создания функционального компьютера устройству требовалось несколько дополнительных микросхем , отчасти из-за того, что он был упакован в небольшой 18-контактный «корпус памяти», что исключало использование отдельной адресной шины ( в то время Intel была в основном производителем DRAM ).
Два года спустя Intel выпустила 8080 , [примечание 3] используя новые 40-контактные DIL-корпуса, изначально разработанные для ИС калькуляторов, чтобы обеспечить отдельную адресную шину. Он имеет расширенный набор инструкций, совместимый по исходному коду (но не двоично-совместимый ) с 8008 [6] , а также включает некоторые 16-битные инструкции для упрощения программирования. Устройство 8080 в конечном итоге было заменено на 8085 на основе истощения нагрузки (1977), которому хватало одного источника питания +5 В вместо трех различных рабочих напряжений более ранних чипов. [примечание 4] Другие известные 8-битные микропроцессоры, появившиеся в эти годы, — Motorola 6800 (1974), General Instrument PIC16X (1975), MOS Technology 6502 (1975), Zilog Z80 (1976) и Motorola 6809 (1978).
Проект 8086 стартовал в мае 1976 года и изначально задумывался как временная замена амбициозному и запоздалому проекту iAPX 432. Это была попытка привлечь внимание к менее запоздалым 16- и 32-разрядным процессорам других производителей — Motorola , Zilog и National Semiconductor .
В то время как 8086 был 16-битным микропроцессором, он использовал ту же микроархитектуру , что и 8-битные микропроцессоры Intel (8008, 8080 и 8085). Это позволило программам на языке ассемблера, написанным на 8-битном языке, легко мигрировать . [7] Были добавлены новые инструкции и функции, такие как знаковые целые числа, адресация base+offset и самоповторяющиеся операции. Были добавлены инструкции, помогающие компиляции исходного кода вложенных функций в семействе языков ALGOL , включая Pascal и PL/M . По словам главного архитектора Стивена П. Морзе , это было результатом более программно-ориентированного подхода. Другие усовершенствования включали инструкции микрокода для инструкций языка ассемблера умножения и деления. Разработчики также ожидали появления сопроцессоров , таких как 8087 и 8089 , поэтому структура шины была разработана так, чтобы быть гибкой.
Первая версия набора инструкций и архитектуры высокого уровня была готова примерно через три месяца, [примечание 5] и поскольку почти не использовались инструменты САПР, над чипом одновременно работали четыре инженера и 12 специалистов по компоновке. [примечание 6] Процессору 8086 потребовалось чуть больше двух лет от идеи до рабочего продукта, что считалось довольно быстрым для сложной конструкции в 1970-х годах.
8086 был секвенирован [примечание 7] с использованием смеси случайной логики [8] и микрокода и был реализован с использованием схемы nMOS с истощением и нагрузкой примерно с 20 000 активных транзисторов (29 000, включая все сайты ROM и PLA ). Вскоре он был переведен на новый усовершенствованный производственный процесс nMOS, называемый HMOS (для High performance MOS), который Intel изначально разработала для производства быстрых статических продуктов RAM. [примечание 8] За этим последовали версии HMOS-II, HMOS-III и, в конечном итоге, полностью статическая версия CMOS для устройств с батарейным питанием, изготовленная с использованием процессов Intel CHMOS . [примечание 9] Первоначальный чип имел размеры 33 мм², а минимальный размер элемента составлял 3,2 мкм. Инструкции MUL и DIV были очень медленными из-за микрокодирования, поэтому программисты x86 обычно просто использовали инструкции сдвига битов для умножения и деления. [ требуется цитата ]
8086 был уменьшен до 2 мкм в 1981 году; эта версия также исправила ошибку стекового регистра в оригинальных 3,5 мкм чипах. Более поздние 1,5 мкм и КМОП-варианты были переданы на аутсорсинг другим производителям и не разрабатывались внутри компании.
Архитектура была определена Стивеном П. Морзе с некоторой помощью Брюса Равенеля (архитектора 8087) в доработке окончательных версий. Разработчики логики Джим Маккевитт и Джон Бейлисс были ведущими инженерами команды разработчиков аппаратного уровня [примечание 10] , а Билл Полман был менеджером проекта. Наследие 8086 сохраняется в базовом наборе инструкций современных персональных компьютеров и серверов; 8086 также одолжил свои последние две цифры более поздним расширенным версиям дизайна, таким как Intel 286 и Intel 386 , все из которых в конечном итоге стали известны как семейство x86 . (Другая ссылка заключается в том, что идентификатор поставщика PCI для устройств Intel — 8086 h .)
Все внутренние регистры, а также внутренние и внешние шины данных имеют ширину 16 бит, что прочно установило идентичность «16-битного микропроцессора» 8086. 20-битная внешняя адресная шина обеспечивает физическое адресное пространство размером 1 МБ (2 20 = 1 048 576 x 1 байт ). Это адресное пространство адресуется посредством «сегментации» внутренней памяти. Шина данных мультиплексирована с адресной шиной, чтобы вместить все линии управления в стандартный 40-контактный двухрядный корпус . Он обеспечивает 16-битную адресную шину ввода-вывода, поддерживая 64 КБ отдельного пространства ввода-вывода. Максимальное линейное адресное пространство ограничено 64 КБ просто потому, что внутренние регистры адреса/индекса имеют ширину всего 16 бит. Программирование за пределами границ памяти 64 КБ включает в себя настройку сегментных регистров (см. ниже); эта трудность существовала до тех пор, пока архитектура 80386 не представила более широкие (32-битные) регистры (аппаратное обеспечение управления памятью в 80286 не помогало в этом отношении, поскольку его регистры по-прежнему имели ширину всего 16 бит).
Некоторые из управляющих выводов, которые передают основные сигналы для всех внешних операций, имеют более одной функции в зависимости от того, работает ли устройство в минимальном или максимальном режиме. Первый режим предназначен для небольших однопроцессорных систем, тогда как последний — для средних или больших систем, использующих более одного процессора (разновидность многопроцессорного режима). Максимальный режим требуется при использовании сопроцессора 8087 или 8089. Напряжение на выводе 33 (MN/ MX ) определяет режим. Изменение состояния вывода 33 изменяет функцию некоторых других выводов, большинство из которых связаны с тем, как ЦП обрабатывает (локальную) шину. [примечание 11] Режим обычно жестко запрограммирован в схеме и, следовательно, не может быть изменен программным обеспечением. Работа этих режимов описана в терминах временных диаграмм в технических описаниях и руководствах Intel. В минимальном режиме все управляющие сигналы генерируются самим 8086.
8086 имеет восемь более или менее общих 16-битных регистров (включая указатель стека , но исключая указатель инструкций, регистр флага и сегментные регистры). К четырем из них, AX, BX, CX, DX, также можно получить доступ как к 8-битным парам регистров (см. рисунок), тогда как остальные четыре, SI, DI, BP, SP, являются только 16-битными.
Благодаря компактному кодированию, вдохновленному 8-битными процессорами, большинство инструкций являются одноадресными или двухадресными операциями, что означает, что результат сохраняется в одном из операндов. Максимум один из операндов может находиться в памяти, но этот операнд памяти также может быть назначением , в то время как другой операнд, источник , может быть либо регистром , либо непосредственным . Одна ячейка памяти также часто может использоваться как источник и назначение , что, среди прочих факторов, дополнительно способствует плотности кода , сопоставимой с (а часто и лучшей) большинством восьмибитных машин того времени.
Степень общности большинства регистров намного выше, чем в 8080 или 8085. Однако регистры 8086 были более специализированными, чем в большинстве современных мини-компьютеров , и также неявно использовались некоторыми инструкциями. Хотя это совершенно разумно для программиста на ассемблере, это делает распределение регистров для компиляторов более сложным по сравнению с более ортогональными 16- и 32-битными процессорами того времени, такими как PDP-11 , VAX , 68000 , 32016 и т. д. С другой стороны, будучи более регулярными, чем довольно минималистичные, но вездесущие 8-битные микропроцессоры, такие как 6502 , 6800 , 6809 , 8085 , MCS-48 , 8051 и другие современные машины на основе аккумуляторов, значительно проще построить эффективный генератор кода для архитектуры 8086.
Другим фактором этого является то, что 8086 также представил некоторые новые инструкции (отсутствующие в 8080 и 8085) для лучшей поддержки стековых языков программирования высокого уровня, таких как Pascal и PL/M ; некоторые из наиболее полезных инструкций — это , и ret size , напрямую поддерживающие « соглашение о вызовах Pascal ». (Несколько других, таких как и , были добавлены в последующие процессоры 80186, 80286 и 80386.)push mem-op
push immed
enter
Стек 64 КБ (один сегмент), растущий в сторону нижних адресов, поддерживается в оборудовании ; 16-битные слова помещаются в стек, а на вершину стека указывает SS:SP. Существует 256 прерываний , которые могут быть вызваны как аппаратным, так и программным обеспечением. Прерывания могут каскадироваться, используя стек для хранения адресов возврата .
8086 имеет 64 Кбайт 8-битного (или 32 Кбайт 16-битного слова) пространства портов ввода-вывода .
8086 имеет 16-битный регистр флагов . Девять из этих флагов кодов условий активны и указывают на текущее состояние процессора: флаг переноса (CF), флаг четности (PF), флаг вспомогательного переноса (AF), флаг нуля (ZF), флаг знака (SF), флаг ловушки (TF), флаг прерывания (IF), флаг направления (DF) и флаг переполнения (OF). Также называемый словом состояния, регистр флагов имеет следующую структуру: [9]
Также имеются четыре 16-битных сегментных регистра (см. рисунок), которые позволяют процессору 8086 получать доступ к одному мегабайту памяти необычным способом. Вместо того, чтобы объединять сегментный регистр с адресным регистром, как в большинстве процессоров, адресное пространство которых превышает размер их регистра, 8086 сдвигает 16-битный сегмент всего на четыре бита влево, прежде чем добавлять его к 16-битному смещению (16×сегмент + смещение), тем самым создавая 20-битный внешний (или эффективный или физический) адрес из 32-битной пары сегмент:смещение. В результате на каждый внешний адрес можно ссылаться с помощью 2 12 = 4096 различных пар сегмент:смещение.
Хотя многие программисты считают эту схему сложной и громоздкой, у нее есть и преимущества: небольшая программа (менее 64 КБ) может быть загружена, начиная с фиксированного смещения (например, 0000) в ее собственном сегменте, что позволяет избежать необходимости перемещения , при этом на выравнивание будет потрачено не более 15 байтов.
Компиляторы для семейства 8086 обычно поддерживают два типа указателей : ближние и дальние . Ближние указатели — это 16-битные смещения, неявно связанные с кодом программы или сегментом данных, и поэтому могут использоваться только в частях программы, достаточно малых, чтобы поместиться в один сегмент. Дальние указатели — это 32-битные пары сегмент:смещение, разрешающиеся в 20-битные внешние адреса. Некоторые компиляторы также поддерживают огромные указатели, которые похожи на дальние указатели, за исключением того, что арифметика указателя на огромном указателе обрабатывает его как линейный 20-битный указатель, в то время как арифметика указателя на дальнем указателе обходит его внутри его 16-битного смещения, не затрагивая сегментную часть адреса.
Чтобы избежать необходимости указывать near и far для многочисленных указателей, структур данных и функций, компиляторы также поддерживают «модели памяти», которые определяют размеры указателей по умолчанию. Модели tiny (макс. 64 КБ), small (макс. 128 КБ), compact (данные > 64 КБ), medium (код > 64 КБ), large (код,данные > 64 КБ) и huge (отдельные массивы > 64 КБ) охватывают практические комбинации указателей near, far и huge для кода и данных. Модель tiny означает, что код и данные совместно используются в одном сегменте, как и в большинстве 8-битных процессоров, и могут использоваться, например, для создания файлов .com . Предварительно скомпилированные библиотеки часто поставляются в нескольких версиях, скомпилированных для разных моделей памяти.
Согласно Морзе и др. [10], проектировщики на самом деле рассматривали возможность использования 8-битного сдвига (вместо 4-битного) для создания физического адресного пространства размером 16 МБ. Однако, поскольку это заставило бы сегменты начинаться с границ 256 байт, а 1 МБ считался очень большим для микропроцессора около 1976 года, эта идея была отклонена. Кроме того, на дешевом 40-контактном корпусе не было достаточно контактов для дополнительных четырех контактов адресной шины.
В принципе, адресное пространство серии x86 можно было бы расширить в более поздних процессорах за счет увеличения значения сдвига, если бы приложения получали свои сегменты от операционной системы и не делали предположений об эквивалентности различных пар сегмент:смещение. [примечание 12] На практике использование «огромных» указателей и подобных механизмов было широко распространено, а плоская 32-битная адресация, ставшая возможной благодаря 32-битным регистрам смещения в 80386, в конечном итоге расширила ограниченный диапазон адресации более общим образом.
Поток инструкций извлекается из памяти в виде слов и адресуется процессором внутренне на уровне байтов по мере необходимости. Механизм очередей потока инструкций позволяет ставить в очередь до 6 байтов потока инструкций, ожидая декодирования и выполнения. Очередь действует как буфер FIFO (First-In-First-Out), из которого исполнительный блок (EU) извлекает байты инструкций по мере необходимости. Всякий раз, когда в очереди есть место хотя бы для двух байтов, BIU попытается выполнить цикл памяти выборки слов. Если очередь пуста (например, после инструкции ветвления), первый байт в очереди немедленно становится доступным для EU. [11]
Небольшие программы могли игнорировать сегментацию и просто использовать простую 16-битную адресацию. Это позволяет довольно легко переносить 8-битное программное обеспечение на 8086. Авторы большинства реализаций DOS воспользовались этим, предоставив интерфейс прикладного программирования, очень похожий на CP/M , а также включив простой формат исполняемого файла .com , идентичный CP/M. Это было важно, когда 8086 и MS-DOS были новыми, поскольку позволяло быстро сделать доступными многие существующие приложения CP/M (и другие), что значительно облегчало принятие новой платформы.
Следующий исходный код ассемблера 8086 предназначен для подпрограммы с именем , которая копирует строку символов ASCIIZ_strtolower
с нулевым окончанием из одного места в другое, преобразуя все алфавитные символы в нижний регистр. Строка копируется по одному байту (8-битный символ) за раз.
В примере кода регистр BP (базовый указатель) используется для установки кадра вызова , области в стеке, которая содержит все параметры и локальные переменные для выполнения подпрограммы. Этот тип соглашения о вызовах поддерживает реентерабельный и рекурсивный код и используется языками типа Algol с конца 1950-х годов. Предполагается плоская модель памяти, в частности, что сегменты DS и ES адресуют одну и ту же область памяти.
Хотя это частично затенено другими решениями по проектированию в этом конкретном чипе, мультиплексированные шины адреса и данных немного ограничивают производительность; передача 16-битных или 8-битных величин выполняется в цикле доступа к памяти с четырьмя тактами, что быстрее на 16-битных, хотя и медленнее на 8-битных величинах по сравнению со многими современными 8-битными процессорами. Поскольку инструкции варьируются от одного до шести байт, выборка и выполнение выполняются параллельно и разделяются на отдельные блоки (как это остается в современных процессорах x86): блок интерфейса шины подает поток инструкций в блок выполнения через 6-байтовую очередь предварительной выборки (форма слабосвязанной конвейеризации ), ускоряя операции с регистрами и немедленными данными , в то время как операции с памятью стали медленнее (четыре года спустя эта проблема производительности была устранена в 80186 и 80286 ). Однако полная (а не частичная) 16-битная архитектура с ALU полной ширины означала, что 16-битные арифметические инструкции теперь могли выполняться за один цикл ALU (вместо двух, через внутренний перенос, как в 8080 и 8085), что значительно ускоряло такие инструкции. В сочетании с ортогонализацией операций по сравнению с типами операндов и режимами адресации , а также другими усовершенствованиями, это сделало прирост производительности по сравнению с 8080 или 8085 довольно значительным, несмотря на случаи, когда старые чипы могли быть быстрее (см. ниже).
Как видно из этих таблиц, операции с регистрами и немедленными были быстрыми (от 2 до 4 циклов), в то время как инструкции операндов памяти и переходы были довольно медленными; переходы занимали больше циклов, чем на простых 8080 и 8085 , а 8088 (используемый в IBM PC) дополнительно был затруднен своей более узкой шиной. Причины, по которым большинство инструкций, связанных с памятью, были тремя:
Однако производительность доступа к памяти была радикально улучшена с появлением следующего поколения процессоров Intel семейства 8086. 80186 и 80286 имели выделенное аппаратное обеспечение для вычисления адресов, что экономило много циклов, а 80286 также имел отдельные (немультиплексированные) шины адреса и данных.
8086/8088 можно было подключить к математическому сопроцессору для добавления аппаратной/микрокодовой производительности с плавающей точкой . Intel 8087 был стандартным математическим сопроцессором для 8086 и 8088, работающим с 80-битными числами. Такие производители, как Cyrix (совместимый с 8087) и Weitek ( несовместимый с 8087) в конечном итоге придумали высокопроизводительные сопроцессоры с плавающей точкой, которые конкурировали с 8087.
Первоначально тактовая частота была ограничена 5 МГц, [примечание 13] , но последние версии в HMOS были указаны для 10 МГц. Версии HMOS-III и CMOS производились в течение длительного времени (по крайней мере, некоторое время в 1990-х годах) для встраиваемых систем , хотя его преемник, 80186 / 80188 (который включает в себя некоторые периферийные устройства на кристалле), был более популярен для встраиваемого использования.
80C86, КМОП-версия 8086, использовалась в GRiDPad , Toshiba T1200 , HP 110 и, наконец, в Lunar Prospector 1998–1999 годов .
Что касается корпуса, Intel 8086 был доступен как в керамическом, так и в пластиковом DIP-корпусе.
Совместимые — и, во многих случаях, улучшенные — версии были произведены Fujitsu , [23] Harris / Intersil , OKI , Siemens , Texas Instruments , NEC , Mitsubishi , и AMD . Например, пара NEC V20 и NEC V30 была аппаратно совместима с 8088 и 8086 , хотя NEC сделала оригинальные клоны Intel μPD8088D и μPD8086D соответственно, но включила набор инструкций 80186 вместе с некоторыми (но не всеми) улучшениями скорости 80186, обеспечивая возможность вставки для обновления как набора инструкций, так и скорости обработки без необходимости производителям изменять свои конструкции. Такие относительно простые и маломощные 8086-совместимые процессоры в КМОП все еще используются во встраиваемых системах.
Электронная промышленность Советского Союза смогла скопировать 8086 с помощью промышленного шпионажа и обратного проектирования [ требуется ссылка ] . Полученный чип, К1810ВМ86 , был двоичным и совместимым по выводам с 8086.
i8086 и i8088 были ядрами советских ПК-совместимых настольных компьютеров EC1831 и EC1832. (EC1831 — это идентификация EC IZOT 1036C, а EC1832 — это идентификация EC IZOT 1037C, разработанных и произведенных в Болгарии. EC означает Единая Система.) Однако компьютер EC1831 (IZOT 1036C) имел значительные аппаратные отличия от прототипа IBM PC. EC1831 был первым ПК-совместимым компьютером с динамическим размером шины (патент США № 4,831,514). Позднее некоторые принципы EC1831 были приняты в PS/2 (патент США № 5,548,786) и некоторых других машинах (заявка на патент Великобритании, публикация № GB-A-2211325, опубликована 28 июня 1989 г.).
[…] 8086 программно совместим с 8080 на уровне языка ассемблера. […]
Тайминги и кодировки в этом руководстве используются с разрешения Intel и взяты из следующих публикаций: Intel Corporation. iAPX 86, 88, 186 и 188 User's Manual, Programmer's Reference, Santa Clara, Calif. 1986.(Аналогично для iAPX 286, 80386, 80387.)
В оригинальном IBM PC (1981) и PC/XT (1983) FDC физически располагался на отдельной карте адаптера дискеты. Сам FDC был NEC μPD765A или совместимой частью, такой как Intel 8272A.
IBM Displaywriter заметно дороже других промышленных микроконтроллеров, использующих 8086.