Скачиваний:
23
Добавлен:
11.05.2015
Размер:
998.91 Кб
Скачать

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

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

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

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

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

  • безадресные операнд задан неявно на микропрограммном уровне;

  • одноадресные — операнд рассматривается как источник или получатель;

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

  • регистр  регистр;

  • регистр  память;

  • память  регистр;

  • непосредственный операнд  регистр;

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

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

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

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

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

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

  • в сегменте стека.

9.2. Классификация команд по действию

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

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

Команда 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 обоих процессоров  одно и то же значение, в то время как подобное не могло бы произойти, если бы любой из процессоров выполнил свою команду за один раз, не давая другому возможность модифицировать в это время память. Монопольный захват шины  исключение доступа к памяти параллельных процессоров. В этом случае последовательность действий была бы такой:

Операция

на шине

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

T1

T2

AX1

AX2

A

x

x

5

2

4

T1 ← A

4

x

5

2

4

A ← AX1

4

x

5

2

5

AX1 ← T1

4

x

4

2

5

T2 ← A

4

5

4

2

5

A ← AX2

4

5

4

2

2

AX2 ← T2

4

5

4

5

2

Эта особенность команды XCHG особенно важна, например, при организации семафоров в многопроцессорной системе.

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

Соседние файлы в папке Введение в вычислительную технику.