ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 24.12.2021
Просмотров: 12153
Скачиваний: 10

Типы команд
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 (окончание)

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
имеют довольно много различных команд обычного и циклического сдвига, и прак-
тически все они совершенно бесполезны.

Типы команд
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 (начало)

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

Типы команд 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, и вызывается она только в редких случаях. Она содержит код
для интерпретации нескольких сложных команд, загрузчик класса, верификатор
байт-кода, администратор потока и программу чистки памяти («сборщик мусора»).