|
В этом и следующих двух подразделах мы рассмотрим наборы команд трех машин: Pentium 4, UltraSPARC III и 8051. Каждая из них поддерживает базовые команды, обычно получаемые в результате работы компиляторов, а также дополнительные команды, которые используются редко или используются исключительно операционной системой. Начнем с Pentium 4.
Команды Pentium 4 представляют собой причудливую смесь 32-разрядных команд, а также команд, появившихся еще в процессоре 8088. В табл. 5.9 приведены наиболее распространенные целочисленные команды, при этом используются следующие обозначения:
♦ SRC - источник данных;
♦ DST - приемник данных;
♦ # - количество битов, на которое происходит сдвиг;
♦ LV - количество локальных переменных.
Перечень далеко не полный, поскольку в него не вошли команды с плавающей точкой, команды управления, а также некоторые нечасто встречающиеся целочисленные команды (например, использование 8-разрядного байта для выполнения поиска по таблице). Тем не менее таблица дает представление о том, какие действия может выполнять Pentium 4.
Многие команды Pentium 4 обращаются к одному или к двум операндам, которые находятся в регистрах или памяти. Например, бинарная команда ADD складывает два операнда, а унарная команда INC увеличивает значение одного операнда на 1. Некоторые команды имеют несколько похожих вариантов. Например, команды сдвига могут сдвигать слово либо вправо, либо влево, с учетом знакового бита или без учета. Большинство команд имеют несколько различных кодировок в зависимости от природы операндов.
Таблица 5.9. Наиболее распространенные целочисленные команды процессора Pentium 4
|
Команда
|
Описание
|
|
Команды перемещения
|
|
|
MOV DST, SRC
|
Перемещение из SRC в DST
|
|
PUSH SRC
|
Помещение из SRC в стек
|
|
POP DST
|
Выталкивание слова из стека и помещение его в DST
|
|
XCHG DS1, DS2
|
Смена мест DS1 и DS2
|
|
LEA DST, SRC
|
Загрузка действительного адреса SRC в DST
|
|
CMOV DST, SRC
|
Условное перемещение
|
|
Арифметические команды
|
|
|
ADD DST, SRC
|
Сложение SRC и DST
|
|
SUB DST, SRC
|
Вычитание SRC из DST
|
|
MUL SRC
|
Умножение ЕАХ на SRC (без учета знака)
|
|
IMULSRC
|
Умножение ЕАХ на SRC (с учетом знака)
|
|
DIV SRC
|
Деление EDXiEAX на SRC (без учета знака)
|
|
IDV SRC
|
Деление EDX:EAX на SRC (с учетом знака)
|
|
ADC DST, SRC
|
Сложение SRC с DST и прибавление бита переноса
|
|
SBB DST, SRC
|
Вычитание DST и перенос из SRC
|
|
INC DST
|
Инкремент (прибавление 1) DST
|
|
DEC DST
|
Декремент (вычитание 1) DST
|
|
NEG DST
|
Отрицание DST (вычитание DST из 0)
|
|
Двоично-десятичные команды
|
|
DAA
|
Десятичная коррекция
|
|
AAA
|
Коррекция ASCII-кода для сложения
|
|
AAS
|
Коррекция ASCII-кода для вычитания
|
|
AAM
|
Коррекция ASCII-кода для умножения
|
|
AAD
|
Коррекция ASCII-кода для деления
|
|
Логические команды
|
|
|
AND DST, SRC
|
Логическая операция И над SRC и DST
|
|
OR DST, SRC
|
Логическая операция ИЛИ над SRC и DST
|
|
XOR DST, SRC
|
Логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ над SRC и DST
|
|
NOT DST
|
Замещение DST дополнением до 1
|
|
Команды обычного и циклического сдвига
|
|
SAL/SAR DST, #
|
Сдвиг ОБТ влево/вправо на # бит
|
|
SHL/SHR DST, #
|
Логический сдвиг 08Т влево/вправо на # бит
|
|
ROL/ROR DST, #
|
Циклический сдвиг 08Т влево/вправо на # бит
|
|
ROL/ROR DST, #
|
Циклический сдвиг 08Т по переносу на # бит
|
|
Команды тестирования и сравнения
|
|
TST SRC1, SRC2
|
Операнды логической операции И, установка флагов
|
|
Команда
|
Описание
|
|
CMPSRC1, SRC2
|
Установка флагов на основе разности SRC1 - SRC2
|
|
Команды передачи управления
|
|
JMP ADDR
|
Переход к адресу
|
|
Jxx ADDR
|
Условные переходы на основе флагов
|
|
CALL ADDR
|
Вызов процедуры по адресу
|
|
RET
|
Выход из процедуры
|
|
IRET
|
Выход из прерывания
|
|
LOOPxx
|
Продолжение цикла до выполнения определенного условия
|
|
INT ADDR
|
Программное прерывание
|
|
INTO
|
Прерывание, если установлен бит переполнения
|
|
Команды обработки строк
|
|
|
LODS
|
Загрузка строки
|
|
STOS
|
Сохранение строки
|
|
MOVS
|
Перемещение строки
|
|
CMPS
|
Сравнение двух строк
|
|
SCAS
|
Сканирование строки
|
|
Команды для работы с кодами условий
|
|
STC
|
Установка бита переноса в регистре EFLAGS
|
|
CLC
|
Сброс бита переноса в регистре EFLAGS
|
|
CMC
|
Дополнение бита переноса в регистре EFLAGS
|
|
STD
|
Установка бита направления в регистре EFLAGS
|
|
CLD
|
Сброс бита направления в регистре EFLAGS
|
|
STI
|
Установка бита прерывания в регистре EFLAGS
|
|
С LI
|
Сброс бита прерывания в регистре EFLAGS
|
|
PUSHFD
|
Помещение значения из регистра EFLAGS в стек
|
|
POPFD
|
Выталкивание значения из стека в регистр EFLAGS
|
|
LAHF
|
Загрузка АН из регистра EFLAGS
|
|
SAHF
|
Сохранение АН в регистре EFLAGS
|
|
Прочие команды
|
|
|
SWAP DST
|
Изменение порядка следования байтов в DST
|
|
CWQ
|
Расширение ЕАХ до EDX:EAX для деления
|
|
SWDE
|
Расширение 16-разрядного числа в АХ до ЕАХ
|
|
ENTER SIZE, LV
|
Создание стекового фрейма с байтами размера
|
|
LEAVE
|
Удаление стекового фрейма, созданного командой ENTER
|
|
NOP
|
Пустая операция
|
|
HLT
|
Останов
|
|
IN AL, PORT
|
Перенос байта из порта в АЛУ
|
|
OUT PORT, AL
|
Перенос байта из АЛУ в порт
|
|
WAIT
|
Ожидание прерывания
|
При выполнении команд источники данных (SRC) не изменяются, а приемники (DST) обычно изменяются. Существуют определенные правила, определяющие, что может быть источником, а что приемником, но здесь мы не будем о них говорить. Многие команды имеют три варианта: для 8-, 16- и 32-разрядных операндов соответственно. Они различаются по коду операции и/или по одному биту в команде. В табл. 5.9 приведены в основном 32-разрядные команды.
Для удобства мы разделили команды на несколько групп. Первая группа содержит команды, которые перемещают данные между компонентами машины: регистрами, памятью и стеком. Вторая группа содержит арифметические команды для операций со знаком и без знака. При умножении и делении 64-разрядное произведение или делимое хранится в двух регистрах: ЕАХ (младшие биты) и EDX (старшие биты).
Третья группа включает двоично-десятичную арифметику. Здесь каждый байт рассматривается как два 4-разрядных полубайта. Каждый полубайт содержит 1 десятичный разряд (от 0 до 9). Комбинации битов от 1010 до 1111 не используются. Таким образом, 16-разрядное целое число может содержать десятичное число от 0 до 9999. Хотя такая форма хранения неэффективна, она устраняет необходимость преобразования десятичных входных данных в двоичные, а затем обратно в десятичные для вывода. Эти команды служат для выполнения арифметических действий над двоично-десятичными числами. Они широко используются в программах на языке COBOL.
Логические команды и команды сдвига манипулируют битами в слове или байте. Существует несколько комбинаций.
Следующие две группы связаны с проверкой, сравнением и осуществлением перехода в зависимости от полученного результата. Результаты проверки и сравнения хранятся в различных битах регистра EFLAGS. Символами ]хх обозначена группа команд, выполняющих условный переход в зависимости от результатов предыдущего сравнения (то есть в зависимости от битов в регистре EFLAGS).
В Pentium 4 есть несколько команд для загрузки, сохранения, перемещения, сравнения и сканирования символьных строк или слов. Перед этими командами может стоять специальный префиксный байт REP (repetition - повторение), который заставляет команду повторяться до тех пор, пока не будет выполнено определенное условие (например, пока регистр ЕСХ, значение которого уменьшается на 1 после каждого повторения, не станет равным 0). Таким образом, различные действия (перемещение, сравнение и т. д.) могут производиться над произвольными блоками данных. Следующая группа команд управляет кодами условий.
В последнюю группу входят команды, которые не вошли ни в одну из предыдущих групп. Это команды перекодирования, управления, ввода-вывода и остановки процессора.
Команды Pentium 4 имеют ряд префиксов. Один из них (REP) мы уже упомянули. Префикс - это специальный байт, который может ставиться практически перед любой командой (подобно WIDE в IJVM). Как уже отмечалось, префикс REP заставляет команду, идущую за ним, повторяться до тех пор, пока регистр ЕСХ не примет значение 0. Префиксы REPZ и REPNZ заставляют команду выполняться снова и снова, пока код выполнения условия Z не примет значение 1 или 0 соответственно. Префикс LOCK резервирует шину для всей команды, чтобы можно было осуществлять межпроцессорную синхронизацию. Другие префиксы используются для того, чтобы команда работала в 16- или 32-разрядном формате. При этом меняется не только длина операндов, но и полностью переопределяются режимы адресации. Наконец, в Pentium 4 реализована сложная схема сегментации, в которой задействованы код, данные, стек и дополнительные сегменты (наследие 8088). Префиксы позволяют регламентировать применение тех или иных сегментов при обращении к памяти. К счастью, эта проблема для нас не слишком актуальна.
⇐Команды ввода-вывода || Оглавление || Команды UltraSPARC III⇒
|