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

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

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

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

Оставить комментарий

Вы должны авторизоваться для отправки комментария.