- •2 Микропроцессор i80386
- •2.1.1 Программная модель 32-х разрядных
- •Отметим, что команды умножения знаковых и беззнаковых 32-х битовых целых чисел образуют 64-х битовое произведение, а команды деления рассчитаны на 64-х битовое делимое.
- •2.3.1 Режимы (методы) адресации
- •Базово-индексная адресация с отклонением. –
- •2.3.2 Использование сегментных регистров
- •2.3.3 Форматы команд
- •2.3.4 Кодирование режимов адресации
- •Команды передачи данных
- •Команды обработки цепочек
- •Команды работы с флагами (флажковые команды)
- •Команды передачи управления
- •Команды прерывания
2.3.3 Форматы команд
При разработке системы команд процессоров 386+ пришлось решать следующие основные проблемы :
обеспечить совместимость по объектному коду с предшествующими процессорами, но вместе с тем ввести в команды 32-х битовые операнды и адреса;
расширить диапазон использования регистров общего назначения в адресных вычислениях, в частности, привлечь для этого регистры EAX, ECX и EDX, 16-ти битовые аналоги которых AX, CX и DX для адресации не применялись;
по возможности ввести новые команды, которые упрощают решение часто встречающихся программных задач, например, битовые команды, команды двойного сдвига и др.
Общий формат команд процессоров 386+ приведен в табл. 2.3.
Таблица 2.3 – Число байт в командах процессоров 386+
Префиксы |
Число байт |
|
Поля команды |
Число байт |
1. Повторения |
0 или 1 |
|
1. Код операции |
1 или 2 |
2. Размер адреса |
0 или 1 |
|
2. mod , r/m |
0 или 1 |
3. Размер операнда |
0 или 1 |
|
3. s i b |
0 или 1 |
4. Замена сегмента |
0 или 1 |
|
4. Смещение |
0, 1, 2, или 4 |
5. Блокировки шины |
0 или 1 |
|
5. Непосредственный операнд |
0, 1, 2, или 4 |
Команды состоят:
из необязательных ПРЕФИКСОВ,
одного или двух байт (главного) КОДА ОПЕРАЦИИ,
СПЕЦИФИКАТОРА АДРЕСА, представленного байтами: mod,r/m и sib ;
СМЕЩЕНИЯ В КОМАНДЕ (displacement) (отклонения) и
НЕПОСРЕДСТВЕЕНЫХ ДАННЫХ.
Из всех полей команды обязательными являются только один или два байта КОДА ОПЕРАЦИИ.
ПРЕФИКС – это байт со специальным кодированием, который модифицирует операцию одной находящейся за ним команды :
ПОВТОРЕНИЯ (REPeate) – применяется в цепочечных (строковых) командах для автоматической обработки всех элементов цепочки;
РАЗМЕРА ОПЕРАНДА (OperandSize) – переключает 16-ти и 32-х битовые операнды;
РАЗМЕРА АДРЕСА (AddressSize) – коммутирует формирование 16-ти и 32-х битовых адресов;
ЗАМЕНЫ СЕГМЕНТА (Segment override) – явно определяет сегментный регистр для конкретной команды вместо сегментного регистра, применяемого по умолчанию.
Перед некоторыми командами обращения к памяти разрешается также указывать префикс LOCK – БЛОКИРОВКИ ШИНЫ. Наличие этого префикса заставляет процессор сформировать активный выходной сигнал LOCK#, который через арбитр шины запрещает другим процессорам в мультипроцессорной системе доступ к памяти на время выполнения команды с блокировкой шины.
Один или два байта КОДА ОПЕРАЦИИ определяют то действие, выполнение которого инициализирует команда. Двухбайтовые коды операций введены в процессорах 386+ для новых команд, например, PUSH FS, условных переходов со смещением длиной в слово или двойное слово и др. Для таких команд ПЕРВЫЙ БАЙТ КОДА ОПЕРАЦИИ всегда содержит 0Fh. Внутри байтов кода операции определяются некоторые поля, которые содержат информацию о направлении операции, размере смещения в команде, кодировании регистров и расширении со знаком (рис. 2.5) :
d – в двухоперандных командах определяет направление передачи данных: из регистра – в регистр/память (d = 0) или из регистра/памяти – в регистр (d = 1);
w – определяет размер операнда: в байт (при w = 0) или в полный размер – 16 или 32 бита (при w = 1).
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Код операции |
d |
w |
Код операции |
mod |
reg |
r/m |
ss |
index |
base |
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 2.5 – Формат команды процессоров 386+
ПОЛЕ «reg» – определяет операнд в одном из регистров общего назначения. Поле «reg» может находится в байте КОДА ОПЕРАЦИИ и в байте «mod, r/m». Кодирование этого поля зависит от того, имеется ли в команде поле «w», а при его наличии еще и от размера операнда (см. табл. 2.4).
Таблица 2.4 – Кодирование поля «reg»
Поле «reg» |
Поля «w» в команде нет |
Поле «w» в команде имеется |
||||
16-ти бит. операнд |
32-х бит.операнд |
|||||
16 бит |
32 бит |
w = 0 |
w = 1 |
w = 0 |
w = 1 |
|
000 |
AX |
EAX |
AL |
AX |
AL |
EAX |
001 |
CX |
ECX |
CL |
CX |
CL |
ECX |
010 |
DX |
EDX |
DL |
DX |
DL |
EDX |
011 |
BX |
EBX |
BL |
BX |
BL |
EBX |
100 |
SP |
ESP |
AH |
SP |
AH |
ESP |
101 |
BP |
EBP |
CH |
BP |
CH |
EBP |
110 |
SI |
ESI |
DH |
SI |
DH |
ESI |
111 |
DI |
EDI |
BH |
DI |
BH |
EDI |
