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

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

В этой главе мы рассмотрим только команды ЦП, исключив из рассмотрения команды сопроцессора, таким образом, исключив всевозможные расширения: 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-2 PC/XT Описание
000-01F 000-00F Первый DMA-контроллер
020-03F 020-021 Первый контроллер прерываний
040-05F 040-043 Таймер
060-063 Набор различных устройств
060-06F Контроллер клавиатуры
070-07F Память CMOS и маска NMI
080 Диагностический регистр
080-08F 080-083 DMA-контроллер
0A0-0BF Второй контроллер прерываний
0C0-0DF Второй DMA-контроллер
0F0-0FF Сопроцессор
170-177 Жесткий диск № 2
1F0-1F7 Жесткий диск № 1
200-207 200-20F Игровой адаптер
238-23F Стык RS-232 № 4 (в PS/2)
278-27F 278-27F Параллельный принтер № 2
2C0-2DF 2C0-2DF Видеоадаптер
2F8-2FF 2F8-2FF Стык RS-232 № 2
320-32F Жесткий диск XT
338-33F Стык RS-232 № 3 (в RS/2)
370-377 Контроллер НГМД № 2
378-37F 378-37F Параллельный принтер
3B0-3BF 3B0-3BF Видеоадаптер и принтер
3C0-3CF 3C0-3CF Видеоадаптер
3D0-3DF 3D0-3DF Видеоадаптер
3F0-3F7 3F0-3F7 Контроллер НГМД № 1
3F8-3FF 3F8-3FF Стык RS-232 № 1

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