Форматы команд

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

1. Используем команду ввод для считывания с клавиатуры первого числа. Но нам еще надо указать ячейку, в которую должно быть записано первое число. Дальше команду ввод повторим, но укажем другой адрес для записи второго числа:

Код операции

Адрес 1

Ввод

А1

Ввод

А2

2. Теперь введем команду сложения +. Складывать будем содержимое ячейки с адресом А1 и ячейки с адресом А2. Результат, полученный в процессоре, необходимо записать в память, например, в ячейку А3:

Код операции

Адрес 1

Адрес 2

Адрес 3

+

А1

А2

А3

3. Далее выведем результат из ячейки А3 командой вывод, указав, например, адрес принтера:

Код операции

Адрес 1

Адрес 2

Адрес 3

Вывод

А3

Принтер

4. Для завершения программы осталось ввести последнюю команду для остановки машины — стоп:

Код операции

Адрес 1

Адрес 2

Адрес 3

стоп

В итоге программа будет иметь вид:

Код операции

Адрес 1

Адрес 2

Адрес 3

Ввод

А1

Ввод

А2

+

А1

А2

А3

Вывод

А3

Принтер

Стоп

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

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

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

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

,

Одноадресные команды обычно по некоторому правилу модифицируют операнд. Сюда можно отнести команды изменения знака, очистки ячейки, инвертирования, прибавления или вычитания 1 и т.п. Команды имеют следующий формат:

КОП

D

где D является операндом или определяет адрес операнда.

Двухадресные команды обрабатывают два операнда и могут иметь, например, такой формат:

,

КОП

S

D

где S — источник, а D — приемник (порядок следования внутри команды S и D в разных семействах машин различный). Операция производится в следующем порядке:

D <операция> S è D,

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

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

Команды пересылки данных

Команды этой группы пересылают данные из одного места компьютера в другое: между регистрами и памятью. Ниже перечислены основные команды этой группы.

Система команд

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

В процессорах 80686 и выше введены команды условной пересылки CMOVcc. Эти команды производят передачу данных только в случае установленного условия (cc), которое задается различными значениями признаков, установленных в регистре флагов. В этом же процессоре появились команды условной установки бит: SETcc — при выполнении заданного условия значение операнда устанавливается равным 1, в противном случае — 0.

BSWAP производит обмен байтов внутри регистра.

PUSH копирует операнд в вершину стека и сдвигает указатель стека вниз.

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

PUSHA, PUSHAD, РОРА, POPAD выполняют запись в стек и извлечение из него восьми регистров общего назначения. При этом последовательно заполняются или освобождаются восемь 16- или 32-разрядных ячеек стека. При этом PUSHA, РОРА оперируют с 16-разрядными регистрами, а PUSHAD POPAD с 32-разрядными.

IN/OUT производят пересылку данных между аккумулятором ЕАХ (АХ, AL) и адресуемым портом. Адрес порта может задаваться непосредственно операндом или содержимым регистра DX.

Команда MOVSX пересылает данные из меньшего (по числу бит) операнда в больший с расширением знакового разряда.

Команда MOVZX — аналогично, без расширения знакового разряда.

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

В литературе часто упоминается, что команда XCHG обязательно захватывает системную шину на время своего выполнения, но редко объясняется, что это означает и почему это важно.

Рассмотрим двухпроцессорную систему. Допустим, в ячейке A находится число 4, в регистре AX первого процессора — число 5 и в регистре AX второго процессора число 2. Оба процессора почти одновременно начали выполнять команду XCHG AX, A. Ее выполнение, с точки зрения шины, состоит из двух операций: чтения из ячейки А и записи в ячейку. Если шина не монополизируется, последовательность операций может быть такой:

Операция

на шине

После выполнения операции

T1

T2

AX1

AX2

A

x

x

5

2

4

T1 ← A

4

x

5

2

4

T2 ← A

4

4

5

2

4

A ← AX1

4

4

5

2

5

A ← AX2

4

4

5

2

2

AX1 ← T1

4

4

4

2

2

AX2 ← T2

4

4

4

4

2

Здесь T1, T2 — программно недоступные промежуточные регистры процессоров.

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

Система команд

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

В этой главе мы рассмотрим только команды ЦП, исключив из рассмотрения команды сопроцессора, таким образом, исключив всевозможные расширения: MMX, 3DNow!, SSE, SSE2 и т.д.

Классификация команд по операндам

Команды имеют переменный формат, каждая команда имеет свою структуру. Команды могут быть:

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

q     регистр ® регистр;

q     регистр ® память;

q     память ® регистр;

q     непосредственный операнд ® регистр;

q     непосредственный операнд ® память.

Операнд может располагаться:

q     в самой команде (непосредственный операнд), например: MOV AX, 0C24, здесь 0C24 — непосредственный операнд;

q     в одном из регистров процессора или сопроцессора;

q     в сегменте данных;

q     в порту ввода/вывода. Номер порта может быть задан и непосредственным операндом (если он <100), и может находиться в регистре DX; в сегменте стека.

Порты ввода/вывода

Для связи с внешними устройствами процессоры 80×86 используют шину данных и 16 бит шины адреса. Команды обращения к внешним устройствам out и in позволяют записать в порт устройства или прочитать из него 8, 16 или 32 (в зависимости от процессора) бита информации. При обращении ко внешним устройствам процессор вместо сигналов «обращения к памяти» формирует сигналы «обращения к портам».

С учетом используемой разрядности шины адреса нетрудно рассчитать, что всего может поддерживаться 65536 портов ввода/вывода. Однако в устройствах AT зачастую используется несколько модифицированный способ обращения к регистрам. Этот способ подразумевает наличие двух портов, один из которых адресный, а другой — порт данных. Для обращения к некоторым данным требуется сначала занести в порт адреса номер регистра в пределах устройства, а затем прочитать(записать) значение из(в) порта данных.

Прямой способ (один адрес — один регистр) использует, например, порт принтера, последовательные порты; модифицированный (регистр адреса и данных) — звуковую карту AdLib и совместимые с ней; смешанный способ (несколько адресных регистров и несколько регистров данных) — видеокарты VGA и EGA. В них различные блоки (система разверток, блок ЦАП, блок управления адресом, выборки и т. д.) используют собственные пары регистров адреса/данных.

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

Другая особенность некоторых устройств — перекрывающиеся регистры. Например, контроллер IDE по адресу 1F0h имеет 16-битный (в более поздних контроллерах — 32-битный) регистр данных, а по адресу 1F1h — 8-битный регистр ошибок (при чтении) и регистр свойств (при записи). Таким образом, старшая часть регистра данных читается, как бы, из порта по адресу 1F1h, фактически же контроллер различает 16-битный запрос к 1F0h и 8-битный запрос на 1F1h и подставляет различные регистры.

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

В приведенной ниже таблице описан ряд портов, наследуемых современными компьютерами еще со времен IBM PC/XT, AT и PS/2.

AT/PS-2PC/XTОписание
000-01F000-00FПервый DMA-контроллер
020-03F020-021Первый контроллер прерываний
040-05F040-043Таймер
060-063Набор различных устройств
060-06FКонтроллер клавиатуры
070-07FПамять CMOS и маска NMI
080Диагностический регистр
080-08F080-083DMA-контроллер
0A0-0BFВторой контроллер прерываний
0C0-0DFВторой DMA-контроллер
0F0-0FFСопроцессор
170-177Жесткий диск № 2
1F0-1F7Жесткий диск № 1
200-207200-20FИгровой адаптер
238-23FСтык RS-232 № 4 (в PS/2)
278-27F278-27FПараллельный принтер № 2
2C0-2DF2C0-2DFВидеоадаптер
2F8-2FF2F8-2FFСтык RS-232 № 2
320-32FЖесткий диск XT
338-33FСтык RS-232 № 3 (в RS/2)
370-377Контроллер НГМД № 2
378-37F378-37FПараллельный принтер
3B0-3BF3B0-3BFВидеоадаптер и принтер
3C0-3CF3C0-3CFВидеоадаптер
3D0-3DF3D0-3DFВидеоадаптер
3F0-3F73F0-3F7Контроллер НГМД № 1
3F8-3FF3F8-3FFСтык RS-232 № 1

Разумеется, в современных ЭВМ используется гораздо большее количество портов.

Характеристики компьютера

МикроЭВМ IBM PC (и ее варианты) является одноплатной вычислительной машиной, построенной на основе микропроцессорного набора серии Intel 8088/Intel 8086. В состав машины входят: процессор, оперативная память, набор специализированных контроллеров (памяти, шины, прерываний и т.д.). Другие устройства являются возможными, но не обязательными и могут как подключаться через разъемы системной шины, так и входить в состав машины (onboard-устройства или интегрированные устройства).

Рассмотрим технические характеристики машин IBM PC.

  • Система команд. Процессор машин типа IBM PC выполняет команды исходной арифметики или общего назначения (процессора 8086, 8088, 80186, 80286 и т.д.). Команды, позволяющие работать с вещественными числами, выполняются дополнительным математическим сопроцессором при его наличии (сопроцессоры 8087, 80187, 80287 и т.д. или внешний сопроцессор Weitek), а в большинстве случаев — внутренним сопроцессором (80386 (при его наличии), 80486, Pentium).
  • Быстродействие. В настоящее время разные производители выпускают машины с широким диапазоном производительности процессора (приблизительно от 5 МГц (уже не производятся) до 1,5 ГГц).
  • Объем адресуемой памяти. Он составляет приблизительно от 1 МБ до 4 Гб в зависимости от процессора;
  • Внутреннее программное обеспечение. Все рассматриваемые машины не имеют возможности полноценно функционировать без дополнительного внешнего программного обеспечения. В ПЗУ ранних систем хранился только начальный загрузчик, набор подпрограмм ввода/вывода (поэтому содержимое ПЗУ иногда называется BIOS – Basic Input Output Subroutine), простейший тест компонентов системы и программы изменения данных. Все это хранится в CMOS — маленьком энергонезависимом ОЗУ (работающим от батарейки), в котором хранится ряд параметров системы — типы дисководов, количество и тип установленной памяти и т. д. ПЗУ некоторых ранних систем содержал также интерпретатор языка BASIC, который в дальнейшем был исключен. ПЗУ более поздних систем содержит довольно развитую систему настройки параметров чипсета. Внешние устройства могут содержать свои ПЗУ, эта практика особенно развита для: SCSI-контроллеров (BIOS контроллера), видеокарт (VESA-BIOS), сетевых карт (начальный сетевой загрузчик ЭВМ).

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

  • Машинное слово имеет 16 двоичных разрядов и может быть разделено на два восьмиразрядных байта (для 8086, 80186, 80286). Более поздние процессоры имеют слова в 32, 64 разряда.
  • Методы адресации. Ранние процессоры поддерживали 9 методов адресации, более поздние — значительно больше. Однако большинство методов являются частными случаями или расширениями одного из базовых. К базовым можно отнести: непосредственную, регистровую, индексную и относительную адресацию.
  • Регистры процессора. Регистров общего назначения 14, из них SP аппаратно назначен указателем стека, а IP — счетчиком команд (8086). Более поздние процессоры имеют большее число регистров. Большинство новых регистров — системного назначения, они предназначены для управления процессором.
  • Информационный обмен. Обмен информацией между модулями производится по принципу «асинхронного автомата», т.е. отсутствует строгая временная синхронизация, ведется диалоговый обмен служебными сигналами и информацией, и по принципу лидера, т.е. любое внешнее устройство может проявить инициативу в обмене (например, запрос на прерывание).
  • Система прерываний. Обработка внешних и внутренних прерываний производится с применением аппаратно-программного стека, причем в качестве стековой памяти используется ОЗУ.
  • Режимы работы процессора.

Реальный (Real Mode): присутствует во всех процессорах. Отключены схемы защиты, виртуальной памяти, размер сегмента ограничен 64 Кб.

Защищенный (Protect Mode): включается схема защиты памяти, возможно включение механизма страничного преобразования адресов, размер сегмента, в зависимости от процессора, может превышать 64 Кб. Доступен с 80286 и выше.

V86 (Virtual 8086): подвид защищенного режима. Предназначен для выполнения программ реального режима в защищенном режиме процессора. Задействованы все механизмы защиты, виртуальной памяти, страничного преобразования, но сегменты ограничены 64 Кб, сегментные регистры используются по правилам реального режима, программа может не иметь прав на управление машиной. Что-либо изменить может только ОС защищенного режима.

«Нереальный» (большой реальный режим, реальный flat-режим, режим линейной адресации) — не документированный режим: процессор переводится в реальный режим из защищенного с такими текущими настройками дескрипторов, что размер сегментов ≠ 64 Кб, а может быть установлен гораздо большим, на усмотрение программиста. В этом случае все особенности функционирования процессора соответствуют реальному режиму, за исключением размера сегментов.

ICE (In-Circuit Emulator) доступен с 80386, но не освещался в общедоступной документации: в ряде ситуаций срабатывание точек остановки при программной отладке или специальный внешний сигнал могут приводить к переходу в этот режим. Он характерен тем, что вместо обращения к основной системной памяти процессор обращается к памяти внешнего отладочного комплекса и выполняет программу из его памяти, предварительно сохранив все регистры. Программа, исполняющаяся в ICE-режиме, может обращаться к памяти по основной магистрали, используя специальные команды.

Режим зондовой отладки (Probe Mode) доступен с 80586. Этот режим, более мощный по сравнению с ICE, отличается от последнего тем, что в нем процессор прекращает любую активность на магистрали, а с отладочным комплексом работает по интерфейсу JTAG, изолированному от системной магистрали. На команды JTAG не накладывается никаких ограничений, связанных с механизмами защиты памяти или уровнями приоритетов. Probe mode активизируется по команде с интерфейса JTAG, внешнему сигналу по линии R/S# либо, в некоторых случаях, по событию отладки.

SMM (System Management Mode) доступен с некоторых моделей 80386SL и 80486: позволяет выполнять некоторые действия, полностью изолированные от ОС и прикладных программ. Предназначен в основном для «прозрачной» остановки ЭВМ на неопределенное время, возможно, с отключением питания, либо «прозрачной» остановки отдельных узлов ЭВМ, хотя может также использоваться в целях отладки. Вход в режим SMM происходит по специальному внешнему немаскируемому сигналу. При входе процессор сохраняет часть внутренних регистров в специальной области внешней физической памяти, которая активизируется процессором только в режиме SMM, после чего выполняет переход на обработчик, находящийся в этой же памяти. Обработчик исполняется в режиме, близком к реальному, с полностью блокированными внешними прерываниями (в т.ч. NMI) и размером сегмента = 4 Гб, после чего может вернуть управление специальной командой, которая восстановит регистры процессора и выведет его из SMM-режима.

Аварийный останов (ShutDown): процессор переходит в него в случае некоторых ошибок в обработчике SMM-режима, а также при обнаружении трех необслуженных исключений (два исключения — некоторая ошибка + запрос подкачки виртуальной памяти — допустимы). Выход их этого режима возможен лишь по сигналу NMI или аппаратному сбросу.

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

¨  Карта сети (сетевая карта) содержит схему для последовательного обмена информацией.

¨  Карты могут выполнять несколько функций, так карта дисководов и внешнего интерфейса (мультикарта) содержит в себе контроллер дисковода гибких дисков, ATA-контроллер (жесткие диски и CD-ROM), а также несколько портов для обмена информацией с внешней средой.

Звуковая (audio) карта часто содержит порт джойстика и интерфейс MIDI-устройств (музыкальная клавиатура, синтезатор, и т.д.).

Особенности периферийных устройств IBM-PC

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

  • Развитие системной шины привело к появлению возможностей и стандартов на устройства с программно изменяемыми адресами, номерами прерываний и т.д., что позволяет избежать конфликтов устройств при разделении ресурсов системы.
  • Шина PCI позволила устройствам работать в режиме Bus Master — в этом режиме устройство может самостоятельно управлять шиной, например для того чтобы, не прерывая процессор, самостоятельно обмениваться информацией с ОЗУ.
  • Видеосистемы стали использовать увеличивающееся адресное пространство процессора, что позволило программам обращаться к видеопамяти без использования каких-либо программных переключателей.
  • Развиваются возможности для построения многопроцессорных систем.
  • Появились новые возможности ранее существовавших устройств. Видеосистемы стали обладать мощными графическими сопроцессорами, жесткие диски поддерживают самодиагностику, шифрование данных и прочее, выключать и включать[1] питание компьютеров можно программно и т.д.
  • У ПЗУ BIOS все большего числа устройств появляется возможность перепрограммирования (Flash-ROM) средствами устройства.

В настоящей работе мы, в основном, рассмотрим только те возможности, которые предоставляют процессоры Intel и IBM-PC в реальном режиме, под управлением MS-DOS (или совместимой с ней ОС) и будем делать минимальные предположения о конфигурации компьютера.

Если вас интересуют другие возможности, вы можете обратиться как к литературе [1-3] так и к Интернет, на серверы производителей процессоров.

Например, описание на процессоры фирмы Intel (а также другие микросхемы Intel) вы найдете на сервере http://www.intel.ru.

Опыт автора показывает, что подробные описания процессоров и компонентов других фирм найти в Интернете сложнее, т.к. они не столь охотно делятся информацией. Например, согласно комментарию на сервере фирмы VIA, описания по программированию своих чипсетов она предоставляет только официальным партнерам. В  говорится, что фирма IBM подбирала микропроцессор своих первых персональных компьютеров именно по признаку доступности документации.

Закрытость информации не мешает пользоваться стандартными (по сравнению с IBM-AT 10-15-летней давности) возможностями процессоров, чипсетов и периферии, но новые возможности остаются закрытыми, если только производитель не подчиняет их хотя бы одному из существующих стандартов. Примером такого современного стандарта является, например, стандарт VBE для видеосистем или ATA для жестких дисков и CD-ROM. Обратным примером могут служить различные реализации звуковых кодеков AC97.

Если явная информация о работе того или иного устройства так и осталась недоступна вам, при хорошем знании языка C можно воспользоваться открытыми текстами UNIX-подобных операционных систем, например, LINYX или FreeBSD. Эти системы поддерживают очень много устройств и постоянно развиваются.


1. Программно включать, разумеется, можно только косвенно: по внешнему событию или таймеру.

2. Чипсет: набор микросхем, физически расположенных на системной плате ЭВМ, включающий: необходимые для функционирования процессора и ОЗУ компоненты (например, тактовый генератор); ряд обязательных для IBM-PC контроллеров (например: контроллер прерываний или контроллер клавиатуры); интегрированные на системную плату периферийные устройства (например, контроллер IDE-устройств).

Классификация процессоров Intel 80х86

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

q     Семейство (family). К различным семействам относятся версии процессоров, которые имеют существенные отличия в программировании. В маркировке этих процессоров между цифрами 80 и 86 обычно вставляется еще одна цифра, соответствующая номеру семейства. Так, к различным семействам относятся 8086, 80186, 80286 и т.д.

Кратко рассмотрим программные особенности семейств:

0)  К этому семейству относились только процессоры 8086 и 8088. Они еще не имели цифры семейства в названии и представляли собой 16-разрядный процессор с рабочей частотой около 5 МГц и адресным пространством 1 Мб. Именно на этих процессорах строились первые машины IBM-PC (PC-XT).

1)  Процессор 80186 выпускался недолго и практически не отличался от 8086 и 8088. Зачастую его даже не упоминают в литературе.

2)  В процессоре 80286 появился защищенный режим, позволявший одним программам (например, ОС) получить полный контроль над исполнением других программ. Обычный режим, позволявший исполняться старым программ, теперь стал называться реальным. Также была поднята тактовая частота и расширено адресное пространство: 16 Мб физической памяти и 1 Гб виртуальной.

3)  Процессор 80386 был первым 32-разрядным в среди перечисленных. Это значит, что большинство операций могли воспринимать 32-разрядные аргументы. Соответственно, изменились и особенности функционирования в защищенном режиме, а так же лимиты адресного пространства: 4 Гб физической памяти. Появился новый режим: виртуального 8086. Этот режим представляет собой комбинацию защищенного и реального режимов. Он позволяет исполняться программам реального режима в защищенном режиме процессора — эта возможность используется многозадачными ОС для параллельного исполнения как программ реального, так и защищенного режима. В этом процессоре также появилось страничное управление памятью (страничное преобразование адреса): возможность сопоставлять одним и тем же адресам, используемым программой, различные ячейки памяти. Это позволило оптимизировать работу с виртуальной памятью, а так же алгоритмы выделения/освобождения памяти.

4)  Программно процессоры 80486 практически идентичны 80386, однако аппаратно они имеют ряд существенных отличий: на кристалл процессора перенесен кэш памяти и математический сопроцессор. Кроме того, ядро CISC постепенно стало становится RISC (все команды стали выполняться процессором не «сразу», а делиться на отдельные — простые, но очень быстрые).

5)  Процессоры 80586, получившие так же названия Pentium, имели два конвейера команд, что позволило выполнять до двух команд за такт. Однако использование этой возможности требует определенным образом оптимизированного кода программы. Другими особенностями стали средства для работы нескольких процессоров параллельно.

6)  С этого поколения нумерация процессоров стала теряться, они стали получать буквенные названия. Но, тем не менее, понятие «семейство» осталось, его номер можно получить, выполнив команду CPUID. Процессоры шестого и более поздних поколений представляют собой весьма сложные устройства и отличаются, как правило, аппаратными конфигурациями: размерами первичных КЭШей, оптимизацией выполнения команд, расширением системы команд (MMX, MMX2 и другие), аппаратными возможностями отладки программ и т.д.

7)  Авторам неизвестно, какой номер семейства имеет процессор Merced. В отличие от предыдущих поколений, этот процессор является 64-битным.

q     Модель (model). В пределах одного семейства процессоры могут различаться номером модели. Вероятно, понятие модели присутствовало еще в 8086/8088, но тогда это еще не было существенным. В основном, разница между моделями появилась в 80386 — модели еще не были пронумерованы и отличались буквами после номера: так 80386SX и 80386DX отличаются только внешней шиной данных и адреса. В более поздних процессорах разница между моделями становилась более существенной, но, в основном, эти отличия более интересны многозадачным ОС, чем прикладным программам. Так 80686 6-й модели 5-й степпинг (см ниже) имеет встроенный программно доступный контроллер прерываний[2], а 80686 8-й модели 3-й степпинг его не имеет.

q     Степпинг (step). Это еще одно различие, вероятно, отражающее лишь особенности реализации, нежели программные или интерфейсные отличия.

Несмотря на сходство целых трех параметров, процессоры совпадающего семейства, модели и степпинга могут, тем не менее, отличаться. Автору приходилось сталкиваться с процессорами семейства 6, модель 6, степпинг 5 как с контроллером APIC, так и без него.

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


1 Здесь мы не будем касаться более ранних процессоров, таких как 4004, 8008, 8080, 8085, а так же их версии от других фирм (Z80 от фирмы Zilog) – начнем с первого 16-и разрядного процессора.

2 Advanced Peripheral Interrupt Controller (APIC) – усовершенствованный контроллер прерываний. К сожалению, авторам не удалось найти какой-либо информации о его возможностях.

Исторический обзор процессоров клона 80х86

Рассматриваемые в данной работе машины основаны на процессорах различных фирм, однако, свое начало они ведут от процессоров фирмы Intel: 8086 и 8088.

Первый процессор 8086 был применен фирмой IBM в вычислительных системах класса XT, что расшифровывается как exTended Technology (расширенная по сравнению с 8088 технология). Тактовая частота составляла всего 4,77 МГц, оперативная память 256 кБ. Центральные процессоры (CPU 8086 и 8088) работают с 16-битными словами, однако 8088, появившийся позднее 8086, имеет внешнюю шину данных только 8 бит, что было сделано для удобства его стыковки с разработанными ранее и широко распространенными в то время восьмибитными схемами, что, однако, уменьшило его быстродействие.

Полностью совместимы с 8086 и 8088 процессоры фирмы NEC — V20 и V30 соответственно.

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

В 1984 году фирма IBM представила первый IBM AT (Advanced Technology). Процессор 80286 обладал несколько расширенным набором команд по сравнению с 8086, но главное его отличие от предыдущих процессоров и не только фирмы Intel состояло в наличии защищенного режима (protect mode) [4]. Этот режим давал возможность работы многозадачных операционных систем за счет системы взаимной защиты программ друг от друга. Режим решал следующие задачи:

  • защита памяти: операционная система имеет возможность защитить участки памяти от воздействия программ, выполняемых под ее управлением. Защита может быть различного уровня: запрещение чтения и записи, запрещение записи, запрещение перехода на защищенные адреса;
  • защита внешних устройств: возможность генерации прерывания и передача управления системе при попытке программы обратиться к портам ввода/вывода;
  • возможность использования всей шины адреса, которая у процессора 80286 уже составляла 24 линии, что позволяло адресовать до 16 Мб адресного пространства, а у последующих процессоров еще более расширялась;
  • возможность работы с виртуальной памятью — областями дискового пространства, видимого прикладными программами как ОЗУ. Этот режим поддерживается операционной системой и процессором совместно, т.е. быстрые операции (проверка и установка флагов наличия необходимых данных) процессор производит самостоятельно, передавая управление системе лишь на время сложных операций (дочтение памяти или освобождения ее с возможным «сбросом» на диск появившихся изменений). Размер виртуального адресного пространства CPU 80286 — 1 Гб.

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

Все эти нововведения позволяют легко решить вопросы типа: что будет, если одна из задач, выполняющихся параллельно с другими, «зависнет» или попытается испортить данные другой программы или ОС? Ответ очень прост — ОС может запретить программе работу вне выделенной ей памяти и тем самым убережет себя и другие задачи от нештатных ситуаций.

Для совместимости с процессором 8086 80286 запускается в начале в реальном режиме (real mode) и затем, только по команде ОС или другой, «умеющей» использовать protect mode программе переходит в последний режим. Программное переключение обратно в real mode возможно, но только по команде или разрешению инициировавшей protect mode программы.

Кроме того, для увеличения быстродействия в 80286 введена конвейеризация, благодаря чему несколько устройств процессора могут работать одновременно. 80286 имеет четыре конвейерных устройства: командное, операционное, адресное и шинное. Рабочая частота процессора 80286 составляла 6-8 МГц и к моменту «вымирания» этих систем достигала значений 20 МГц.

Следующий шаг — 80386 процессор, появившийся в 1986 году, согласно [9] был представлен фирмой Compaq. Он имеет следующие новшества:

  • расширены РОНы: теперь 16-битные регистры ax, bx, cx, dx, sp, bp, di, si являются лишь младшими частями 32-битных регистров eax, ebx, ecx, edx, esp, ebp, edi, esi. Также добавлены новые регистры сегментов fs и gs;
  • за счет расширения регистров расширено адресное пространство: физическая память — до 1 Гб, виртуальная — до 4 Гб;
  • введен виртуальный режим — возможность эмуляции до 256 процессоров 8086 одновременно;
  • на материнских[1] платах 80386 впервые устанавливается кэш-память — более быстрые, но и более дорогие элементы памяти (объемом меньше, чем общий объем ОЗУ) содержат наиболее часто используемые данные. Кэш-памятью управляет специальный кэш-контроллер.

Введение виртуального режима позволило относительно просто создать многозадачные системы с возможностью квазиодновременного выполнения задач (Windows), а также создать драйвер EMM386.EXE, широко использующий режим виртуального адреса (virtual adress mode). Т.е. 80386 процессор может преобразовывать задаваемые программой абсолютные адреса в некоторые виртуальные, «удобные» ОС (это используется при работе системы в многозадачном режиме).

Как 8086 отличается от 8088, так и 80386DX отличается от 80386SX — у последнего внешняя шина данных имеет ширину 16 бит, в то время как у DX — 32 бита.

Наиболее быстрый процессор серии 80386 имел частоту 40 МГц и был представлен фирмой AMD.

Процессор 80486 не имеет почти никаких потрясающих нововведений против 80386. У него слегка расширен набор команд, введен кэш второго уровня, расположенный внутри процессора — еще меньший объемом, чем кэш первого уровня, еще более быстрый и, как и раньше, неуправляемый программно. Кроме того, сопроцессор теперь находится в одном корпусе с главным процессором (у модели 80486DX).

Процессор 80486 имел три разновидности, отличающиеся тактовой частотой: 80486DX, 80486DX/2, 80486DX/4. Если первый работал на частоте 33 МГц, то второй — 66 МГц и третий — 75 или 100 МГц. Они также отличаются объемом внутренней кэш-памяти: 8, 8 и 16 Кб. Кроме того, DX/4 питается от 3,45 В, а не от 5, как предыдущие модели.

Один из следующих процессоров — 80586 или P5 или Pentium[2]. По сравнению с предыдущими процессорами у него расширена шина данных до 64 бит. От своих предшественников из семейства 80×86 этот процессор отличался еще и внутренней структурой — реализована гарвардская структура с разделением потоков команд и данных с помощью введения отдельных блоков кэш-памяти для хранения команд и данных.

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

Реализована процедура «предсказания переходов», которая позволяет предварительно (до вычисления условия ветвления) определять наиболее вероятное направление ветвления. Благодаря этому удалось значительно сократить количество перезагрузок исполнительного конвейера при выполнении команд условных переходов. В результате обеспечивается эффективное «конвейерное» выполнение поступающих команд и достигается существенное повышение производительности: за один такт можно получить результаты для двух очередных команд (средняя производительность составляла 1 результат за такт). Процессор имеет два блока кэш-памяти — для команд и данных, емкостью по 8 Кбайт каждый, 32-разрядную шину адреса и 64-разрядную внешнюю шину данных, которая позволяет производить быструю (по 8 байт за такт) загрузку и выгрузку этой кэш-памяти.

Одновременно с выпуском Intel 80586 появился процессор К5 фирмы AMD, имеющий внешний интерфейс процессора 80586, но концептуально больше похожий на 80686. Вышел также процессор Nx586 фирмы NexGen по производительности практически не уступающий Intel 80586, но не совместимый по внешнему интерфейсу, поэтому требующий специального набора периферийных схем.

Отсчет шестого поколения процессоров начался с Pentium Pro, выпущенного в 1995 году. Основной особенностью этого процессора является размещение в общем корпусе двух кристаллов: процессора с кэш-памятью 1-го уровня (отдельные КЭШи для команд и данных по 8 Кбайт) и общей кэш-памятью команд-данных 2-го уровня емкостью 256 Кбайт.

Для повышения производительности длина исполнительного конвейера в процессоре Pentium Pro увеличена до 12 ступеней. В процессоре реализована предварительная выборка операндов из памяти и выполнение операций по мере готовности операндов (динамическое исполнение). При этом естественная последовательность команд не соблюдается и следующая команда может выполняться раньше предыдущей, если для нее готовы необходимые операнды. В результате процессор Pentium Pro при обработке 32-разрядных операндов обеспечивает значительно более высокую производительность, чем Pentium (в 1,5-2,0 раза при той же тактовой частоте). Однако при обработке 16-разрядных операндов эффективность загрузки длинного конвейера снижается и существенное повышение производительности не достигается (в ряде случаев наблюдается даже снижение).

Сейчас к этому поколению относятся Pentium II (1997г.), Celeron, Xeon (1998г.) и, наконец, Pentium III (1999г.). От предыдущего поколения эти процессоры главным образом отличает применение технологии speculation: «динамического исполнения» (изменения порядка исполнения инструкций) и архитектура двойной независимой шины. Здесь вторичному КЭШу, введенному в процессор (но не во все модели), выделяется отдельная высокоскоростная магистраль.

Использование двух независимых шин является характерной особенностью процессоров семейства Intel P6. Основная системная шина FSB (Front Side Bus) работает с тактовой частотой, определяемой возможностями процессора и системной платы компьютера.

Отдельная высокоскоростная шина BSB (Back Side Bus) используется для подключения к процессору кэш-памяти 2-го уровня. Шина BSB обеспечивает обмен с частотой, составляющей от половины до полной внутренней частоты процессора, которая для последних моделей семейства P6 достигает                  500-800 МГц. В результате обращение к кэш-памяти производится со значительно меньшим временем выборки, чем при обращении к основной оперативной памяти.

Одним из направлений развития семейства Pentium стала реализация специальной группы команд для одновременной обработки нескольких упакованных операндов. Такие команды обеспечивают значительное ускорение процедур цифровой обработки аудио- и видеосигналов, поэтому они получили название команд мультимедийного расширения ММХ (MultiMedia Extensions). Выпуск процессоров Pentium ММХ, который выполнял 57 дополнительных ММХ-команд, начался в январе 1997 г. Он имел отдельные КЭШи команд и данных емкостью по 16 Кбайт.

В последующих процессорах семейства Р6 проведено объединение процессорного ядра Pentium Pro с технологией мультимедийной обработки данных ММХ. Первым процессором, где было реализовано такое объединение, стал Pentium II, имевшее кодовое название Deshutes, выпуск которого начался мае 1997 г.

Процессор содержал 7,5 млн транзисторов и имел размещенную на кристалле кэш-память команд и данных емкостью по 16 Кбайт каждая. Кэш-память 2-го уровня емкостью до 2 Мбайт реализуется на нескольких кристаллах, которые монтируются вместе с процессором на общей печатной плате. Эта плата имеет краевой разъем для подключения к системной шине и закрывается крышкой. Такая разновидность корпуса называется картриджем с односторонними контактами SECC (Single Edge Contact Cartridge). Благодаря многокристальной реализации кэш-памяти и использования относительно дешевого картриджа стоимость процессоров Pentium II вдвое меньше, чем стоимость Pentium Pro с аналогичными характеристиками.

Процессоры Pentium II сочетают архитектуру Pentium Pro с технологией MMX. По сравнению с Pentium Pro удвоен размер первичного КЭШа (16+16 Кбайт), размер вторичного КЭШа варьируется от 0 до 2 Мбайт.

Первые процессоры Pentium II (до выпуска они имели кодовое название Klamath), появившиеся весной 1997 года, насчитывали около 7,5 млн транзисторов только в процессорном ядре и выполнялись по технологии 0,35 мкм. Они имели тактовые частоты ядра 233, 266 и 300 МГц при частоте системной шины 66,6 МГц. При этом вторичный кэш работал на половинной частоте ядра и кэшировал только первые 512 Мбайт пространства памяти.

Процессор на 333 МГц имеет частоту шины 66,6 МГц, а процессоры на 350 и выше уже имеют частоту системной шины 100 МГц. Для работы на такой частоте эффективна оперативная память на микросхемах SDRAM (синхронная динамическая память), у которой в середине пакетного цикла данные передаются в каждом такте.

Начиная с процессоров 350 МГц объем кэшируемой памяти увеличили до 4 Гбайт.

Для комплектации недорогих персональных компьютеров средней производительности предназначены процессоры Celeron, выпуск которых начат в апреле 1998 г. Первые модели Celeron, выпускаемые по технологии с размерами 0,25 мкм, имели тактовые частоты 266 и 300 МГц и не содержали кэш-памяти          2-го уровня. В последующих моделях с целью повышения производительности была введена кэш-память емкостью 128 КБ, расположенная на кристалле процессора.

Кроме широко известных особенностей вторичного кэша (либо его нет, либо 128 К), процессор Celeron от Pentium II имеет следующие отличия:

  • разрядность шины адреса сокращена с 36 до 32 бит (адресуемая память — 4 Гбайт);
  • контроль паритета шины адреса и шины запроса, ECC-контроль шины данных и контроль неисправимых ошибок шины, а также сигнал инициализации шины отсутствует;
  • процессоры предназначены только для одиночных конфигураций;
  • коэффициенты умножения частоты, по крайней мере, официально, отсутствуют.

Размещаются процессоры Celeron в корпусах со штыревыми выводами, которые включаются в панельки типа Socket 370 на системной плате, или в картридже типа SEPP (Single Edge Processor Package) с уменьшенными размерами и без защитной крышки.

Для применения в высокопроизводительных серверах и рабочих  станциях разработан процессор Pentium II Хеоn, выпуск которого начался в июне 1998 г. Выпускаемый по технологии с минимальными размерами 0,25 мкм этот процессор имеет тактовую частоту до 450 МГц и содержит развитые средства для реализации мультипроцессорных систем, обеспечивая совместную работу до 8 процессоров. Он размещается в картридже типа SECC увеличенного размера — 15,2х12,7х1,9 см, в котором располагается также кэш-память 2-го уровня емкостью до 2 Мбайт. Процессор имеет средства контроля и коррекции ошибок, обеспечивающие исправление 1-битовых (одинарных) и выявление 2-битовых (двойных) ошибок в принимаемой информации. Он содержит термодатчик и схему контроля, прерывающую работу процессора при выходе температуры кристалла из заданного диапазона.

В феврале 1999 г. компания Intel выпустила процессор Pentium III. Теперь идею MMX — одновременное исполнение одной инструкции над группой операндов распространили и на инструкции с плавающей точкой: SSE (Streaming SIMD Extensions) — основной козырь Pentium III (70 команд). Правда, несколько раньше то же самое (но в меньшем объеме) было сделано фирмой AMD — расширение 3DNow! (45 команд) было реализовано уже в процессорах K6-2 для сокета 7.

Для них ввели новый слот-2, который позволяет строить 2-, 4- и даже          8-процессорные системы. Объем вторичного кэша: 512 Кбайт, 1 или 2 Мбайт при кэшировании до 64 Гбайт (все адресное пространство при 36-битной адресации).

По своим остальным характеристикам процессоры Pentium III практически аналогичны Pentium II и предназначены для использования вместо них в новых моделях высокопроизводительных персональных компьютеров. В конце декабря 1999 г. были представлены модели процессоров Pentium III с тактовыми частотами 750 и 800 МГц. Начиная с 2000 года практически все процессоры выпускаются по 0,18 мкм технологии.

Процессор Pentium 4 (ноябрь 2000г.) имеет новую микроархитектуру, которую Intel называет NetBurst, содержит 42 млн. транзисторов. При проектировании Pentium 4 ставилась задача достижения экстремально высоких тактовых частот и, естественно, более высокой производительности, чем у Pentium III. Для этого применен очень длинный конвейер и принят целый ряд мер для снижения издержек, сопутствующих этому решению. Усовершенствована кэш-память, введено новое расширение SSE2 (144 инструкции). Одним из наиболее значительных шагов вперед стал переход на новую быстродействующую системную шину — пропускная способность шины увеличилась с 1 Гб/с до 3,2 Гб/с. Начальные тактовые частоты Pentium 4 — 1,3; 1,4; 1,5 ГГц.

Среди элементов архитектуры NetBurst фирма Intel выделяет 4 основных: гиперконвейеризованную технологию (Hyper Pipelined Technology), быстрый исполнительный механизм (Rapid Execution Engine), трассирующую кэш-память (Execution Trace Cache) и процессорную шину, работающую на частоте 400 МГц.

Hyper Pipelined Technology — это ключевой момент, определяющий почти все основные особенности архитектуры Pentium 4. Процессор имеет очень длинный, 20-стадийный конвейер, так что действительно является гиперконвейеризованным, особенно с точки зрения трудности нейтрализации негативных эффектов. Для сравнения: процессоры Р5 (Pentium, Pentium ММХ) имеют                         5-стадийный конвейер, процессоры Р6 (Pentium Pro, Pentium II, Pentium III, Celeron) — 10-стадийный, процессоры К7 (Athlon и Duron) — 12-стадийный.

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

Вся подсистема кэш-памяти процессора Pentium 4 очень существенно переработана по сравнению с Pentium III. В полтора раза снижены издержки при обращении к кэш-памяти 1-го уровня для данных, для чего пришлось уменьшить ее объем до 8 Кб. Кэш-памяти 1-го уровня для инструкций в привычном понимании нет вообще. Вместо нее — специальная кэш-память Execution Trace Cache для уже декодированных инструкций (объем около 92 Кб), способная хранить до 12 тыс. микроопераций, причем имеются возможности для быстрого удаления ненужных данных. Резко увеличена пропускная способность кэш-памяти 2-го уровня.

Основным элементом, устраняющим свойственные архитектуре Р6 узкие места и способствующие достижению высокой производительности, является новая системная шина. Эффективная частота ее функционирования увеличена до 400 МГц. Тактовая частота оставлена равной 100 МГц, но за такт передается 4 блока информации.


1. Материнская (системная) плата – центральная плата ЭВМ, на которой расположен процессор, необходимые контроллеры и разьемы плат расширения и ОЗУ.

2. В различной литературе название расшифровывается и как «пятый», по номеру семейства, и по фамилии – Пентковский –  российского инженера, который работал в фирме Intel во главе команды разработчиков процессора 80586.

Процесс компиляции

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

Процесс компиляции

Для дальнейшей подготовки исходного модуля к выполнению на компьютере его необходимо перевести на язык, понятный машине, т.е. в итоге в двоичный код. Программа перевода с одного языка на другой называется транслятор. Транслятор не обязательно переводит что-то в машинный код. Он может, например, перевести с языка Pascal на язык Assembler. Будем считать, что на            рис. 4.1 транслятор переводит исходную программу в двоичный код, но он еще не может быть запущен на исполнение! Результат работы транслятора дает два файла:

  • листинг (расширение *.LST) — подробная распечатка программы с указанием встреченных ошибок, распределением адресов переменных и прочими полезными для опытного программиста сведениями;
  • объектный модуль (расширение *.OBJ) — программа в двоичном коде со ссылками на библиотеки стандартных программ, необходимых для работы транслируемой прикладной программы.

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

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

Загрузочный модуль — это программа, почти полностью готовая к исполнению и имеющая, например, расширение *.exe или *.sav в зависимости от системы программирования. Как правило, это программа в машинных кодах, но в относительных адресах, т.е. первая команда имеет нулевой адрес. Привязка с физическим адресам и загрузка программы на исполнение в оперативную память производится обычно специальной программой — загрузчиком.

Рассмотренный процесс перевода программы в загрузочный модуль называется процессом компиляции. Однако существуют и имеют определенные преимущества, впрочем как и недостатки, еще два метода — интерпретации и ассемблирования.

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

О программном обеспечении

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

системное обеспечение — операционная система; специальное ПО — набор программ из заданного класса, необходимых для решения задач пользователя;

прикладное обеспечение — набор задач пользователя.

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

Рассмотрим кратко особенности ПО самой машины:

  • в ПЗУ микроЭВМ заложена программа, обеспечивающая возможность занесения данных в CMOS, обеспечивающая загрузку ОС и содержащая некоторый набор тестов ЭВМ и стандартных ВУ;
  • широко используются различные дисковые операционные системы: MS-DOS, различные клоны UNIX (XENIX (устарела), LINYX, FreeBSD, BSDi и т.д.), Windows, DR-DOS, PC-DOS, OS/2, FreeDOS и т.п. Они построены по модульному принципу, имеют монитор и набор системных программ, драйверов и утилит; различаются своими возможностями, организацией работы, требуемой памятью в ОЗУ и на дисках;
  • в состав ОС входят трансляторы и интерпретаторы различных языков программирования. В настоящее время самыми распространенными языками являются Бейсик (BASIC), Паскаль (Pascal), Си (C) и ряд VISUAL-версий.

Программирование может производиться в машинных кодах, на машинно-ориентированных или алгоритмических языках низкого или высокого уровня.

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

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

Получили распространение два направления языков данного уровня, практически близких к единому стандарту: Turbo ASseMbler (фирмы Borland International), Macro ASseMbler (фирмы Microsoft) and NASM.

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

К языкам высокого уровня относятся Фортран, PL/M, Паскаль, Бейсик, Forth, C, Ада. Это процедурно-ориентированные языки, каждый из которых предназначен для решения определенного класса задач.

Так, язык Фортран используется в основном при решении научно-технических задач, отличается строгостью конструкций и имеет самый большой набор стандартных программ по различным аспектам науки (физика, математика, статистика, биология, геология и т.п.).

Язык программирования PL/1. Обладает широкими возможностями и применяется в основном для решения экономических задач обработки деловой информации; имеет в своем распоряжении широкий набор типов данных, а также возможности работы со сложными структурами.

Язык Паскаль появился сравнительно недавно. В нем сконцентрированы лучшие черты языков-предшественников. Текст на языке Паскаль выражает математическую сущность алгоритма в очевидной и легко воспринимаемой форме. Кроме того, он полностью удовлетворяет требованиям структурного программирования. Классическая версия неудобна для использования, однако более поздний вариант — Turbo Pascal — гораздо более гибкий и весьма удобный язык. Особое удобство в работе с ним дает мощный встроенный редактор программных текстов и интегрированный отладчик. Помимо того, может использоваться внешний отладчик, позволяющий в процессе уменьшить шаг отладки с одного шага Паскаля до одной команды процессора. Также есть возможность использовать «чистый» компилятор — без экранного редактора и отладчика, что увеличивает скорость компиляции и экономит память.

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

GWBASIC — единственный транслятор BASIC`а, ведущий диалог с пользователем посредством командной строки. Быстродействие программ, исполняющихся под GWBASIC`ом, приблизительно в 1,3 раза превышает скорость программ, транслированных TurboBasic`ом. Формат команд и редактор командной строки сильно напоминают MSX Basic (Ямаха). Размер GWBASIC около 60-70 Кб.

TurboBasic — компилятор BASIC`a. Имеет встроенный экранный редактор, по скорости уступает интерпретатору GWBASIC, позволяет создавать модули. Объем: 250 Кб, из них 50 Кб — HELP. Пустой цикл на 40000 итераций исполняет за 2 с при 16 МГц тактовой частоты процессора (AT-80286). Имеет приличный набор ошибок, периодически ведущих к «зависанию» программ.

PowerBasic — компилятор BASIC`а. Вероятно, является продолжением TurboBasic. Внешне сильно напоминает TurboPascal 5.0. Имеет более сильный (по сравнению с TurboBasic`ом) отладчик. Создает несколько более компактный исполняемый код. Пустой цикл в 40 000 итераций исполняет за 2 c при 16 МГц  (AT-80286) тактовой частоты процессора. Имеет контекстный HELP по ключевым словам BASIC. Размер — 300 Кб, из них HELP — 100 Кб.

QuickBasic. Интерпретатор. Пустой цикл в 40000 итераций исполняет за 11 c при 16 МГц тактовой частоты процессора. При редактировании текста программы каждой процедуре и функции отводится собственное окно редактирования, и она может иметь локальные параметры. Имеется контекстный HELP, включающий описание операторов. Размер — 400 Кб, из них HELP — 150. Существует так же версия компилятора этого диалекта. Синтаксис ряда операторов уже очень отличается от предыдущих трансляторов, что отражено в HELP`е. Есть возможность вести диалог с командной строки (за исключение ввода программы).

Все BASIC`ки, имеющие встроенный редактор, не требуют указания номеров строк и имеют три типа циклов — ДО (until), ПОКА (while) и ДЛЯ (for), а так же много других возможностей