Структура команды (форматы команд) IA-
Команды могут состоять из следующих элементов (полей):
Кол.байт |
Назначение | ||
0-1 |
Префикс | ||
1 |
Код операции | ||
0-1 |
Дополнительны код операции MODR/M | ||
0-1 |
SIB | ||
0,1,2,4 |
Смещение(Dis) | ||
0,1,2,4 |
Непосредственный(Im) операнд |
1.Префикс – (0-1) байт: уточняет или модифицирует выполнение команды. По существу это тоже дополнительный код операции. Типы префиксов:
- префикс размера операнда - переключает разрядность операнда с 16 на 32 (и наоборот); 386+
- префикс размера адреса - переключает разрядность адреса с 16 на 32 (и наоборот); 386+
- префикс замены сегмента - подключает альтернативный, вместо заданного по умолчанию (26-ES;36-SS;2E-CS;3E-DS).
- префикс блокировки локальной шины на время операции. LOCK (F0)
- префикс повторения - используется в командах обработки строк (F2,F3)
2. Код операции – 1 байт.
3. Дополнительны код операции и режим адресации MODR/M (0-1)байт.
4. SIB – масштаб – индекс - база. Его наличие определяется кодом операции. Используется для расширения возможности адресации. 386+
5. Смещение (Dis) – (0,1,2,4) байта. Целое число со знаком.
6. Непосредственный операнд (Im) - (0,1,2,4) байта.
Обязательным является только код операции.
Однобайтовый код операции (без операндов или с одним операндом).
7… 0 |
7… 1 0 |
7…4 3 210 | |||
Коп |
Коп w |
Коп w REG |
Обычно занимает один байт (первичный код операции), но может занимать и последующие байты (вторичный код операции).
Как правило "w" определяет размер операнда
w=0 - 8бит;
w=1 - 16бит (в 80386+ может быть и 32 бита, что определяется полем «Dd» в дескрипторе сегмента), а с помощью префикса размера операнда размер операнда может быть заменён на альтернативный.
Поле "REG" определяет номер регистра
REG(R/M) |
W=0 |
W = 1 | |||||
16 |
32 | ||||||
0 |
AL |
AX |
EAX | ||||
1 |
CL |
CX |
ECX | ||||
2 |
DL |
DX |
EDX | ||||
3 |
BL |
BX |
EBX | ||||
4 |
AH |
SP |
ESP | ||||
5 |
СН |
BР |
EBP | ||||
6 |
DH |
SI |
ESI | ||||
7 |
BH |
DI |
EDI |
Для непосредственной адресации.
7… 2 1 0 |
Коп s w |
В командах в командах типа сложения с непосредственным адресом.
sw = 00 - 8-битные операнды
sw = 01 - 16-и (32-х) битные с 16-и (32-х)битным непосредственным адресом.
sw = 11 - 16 (32-х) битные с 8- и битным непосредственным адресом, который расширяется знаком до 16-и (32).
Двухбайтный код операции.
2-й байт (MODR/M). 1-й байт
7 6 5 4 3 2 1 0 |
7… 1 0 |
MOD ¦ REG/КОП ¦ R/M |
Коп d w |
d = 0 - место результата определяется полем MOD и R/M в следующем байте (описателе регистра); называемом MODR/M.
d = 1 - место результата определяется полем REG описателя регистра.
Таким образом первичный код операции определяет наличие второго поля в следующем байте - описателя регистра.
Поле МOD определяет -
11 - R/M: второй операнд тоже регистр.
Все остальные значения означают, а) что второй операнд берётся из памяти со смещением или без.
01 - смещение занимает 1 байт и модифицируется.
10 - смещение занимает 2 (4)байта и модифицируется.
Поле REG может быть как номером регистра, так и вторичным (дополнительным) кодом операции. Это зависит от значения основного КОП.
Поле R/M определяет правила формирования адреса (при MOD?11).
Замечания.
1)* - по умолчанию регистр сегмента DS.
2)Незаданный адрес считается нулевым.
3)Адрес, заданный байтом (D8), расширяется знаком до слова.
4)D8, D16 - смещение, последующие байты
Байт SIB (Scale-Index-Base) – масштаб – индекс - база следует 3-м байтом - описатель адреса
SIB присутствует, если MOD?11 а R/M=100
Формат SIB
Scale |
Index |
Base |
7 6 |
5 4 3 |
2 1 0 |
Компоненты адреса, определяемые полями SIB.
Значение S/I/B |
Множитель(S) |
Индекс (I) |
База (B) |
0 |
1 |
ЕАХ |
ЕАХ |
1 |
2 |
ЕСХ |
ЕСХ |
2 |
4 |
EDX |
EDX |
3 |
8 |
ЕВХ |
ЕВХ |
4 |
- |
нет,SS=0 |
ESP |
5 |
- |
ЕВР |
D32* |
6 |
- |
ЕSI |
ESI |
7 |
- |
EDI |
EDI |
* если MOD=0,иначе ЕВР. Адресация абсолютная.
Если режим адресации предусматривает использование смещения, то оно занимает последующие байты.
Если режим адресации предусматривает использование непосредственного операнда, то он занимает последующие байты.
Форматы команд с двумя операндами.
1. Формат "регистр-регистр"
1 байт |
1-й байт |
||||
11 |
rеg1 |
reg2 |
Коп |
d |
w |
76 |
5 4 3 |
2 1 0 |
7 6 5 4 3 2 |
1 |
0 |
reg2*reg1> reg2
reg1*reg2 >reg1
w - размер операндов: "1" - слова w=0 - байты
d - регистр результата и первого операнда
2. Формат "регистр-память"
0– 2 байта |
1 байт |
1 байт |
||||
Dis |
MOD |
REG |
R/M |
Коп |
D |
W |
7 6 |
5 3 |
2 1 0 |
7 6 5 4 3 2 |
1 |
0 |
d=0 (REG)*(EA) > REG
d=1 (EA)*REG> (EA)
MOD
0 Dis - 0 байтов
1 Dis - 1 байт
2 Dis - 2 байта
3. Формат "регистр - непосредственный операнд".
1 – 2 байта |
1 байт |
1 байт |
||||
I |
3 |
Коп |
R/M |
Коп |
S |
W |
7 6 5 4 3 2 1 0 |
7 6 |
5 4 3 |
2 1 0 |
7 6 5 4 3 2 |
1 |
0 |
W=0: Im - 1байт; W=1: Im - 2байта.
S – признак расширения байта знаком до слова.
4. Формат "память - непосредственный операнд".
1 – 2 байта |
0 – 2 байта |
1 байт |
1 байт |
||||
Im |
Dis |
3 |
Код |
R/M |
Коп |
S |
W |
7 6 |
5 4 3 |
2 1 0 |
765432 |
1 |
0 |
(EA)*Im > EA
4.9. Методы формирования адреса.
Цель различных методов адресации заключается в том, чтобы с помощью ограниченного объёма информации получить доступ к большим массивам информации: данных, констант, команд. Различают следующие виды адресации:
а) прямая
б) непосредственная
г) сокращенная
д) косвенная
е) индексированная
ж) относительная
1) При прямой адресации адрес операнда записывается в адресном полекоманды. Число адресуемых ячеек памяти определяется разрядностью адресного поля (полей) команды. Способ мало экономичен, поскольку в каждом участке программы используется ограниченное число обычно рядом расположенных операндов или команд. Эффективен для одноадресных команд или для команд с операциями над регистрами.
2) При непосредственной адресации в значение операнда является одним из полей команды. Этот метод очень удобен для адресации констант.
Недостатком его - трудность хранения операндов большой длины. Частный случай - операнд располагается в памяти вслед за командой. При использовании многословных команд этот недостаток можно считать преодолимым.
3) При косвенной адресации адресное поле содержит адрес ячейки, в которой хранится адрес операнда. Частный случай регистровая косвенная адресация.
|
4) Адресация с индексированием заключается в том, что адрес указанный в команде может модифицироваться, что позволяет одну и ту же операцию использовать многократно для обработки массива чисел.
|
РИ±1 в РИ
5) При относительной или базовой адресации в команде вместо собственно адреса указывается его смещение относительно некоторого базового адреса (или индекса). При этом базовый адрес определяет местонахождение начала массива, а индекс местонахождение ячейки внутри массива. Относительная адресация имеет много общего с адресацией с индексированием, но, как правило, смещение складывается с содержимым разных регистров и, в частности с содержимым счётчика команд, что позволяет создавать относительные (перемещаемые) программы, т.е. программы, не зависящие от местоположения в памяти.
6) Страничная адресация (метод контактенации) подразумевает, что в адресном поле команды помещаются только младшие разряды адреса операнда. Остальные разряды находятся в специальном регистре. Вообще говоря, их может быть несколько; тогда в команде должен быть указатель (номер, адрес) регистра, в котором хранятся старшие разряды адреса. В этом случае память как бы разбивается на куски (страницы). Т.о. в этом регистре хранится номер страницы. Частным случаем регистра страницы являются старшие разряды регистра, в котором хранится адрес команды (счётчика команд).
Один из вариантов сокращенной адресации - метод банков, когда каждой задаче выделяется свой банк.
Обобщающим методом сокращённой адресации является метод виртуальной памяти, делающий доступной всю имеющуюся память. В этом случае в ОЗУ хранится произвольный набор страниц, который аппаратно обновляется за счёт обмена с внешней памятью. Перечень действующих страниц обычно хранится в АЗУ.
Если размер страницы - переменный и для каждой страницы указывается её размер, то такая организация называется сегментной.
г) частота использования различных видов адресации в компьютерах типа СИСК.
- регистровая - 41%
- с индексацией - 25%
- непосредственная - 16%
- прямая - 2,5%
- косвенная - 9%
- косвенная с индексацией - 3%
4.10. Режимы адресации IA-32 при обращении к памяти.
Адресация может быть 32-х или 16-разрядной.
Размер адреса по умолчанию определяется полем Dd в дескрипторе сегмента в таблице дескрипторов. Префикс замены размерности адреса позволяет изменить размер адреса на альтернативный.
При 16-разрядной адресации в качестве компонентов адреса используются младшие разряды соответствующих регистров.
16- разрядный режим.
LА(20)= ЕА +RS*16 , где
LA - линейный адрес
ЕA = (B)+(I)+D.
ЕА – эффективный (исполнительный) адрес
(B) – содержимое базового регистра: ВХ или ВР
(I) – содержимое индексного регистра: SI или DI
D – смещение (8 или 16 разрядов)
RS – регистр сегмента: CS, DS, SS, ЕS, FS или GS.
Отдельные компоненты могут отсутствовать.
32-разрядный защищённый режим
В общем случае эффективный адрес вычисляется по формуле:
ЕА = (B) + (I) * SС + D
(B)- Base: содержимое базового регистра (начало массива)- любой РОН.
(I)- Index: содержимое индексного регистра (указание элемента массива)
SC – Scale: размер элемента массива (1,2,4,8), указывается в команде.
D –Displacement: смещение (0,8,16 или 32 разряда), указывается в команде.
Масштабирование индекса возможно только при 32-битной адресации.
Различия видов адресации для 16-и и 32-х разрядных режимах.
Компонент адреса |
«16» |
«32» |
Регистр базы |
ВХ или ВР |
любой РОН |
Регистр индекса |
SI или DI |
любой, кроме ESP. |
Масштаб (шаг) |
1 |
1/2/4/8 |
Смещение |
0/8/16 бит |
0/8/32 бит |
Использование сегментных регистров при обращении к памяти.
Тип обращения (назначение адреса) |
По умолчанию |
Альтернативный. (по префиксу) |
Выборка команд |
CS |
- |
Операции со стеком |
SS |
- |
Строка-приёмник |
ES |
- |
Обмен данными (регистр базы BP, SP, EBP, ESP) |
DS |
CS, ES, SS, FS, GS |
Прочие ссылки |
SS |
CS, DS, ES, FS, GS |
Таким образом при обращении к памяти имеется семь режимов адресации.
Хотя основных режимов два: прямая и косвенная (регистровая).
1. EA = D - прямая адресация. Имеет две разновидности: прямая, относительная (смещение относительно указателя команд IP – для передач управления) и прямая абсолютная.
2. EA = (B) - косвенная базовая адресация; где (В) – содержимое любого регистра, кроме SP/ESP или БР/ЕВР.
3. EA = (B) + D – косвенная базовая со смещением.
4. EA = (I)*S – косвенная индексная масштабированная адресация, где I – SI или DI, S – множитель, определяемый SIB.
5. EA = (I)*S + D – косвенная индексная масштабированная адресация со смещением.
6. EA = (B) + (I)*S - базово индексная масштабированная адресация.
7. EA = (B) + (I)*S + D - базово индексная масштабированная адресация со смещением.
Во всех случаях линейный адрес формируется с учётом значения сегмента.