Реклама:

Режимы адресации процессора Pentium 4 чрезвычайно нерегулярны и зависят от формата конкретной команды - 16- или 32-разрядная. Мы не будем рассматривать 16-разрядные команды, вполне достаточно 32-разрядных. Поддерживаемые режимы адресации включают непосредственную, прямую, регистровую, косвенную регистровую, индексную и специальную адресацию для обращения к элементам массива. Проблема заключается в том, что не все режимы применимы ко всем командам и не все регистры могут использоваться во всех режимах адресации. Это значительно усложняет задачу разработчика компилятора.

Как показано на рис. 5.10, для управления режимами адресации имеется соответствующий байт. Один из операндов определяется по комбинации полей MOD и R/M. Второй операнд всегда является регистром и определяется по значению поля REG. В табл. 5.7 приведен список 32 комбинаций значений 2-разрядного поля MOD и 3-разрядного поля R/M. Например, если оба поля равны 0, операнд считывается из ячейки памяти с адресом, который содержится в регистре ЕАХ.

Таблица 5.7. 32-разрядные режимы адресации процессора Pentium 4

(мм

- это слово в памяти с адресом х)

   

R/M

 

MOD

   
 

ООО

M [ЕАХ]

М[ЕАХ + смещение 8]

М[ЕАХ + смещение 32]

ЕАХ или AL

М[ЕСХ]

М[ЕСХ + смещение 8]

М[ЕСХ + смещение 32]

ЕСХ или CL

M[EDX]

M[EDX + смещение 8]

M[EDX + смещение 32]

EDX или DL

М[ЕВХ]

М[ЕВХ + смещение 8]

М[ЕВХ + смещение 32]

ЕВХ или BL

SIB

SIB со смещением 8

SIB со смещением 32

ESP или АН

Прямая адресация

М[ЕВР + смещение 8]

М[ЕВР + смещение 32]

ЕВР или СН

M[ESI]

M[ESI + смещение 8]

M[ESI + смещение 32]

ESI или DH

M[EDI]

M[EDI + смещение 8]

M[EDI + смещение 32]

EDI или ВН

Колонки 01 и 10 включают режимы адресации, при которых значение регистра прибавляется к 8- или 32-разрядному смещению, следующему за командой. Если выбрано 8-разрядное смещение, оно перед сложением получает 32-разрядное знаковое расширение. Например, команда ADD с полем R/M = 011, полем MOD = 01 и смещением, равным шести, вычисляет сумму регистра ЕВХ и 6, и в качестве одного из операндов считывает слово из полученного адреса памяти. Значение регистра ЕВХ не изменяется.

При MOD =11 предоставляется возможность выбора из двух регистров. Для команд со словами берется первый вариант, для команд с байтами - второй.

Отметим, что здесь не все регулярно. Например, нельзя выполнить косвенную адресацию через ЕВР или прибавить смещение к ESP.

Иногда вслед за байтом MODE следует дополнительный байт SIB (см. рис. 5.10). Байт SIB определяет масштабный коэффициент и два регистра. Когда присутствует байт SIB, адрес операнда вычисляется путем умножения индексного регистра на 1, 2, 4 или 8 (в зависимости от значения поля SCALE), прибавлением его к базовому регистру и, наконец, возможным прибавлением 8- или 32-разрядного смещения, в зависимости от значения поля MOD. Практически все регистры могут использоваться и в качестве индекса, и в качестве базы.

Режимы, получаемые посредством байта SIB, могут пригодиться для обращения к элементам массива. Рассмотрим следующую Java-команду:

for (i=0; i<n; i++) a[i]=0;

Здесь a - массив 4-байтных целых чисел, относящийся к текущей процедуре. Обычно регистр ЕВР используется для указания на базу стекового фрейма, который содержит локальные переменные и массивы, как показано на рис. 5.19. Компилятор должен хранить значение i в регистре ЕАХ. Для доступа к элементу a[i] он будет использовать режим с байтом SIB, в котором адрес операнда равен сумме значений 4 ЕАХ, ЕВР и 8. Эта операция может сохраняться в a[i] за одну команду.

Режимы адресации процессора Pentium 4

Рис. 5.19. Обращение к элементу массива а[\]

А стоит ли применять такой режим адресации? На этот вопрос трудно ответить. Без сомнения эта команда при надлежащем использовании позволяет сэкономить несколько циклов. Проблема здесь в том, что она занимает определенную область памяти микросхемы, которая могла бы пригодиться. Например, можно было бы сделать больше кэш-память первого уровня или уменьшить размер микросхемы, обеспечив возможность повышения тактовой частоты.

Мы представили несколько возможных компромиссов, с которыми постоянно сталкиваются разработчики. Обычно перед тем, как воплотить какую-либо идею в кремнии, выполняются многочисленные моделирующие прогоны, но для этого нужно иметь представление о том, как будет использоваться машина. Можно гарантировать, что разработчики машины 8088 тестировали ее без веб-браузера. Решения, принятые 20 лет назад, могут оказаться абсолютно неудачными с точки зрения современных приложений. В то же время, включив в машину какую-нибудь функцию, из-за требования обратной совместимости избавиться от нее будет уже невозможно.

Ортогональность кодов операций и режимов адресации || Оглавление || Режимы адресации процессора UltraSPARC III