ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 24.12.2021

Просмотров: 12153

Скачиваний: 10

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Типы команд

393

Команды передачи управления

JMPADDR

Jxx ADDR

CALL ADDR

RET

IRET

LOOPxx

INT ADDR

INTO

Переход к адресу

Условные переходы на основе флагов

Вызов процедуры по адресу

Выход из процедуры

Выход из прерывания

Продолжает цикл до удовлетворения определенного условия

Инициирует программное прерывание

Совершает прерывание, если установлен бит переполнения

Команды для операций над цепочками

3

LODS
STOS

MOVS
CMPS

SCAS

Загружает цепочку

Сохраняет цепочку

Перемещает цепочку

Сравнивает две цепочки

Сканирование цепочки

Коды условия

и

STC
CLC

CMC

STD
CLD

STI
CLI

PUSHFD

POPFD

LAHF

SAHF

Устанавливает бит переноса в регистре EFLAGS

Сбрасывает бит переноса в регистре EFLAGS

Образует дополнение бита переноса в регистре EFLAGS

Устанавливает бит направления в регистре EFLAGS

Сбрасывает бит направления в регистре EFLAGS

Устанавливает бит прерывания в регистре EFLAGS

Сбрасывает бит прерывания в регистре EFLAGS

Помещает регистр EFLAGS в стек

Выталкивает содержимое регистра EFLAGS из стека

Загружает АН из регистра EFLAGS

Сохраняет АН в регистре EFLAGS

Прочие команды

к

SWAP DST

CWQ

SWDE

ENTER SIZE, LV

LEAVE

NOP

HLT

IN AL, PORT

OUT PORT, AL

WAIT

Изменяет порядок байтов DST

Расширяет ЕАХ до EDX:EAX для деления

Расширяет 16-битное число в АХ до ЕАХ

Создает стековый фрейм с байтами размера

Удаляет стековый фрейм, созданный командой ENTER

Пустая операция

Останов

Переносит байт из порта в АЛУ

Переносит байт из АЛУ в порт

Ожидает прерывания

SRC = источник (source);

DST = пункт назначения (destination);

# = на сколько битов происходит сдвиг;

LV = # локальных переменных

Рис.

  5 . 2 1 . Команды с целыми числами в Pentium II (окончание)


background image

394 Глава 5. Уровень архитектуры команд

Pentium II имеет ряд префиксов. Один из них (REP) мы уже упомянули. Пре-

фикс — это специальный байт, который может ставиться практически перед лю-
бой командой (подобно WIDE в IJVM). Префикс REP заставляет команду, иду-
щую за ним, повторяться до тех пор, пока регистр ЕСХ не примет значение 0, как
было сказано выше. REPZ и REPNZ заставляют команду выполняться снова и
снова, пока код выполнения условия Z не примет значение 1 или 0 соответственно.
Префикс LOCK резервирует шину для всей команды, чтобы можно было осуществ-

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

меняется длина операндов, но и полностью переопределяются способы адресации.

Команды UltraSPARC II

Все целочисленные команды пользовательского режима UltraSPARC II приведе-

ны на рис. 5.22. Здесь не даются команды с плавающей точкой, команды управле-
ния (например, команды управления кэш-памятью, команды перезагрузки систе-
мы), команды, включающие адресные пространства, отличные от пользовательских,
или устаревшие команды. Набор команд удивительно мал: UltraSPARC II — это
процессор типа RISC.

Структура команд LOAD и STORE очень проста. Эти команды имеют варианты для

1, 2,4 и 8 байтов. Если в 64-разрядный регистр загружается число размером мень-

ше 64 битов, это число может быть либо расширено по знаку, либо дополнено ну-
лями. Существуют команды для обоих вариантов.

Следующая группа команд предназначена для арифметических операций. Ко-

манды с буквами СС в названии устанавливают биты кода условия. На машинах

CISC большинство команд устанавливают коды условия, но в машине типа RISC

это нежелательно, поскольку ограничивает способность компилятора перемещать
команды, стараясь заполнить отсрочки. Если изначальный порядок команд А... В... С,
где А устанавливает коды условия, а В проверяет их, то компилятор не может вста-
вить С между А и В, если С устанавливает условные коды. По этой причине мно-
гие команды имеют два варианта, при этом компилятор обычно использует ту ко-
манду, которая не устанавливает коды условия, если не планируется проверить их

позже. Команды умножения, деления со знаком и деления без знака тоже поддер-

живаются.

Кроме этого, поддерживается специальный формат 30-битных чисел с автома-

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

команду ADD, а во время выполнения программы машина определяет, нужна ли в

данном случае целочисленная команда ADD или команда ADD с плавающей точкой.

Группа команд сдвига включает одну команду сдвига влево и две команды сдвига

вправо. Каждая из них имеет два варианта: 32-битный и 64-битный. Команды сдвига
в основном используются для манипуляции с битами. Большинство машин CISC
имеют довольно много различных команд обычного и циклического сдвига, и прак-
тически все они совершенно бесполезны.


background image

Типы команд

395

Команды загрузки

а

LDSB ADDR, DST
LDUB ADDR, DST
LDSH ADDR, DST
LDUH ADDR, DST

LDSW ADDR, DST
LDUW ADDR, DST

LDX ADDR, DST

Загружает байт со знаком (8 битов)

Загружает байт без знака (8 битов)

Загружает полуслово со знаком (8 битов)

Загружает полуслово без знака (16 битов)

Загружает слово со знаком (32 бита)

Загружает слово без знака (32 бита)

Загружает расширенные слова (64 бита)

Команды сохранения

STB SRC, ADDR
STH SRC, ADDR

STW SRC, ADDR

STX SRC, ADDR

Сохраняет байт (8 битов)

Сохраняет полуслово (16 битов)

Сохраняет слово (32 битов)

Загружает расширенное слово (64 бита)

Арифметические команды

в

ADDR1.S2, DST

ADDCC

ADDC

ADDCCC

SUBR1.S2, DST

SUBCC

SUBC

SUBCCC

MULXR1.S2, DST

SDIVXR1.S2, DST
UDIVXR1.S2, DST

TADCCR1.S2, DST

Сложение

Сложение с установкой кода условия

Сложение с переносом

Сложение с переносом и установкой кода условия

Вычитание

Вычитание с установкой кода условия

Вычитание с переносом

Вычитание с установкой кода переноса

Умножение

Деление со знаком

Деление без знака

Сложение с использованием поля тега

Команды сдвига/циклического сдвига

SLLR1.S2, DST

SLLXR1.S2, DST

SRLR1.S2, DST

SRLXR1.S2, DST

SRAR1.S2, DST

SRAXR1.S2, DST

Логический сдвиг влево (32 бита)
Логический сдвиг влево (64 бита)

Логический сдвиг вправо (32 бита)
Логический сдвиг вправо (64 бита)

Арифметический сдвиг вправо (32 бита)
Арифметический сдвиг вправо (64 бита)

Логические команды

д

ANDR1.S2, DST"

ANDCC "

ANDN "

ANDNCC"

ORR1.S2, DST"

ORCC"

ORN"

ORNCC"

XORR1.S2, DST"

XORCC"

XNOR"

XNORCC"

Логическое И

Логическое И с установкой кода условия

Логическое НЕ-И

Логическое НЕ-И с установкой кода условия

Логическое ИЛИ

Логическое ИЛИ с установкой кода условия

Логическое НЕ-ИЛИ

Логическое НЕ-ИЛИ с установкой кода условия

Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ

Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ с установкой кода условия

Логическое ИСКЛЮЧАЮЩЕЕ НЕ-ИЛИ

Логическое ИСКЛЮЧАЮЩЕЕ НЕ-ИЛИ с установкой кода условия

Рис. 5.22. Основные целочисленные команды UltraSPARC II (начало)


background image

396

Глава 5. Уровень архитектуры команд

Передача управления

в

ВРсс ADDR

BPr SRC, ADDR

CALL ADDR

RETURN ADDR

JMPL ADDR, DST

SAVER1.S2, DST

RESTORE "

Тсс СС, TRAP#

PREFETCH FNC

LDSTUB ADDR, R

MEMBAR MASK

Переход с прогнозированием

Переход в регистр

Вызов процедуры

Выход из процедуры

Переход со связыванием

Расширение регистровых окон

Восстановление регистровых окон

Системное прерывание при определенном условии

Выборка данных из памяти с упреждением

Атомарная операция загрузки/сохранения

Барьер памяти

Прочие команды

ж

SETHI CON, DST

MOVcc CC, S2, DST

MOVr, R1.S2, DST

NOP

POPCS1.DST

RDCCR V, DST

WRCCR, R1.S2, V

RDPC V, DST

Установка битов с 10 по 13

Перемещение при определенном условии

Перемещение в зависимости от значения регистра

Пустая операция

Подсчет генеральной совокупности

Чтение регистра кода условия

Запись регистра кода условия

Чтение счетчика команд

SRC = входной регистр

(source register);

DST = выходной регистр

(destination redister);

R1 = входной регистр;

S2 = источник: регистр;

или непосредственно

получаемые данные;

ADDR = адрес памяти;

TRAP# = номер

системного прерывания;

FCN = код функции;

MASK = тип операции;

CON = константа;

V = указатель регистра;

СС = набор кодов условия;

R = выходной регистр;

ее = условие;

г = LZ, LEZ, 2, NZ, GZ, GEZ

Рис. 5.22.

 Основные целочисленные команды UltraSPARC II (окончание)

Логические команды аналогичны арифметическим. Эта группа включает ко-

манды AND (И), (Ж(ИЛИ), EXCLUSIVE OR (ИСКЛЮЧАЮЩЕЕ ИЛИ), ANDN (НЕ-И),
ORN (НЕ-ИЛИ) и XNOR (ИСКЛЮЧАЮЩЕЕ НЕ-ИЛИ). Значение последних трех
команд спорно, но они могут выполняться за один цикл и не требуют практически
никакого дополнительного аппаратного обеспечения, поэтому они часто вклю-

чаются в набор команд. Даже разработчики машин RISC порой поддаются иску-

шению.

Следующая группа содержит команды передачи управления. ВРсс представля-

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


background image

Типы команд 397

Предусмотрено два способа вызова процедур. Для команды CALL используется

формат 4 (см. рис. 5.10) с 30-битным смещением. Этого значения достаточно для
того, чтобы добраться до любой команды в пределах 2 Гбайт от вызывающего опе-
ратора в любом направлении. Команда CALL копирует адрес возврата в регистр R15,
который после вызова превращается в регистр R31.

Второй способ вызова процедуры — команда JMPL, для которой используется

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

Команды SAVE и RESTORE манипулируют регистровым окном и указателем сте-

ка. Обе команды совершают прерывание, если следующее (предыдущее) окно не-

доступно.

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

Команда SETHI необходима, поскольку невозможно поместить 32-битный непосред-
ственный операнд в регистр. Для этого команда SETHI устанавливает биты с 10 по

31, а затем следующая команда передает оставшиеся биты, используя непосред-
ственный формат.

Команда РОРС подсчитывает число битов со значением 1 в слове. Последние три

команды предназначены для чтения и записи специальных регистров.

Ряд широко распространенных команд CISC, которые отсутствуют в этом спис-

ке, можно легко получить, используя либо регистр GO, либо операнд-константу
(формат lb). Некоторые из них даны в табл. 5.9. Эти команды узнаются ассембле-

ром UltraSPARC II и часто порождаются компиляторами. Многие из них исполь-
зуют тот факт, что регистр GO связан с 0 и что запись в этот регистр не произведет
никакого результата.

Команды компьютера picoJava II

Настало время рассмотреть уровень команд машины picoJava II. Здесь реализован
полный набор команд JVM (226 команд), а также 115 дополнительных команд,
предназначенных для С, C++ и операционной системы. Мы сосредоточимся глав-
ным образом на командах JVM, поскольку компилятор Java производит только
эти команды. Архитектура команд JVM не содержит регистров, доступных пользо-
вателю, а также не имеет некоторых других особенностей, обычных для большин-
ства центральных процессоров. (В процессоре picoJava II есть 64 встроенных ре-
гистра для вершины стека, но пользователи их не видят.) Большинство команд

JVM помещают слова в стек, оперируют словами, находящимися в стеке, и вытал-

кивают слова из стека. Большинство команд JVM выполняются непосредственно
аппаратным обеспечением picoJava II, но некоторые из них микропрограммиру-
ются, а некоторые даже передаются программе обработки для выполнения.

Таким образом, для того чтобы заставить машину работать, требуется небольшая

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