Обзор системы команд процессоров семейства х86, страница 3

4)  SHLD, SHRD  ‑ сдвиг двойного слова. Разновидность логического сдвига, при которой освобождающиеся позиции заполняются содержимым операнда-источника. Таким образом, эти команды имеют три параметра: сдвигаемый приемник, неподвижный источник и количество сдвигов.

3. Проверки и передача управления.

Команды этой группы, используемые совместно, позволяют реализовать конструкции вида
IF условие {операторы}.
В этой конструкции операторы выполняются лишь в том случае, если истинно заданное условие.
Для реализации таких конструкций используется сначала команда проверки, которая изменяет состояние флагов в регистре [E]FLAGS. Затем используется команда условного ветвления, которая нарушает естественный порядок следования команд (загружает новое значение в счетчик команд), если выполнено указанное условие (т.е. имеется заданное сочетание состояний флагов).

3.1. Команды проверки и сравнения

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

CMP  - сравнение операндов путем вычитания. Результат вызывает изменение признаков (флагов), а затем теряется.

Строковые (блочные, цепочечные) команды сравнения.

CMPS – сравнение строк и изменение флагов по результату сравнения.

SCAS – сканирование строки – сравнение элементов строки с содержимым регистра AL или AX или EAX и изменение флагов по результату сравнения.

3.2. Команды условного ветвления.

Jсс   (jump conditional). Их в системе команд х86.‑ (формально, по Intel Architecture Software Developer’s Manual, Volume 2, стр. 271 по сквозной нумерации)) – 63 штуки.

Мнемонические обозначения команд условного ветвления содержат сокращения анализируемых условий. Для простых условий используются те же обозначения, что и для флагов: jc – ветвление, если флаг cf установлен, jnz – ветвление, если флаг zf не установлен.

Для сложных условий ‑ «больше», «больше или равно» «меньше или равно», «меньше» ‑ используются сокращения:
‑ от слов greater – «больше» и less – меньше ‑ при сравнениях целочисленных операндов со знаком, и
‑ от слов above – «выше» (в смысле «больше») и below – «ниже» (в смысле «меньше») – при сравнении беззнаковых операндов.

Условия, анализируемые командами условного ветвления уже были рассмотрены в разделе «Представление целых чисел».

Эти условия для можно разделить на три группы:

1)  Ветвления по простым условиям. Для большинства процессоров в эту группу входят команды, анализирующие состояние «установлен» или «очищен» каждого из четырех основных флагов:  – соответственно 8 команд. В регистре состояний процессоров х86 имеется еще флаг «четность» (parity, pf). 

2)  Ветвления по результату сравнения беззнаковых чисел (четыре условия: «больше», «больше или равно» «меньше или равно», «меньше»). Для удобства программиста, для каждой из команд имеется два альтернативных обозначения – итого 8 мнемоник).

3)  Ветвления по результату сравнения чисел со знаком (четыре условия каждая команда имеет два альтернативных обозначения – итого 8 мнемоник).

Таблица команд условного ветвления для процессоров х86.

4)  Кроме того имеется группа команд ветвления по содержимому регистра (E)CX.

 Адресация в командах ветвления может быть относительная (со знаковым смещением 8 бит, либо 16 бит, либо 32 бит )

3.3. Команда организации цикла LOOP* позволяет организовать программный цикл с аппаратным счетчиком в регистре [e]cx. Мало используется, так как затруднительно организовывать вложенные циклы.

3.4. Команда безусловной передачи управления JMP. Имеет 9 вариантов адресации.

3.5. Команды поддержки модульной структуры программ

CALL вызов процедуры. Адресация в командах jmp и call делается такой, чтобы можно было "прыгнуть" в любое место программной памяти ("длинная" адресация). Call имеет 8 вариантов адресации, jmp имеет 9 вариантов адресации.

ENTER  формирование стекового кадра.

LEAVE  освобождение стекового кадра

RET  возврат из процедуры

. (Более детально команды поддержки модульной структуры рассмотрены в разделе «Управление вычислительным процессом»)

При обращении / возврате надо обеспечить:

а) передачу управления в любое место памяти, поэтому "длинная" адресация;

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

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

4. Команды ввода – вывода (обмена с периферийными устройствами[1]).

Фактически, команды это тоже команды пересылки. Основное отличие между пересылками «регистр-память» и пересылками из/в периферийное устройство ПУ состоит в том, что скорость функционирования ПУ может существенно отличаться от скорости работы процессора, и поэтому ПУ далеко не всегда бывает готово к обмену.

В системах на базе процессоров х86 регистры периферийных устройств имеют свою систему нумерации (адресации), адресное пространство ввода-вывода полностью изолировано от других адресных пространств и имеет размер 64 кБайт. Для обмена в системе команд есть две команды:

IN  - команда ввода из ВНУ

OUT - команда вывода на ВНУ

Адресация в этих командах может быть абсолютной (номер порта в пределах от 000 до 255 указывается прямо в команде) или косвенно-регистровой, в качестве адресного регистра всегда используется регистр DX.

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

INSB / INSW /INSD - команда ввода цепочки элементов из порта периферийного устройства,

OUTSB / OUTSW / OUTSD - команда вывода цепочки элементов  в порт периферийного устройства.

4. Команды плавающей арифметики

Включают более 80 команд, работающих с вещественными числами

5. Набор дополнительных команд MMX (Math and Matrix eXtention)

Включает более 70 команд, реализующих идеологию SIMD – Single Instruction ‑ Multiple Data, позволяющих одной командой выполнить действие над несколькими целочисленными операндами (длиной 8 или 16 или 32 бита), упакованными в одно 64-битовое слово.

6. Набор дополнительных команд XMM

Включает 70 команд, реализующих идеологию SIMD – Single Instruction ‑ Multiple Data, позволяющих одной командой выполнить действие над несколькими вещественными операндами (длиной 32 бита), упакованными в одно 128-битовое слово.

7. Системные команды ( команды управления процессором )



[1] Периферийным устройством будем называть любое устройство, внешнее, по отношению к «вычислительному ядру» (т.е. к совокупности «процессор – основная память).