Так как микрооперации выполняются вне исходной последовательности, сохранение в кэше первого уровня возможно только после пересортировки результатов всех команд, предшествующих команде сохранения. Такую пересортировку результатов с их трассировкой (отслеживанием того, где они находятся) выполняет блок пересортировки В случае прерывания прекращается обработка всех команд, еще не прошедших пересортировку результатов; таким образом, обеспечивается соблюдение требования, согласно которому при прерывании
Команды процессора Pentium 4
Команды Pentium 4 представляют собой причудливую смесь 32-разрядных команд, а также команд, появившихся еще в процессоре 8088. В таблице1 приведены наиболее распространенные целочисленные команды, при этом используются следующие обозначения:
SRC - источник данных;
DST - приемник данных:
#-количество битов, из которое происходит сдвиг;
LV - количество локальных переменных.
Перечень далеко не полный, поскольку в него не вошли команды с плавающей точкой, команды управления, а также некоторые нечасто встречающиеся целочисленные команды (например, использование 8-разрядного байта для выполнения поиска по таблице). Тем не менее таблица дает представление о том, какие действия может выполнять Pentium 4.
Многие команды Pentium 4 обращаются к одному или к двум операндам, которые находятся в регистрах или памяти. Например, бинарная команда ADD складывает два операнда, а унарная команда INC увеличивает значение одного операнда на 1. Некоторые команды имеют несколько похожих вариантов. Например, команды сдвига могут сдвигать слово либо вправо, либо влево, с учетом знакового бита или без учета. Большинство команд имеют несколько различных колировок в зависимости от природы операндов.
Таблица 1.
Команда | Описание |
Команды перемещения | |
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 (без учета знака) |
IMUL SRC | Умножение ЕАХ на SRC (с учетом знака) |
DJV SRC | Деление EDX:EAX на SRC (без учета знака) |
IDV SRC | Деление EDX:EAX на SRC (с учетом знака) |
ADC DST. SRC | Сложение SRC с DST и прибавление бита переноса |
S88 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. # | Сдвиг DST влево/вправо на * бит |
SHL/SHR DST. # | Логический сдвиг OST влево/вправо на я бит |
ROL/ROR OST, * | Циклический сдвиг DST влево/вправо на # бит |
ROL/ROR OST. ш | Циклический сдвиг OST по переносу на * бит |
Команды тестирования и сравнения | |
TSTSRC1.SRC2 | Операнды логической операции И. установка флагов |
CMP SRC1.SRC2 | Установка флагов на основе разности SRC1 - SRC2 |
Команды передачи управления | |
JMP ADDR | Переход к адресу |
Jxx ADDR | Условные перекоды на основе флагов |
CALL ADDR | Вызов процедуры по адресу |
RET | Выход из процедуры |
IRET | Выход из прерывания |
LOOPkx | продолжение цикла до выполнения определенного условия |
INT ADDR | Программное прерывание |
INTO | Прерывание, если установлен бит переполнения |
Команды обработки стокрок | |
LOOS | Загрузка строки |
STOS | Сохранение строки |
MOVS | Перемещение строки |
CMPS | Сравнение двух строк |
SCAS | Сканирование строки |
Команды для работы с /содами условий | |
STC | Установка бита переноса в регистре EFLAGS |
CLC | Сброс бита переноса в регистре EFLAGS |
CMC | Дополнение бита переноса в регистре EFLAGS |
STD | Установка бита направления в регистре EFLAGS |
CLO | Сброс бита направления в регистре EFLAGS |
STN | Установка бита прерывания в регистре EFLAGS |
CLI | Сброс бита прерывания в регистре 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-разрядных операндов соответственно. Они различаются по коду операции и/или по одному биту в команде. В таблице1. приведены в основном 32-разрядные команды.
Для удобства команды разделены на несколько групп. Первая группа содержит команды, которые перемещают данные между компонентами машины: регистрами, памятью и стеком. Вторая группа содержит арифметические команды для операций со знаком и без знака. При умножении и делении 64-разрядное произведение или делимое хранится в двух регистрах: ЕАХ (младшие биты) и EDX (старшие биты).
Третья группа включает двоично-десятичную арифметику. Здесь каждый байт рассматривается как два 4-разрядных полубайта. Каждый полубайт содержит 1 десятичный разряд (от 0 до 9). Комбинации битов от 1010 до 1111 не используются. Таким образом, 16-разрядное целое число может содержать десятичное число от 0 до 9999. Хотя такая форма хранения неэффективна, она устраняет необходимость преобразования десятичных входных данных в двоичные, а затем обратно в десятичные для вывода. Эти команды служат для выполнения арифметических действий нал двоично-десятичными числами. Они широко используются в программах на языке COBOL
Логические команды и команды сдвига манипулируют битами в слове или байте. Существует несколько комбинаций.
Следующие две группы связаны с проверкой, сравнением и осуществлением перехода в зависимости от полученного результата. Результаты проверки и сравнения хранятся в различных битах регистра EFLAGS. Символами Jхх обозначена группа команд, выполняющих условный переход в зависимости от результатов предыдущего сравнения (то есть в зависимости от битов в регистре EFLAGS).
В Pentium 4 есть несколько команд для загрузки, сохранения, перемещения, сравнения и сканирования символьных строк или слов. Перед этими командами может стоять специальный префиксный байт REP (repetition — повторение), который заставляет команду повторяться до тех пор. пока не будет выполнено определенное условие (например, пока регистр ЕСХ. значение которого уменьшается на 1 после каждого повторения, не станет равным 0). Таким образом. различные действия (перемещение, сравнение и г.д.) могут производиться над произвольными блоками данных. Следующая группа команд управляет кодами условий.
В последнюю группу входят команды, которые не вошли ни в одну из предыдущих групп. Это команды перекодирования, управления, ввода-вывода и остановки процессора.
Команды Pentium 4 имеют ряд префиксов. Один из них (REP) мы уже упомянули. Префикс - это специальный байт, который может ставиться практически перед любой командой (подобно WIDE в IJVM). Как уже отмечалось, префикс REP заставляет команду, идущую за ним, повторяться до тех пор, пока регистр ЕСХ не примет значение 0. Префиксы REP2 и REPHZ заставляют команду выполняться
снова и снова, пока код выполнения условия Z не примет значение 1 или 0 соответственно. Префикс LOCK резервирует шину для всей команды, чтобы можно было осуществлять межпроцессорную синхронизацию. Другие префиксы используются для того, чтобы команда работала и 16 или 32 разрядном формате При этом меняется не только длима операндов, но и полностью переопределяются режимы адресации. Наконец, в Pentium 4 реализована сложная схема сегментации, в которой задействованы код, данные, стек и дополнительные сегменты (наследие 8088). Префиксы позволяют регламентировать применение тех или иных сегментов при обращении к памяти.