Режим адресации - Addressing mode

Режимы адресации являются аспектом архитектуры набора команд в большинстве конструкций центральных процессоров (ЦП). Различные режимы адресации, которые определены в данной архитектуре набора команд, определяют, как инструкции машинного языка в этой архитектуре идентифицируют операнд (ы) каждой инструкции. Режим адресации определяет, как вычислить эффективный адрес памяти операнда, используя информацию, содержащуюся в регистрах, и / или константы, содержащиеся в машинной инструкции или где-либо еще.

В компьютерном программировании режимы адресации в первую очередь интересны тем, кто пишет на языках ассемблера, и разработчикам компиляторов . Для связанной концепции см. Набор ортогональных инструкций, который касается способности любой инструкции использовать любой режим адресации.

Предостережения

Обратите внимание, что не существует общепринятого способа наименования различных режимов адресации. В частности, разные авторы и производители компьютеров могут давать разные имена одному и тому же режиму адресации или одни и те же имена разным режимам адресации. Кроме того, режим адресации, который в одной данной архитектуре рассматривается как единственный режим адресации, может представлять функциональные возможности, которые в другой архитектуре охватываются двумя или более режимами адресации. Например, некоторые архитектуры компьютеров со сложным набором команд (CISC), такие как VAX от Digital Equipment Corporation (DEC) , рассматривают регистры и буквальные или непосредственные константы как просто еще один режим адресации. Другие, такие как IBM System / 360 и его преемники, а также конструкции компьютеров с сокращенным набором команд (RISC), кодируют эту информацию в инструкции. Таким образом, последние машины имеют три различных кода команд для копирования одного регистра в другой, копирования буквальной константы в регистр и копирования содержимого ячейки памяти в регистр, в то время как VAX имеет только одну команду «MOV».

Сам термин «режим адресации» может интерпретироваться по-разному: либо «режим вычисления адреса памяти», либо «режим доступа к операнду». Согласно первой интерпретации, инструкции, которые не читают из памяти или не записывают в память (такие как «добавить литерал в регистр»), считаются не имеющими «режима адресации». Вторая интерпретация допускает такие машины, как VAX, которые используют биты режима операнда, чтобы разрешить регистр или литеральный операнд. Только первая интерпретация применима к таким инструкциям, как «загрузить эффективный адрес».

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

Приведенные ниже инструкции являются чисто репрезентативными, чтобы проиллюстрировать режимы адресации, и не обязательно отражают мнемонику, используемую каким-либо конкретным компьютером.

Количество режимов адресации

Различные компьютерные архитектуры сильно различаются по количеству режимов адресации, которые они предоставляют в оборудовании. Есть некоторые преимущества в устранении сложных режимов адресации и использовании только одного или нескольких более простых режимов адресации, даже если для этого требуется несколько дополнительных инструкций и, возможно, дополнительный регистр. Оказалось, что гораздо проще разрабатывать конвейерные ЦП, если доступны только простые режимы адресации.

Большинство архитектур RISC имеют только около пяти простых режимов адресации, в то время как архитектуры CISC, такие как DEC VAX, имеют более десятка режимов адресации, некоторые из которых довольно сложны. В архитектуре IBM System / 360 было всего три режима адресации; еще несколько было добавлено для System / 390 .

Когда имеется только несколько режимов адресации, конкретный требуемый режим адресации обычно кодируется в коде инструкции (например, IBM System / 360 и его последователи, большинство RISC). Но когда существует много режимов адресации, в инструкции часто выделяется конкретное поле, чтобы указать режим адресации. DEC VAX позволял использовать несколько операндов в памяти почти для всех инструкций, поэтому зарезервировал первые несколько битов каждого спецификатора операнда, чтобы указать режим адресации для этого конкретного операнда. Хранение битов спецификатора режима адресации отдельно от битов операции кода операции создает ортогональный набор команд .

Даже на компьютере с множеством режимов адресации измерения реальных программ показывают, что перечисленные ниже простые режимы адресации составляют около 90% или более всех используемых режимов адресации. Поскольку большинство таких измерений основано на коде, сгенерированном компиляторами из языков высокого уровня, это в некоторой степени отражает ограничения используемых компиляторов.

Полезный побочный эффект

Некоторые архитектуры набора команд, такие как Intel x86 и IBM / 360 и их преемники, имеют инструкцию по эффективному адресу загрузки . Это выполняет вычисление эффективного адреса операнда, но вместо того, чтобы воздействовать на эту ячейку памяти, он загружает адрес, к которому был бы осуществлен доступ, в регистр. Это может быть полезно при передаче адреса элемента массива в подпрограмму. Это также может быть несколько хитрый способ выполнить больше вычислений, чем обычно, за одну инструкцию; например, использование такой инструкции с режимом адресации «основание + индекс + смещение» (подробно описанное ниже) позволяет складывать два регистра и константу вместе в одной инструкции.

Простые режимы адресации для кода

Абсолютный или прямой

   +----+------------------------------+
   |jump|           address            |
   +----+------------------------------+

   (Effective PC address = address)

Эффективный адрес для абсолютного адреса инструкции - это сам параметр адреса без изменений.

ПК-родственник

   +----+------------------------------+
   |jump|           offset             |    jump relative
   +----+------------------------------+

   (Effective PC address = next instruction address + offset, offset may be negative)

Эффективным адресом для адреса инструкции, относящегося к ПК, является параметр смещения, добавляемый к адресу следующей инструкции. Это смещение обычно подписывается, чтобы можно было ссылаться на код как до, так и после инструкции.

Это особенно полезно в связи с переходами, поскольку типичные переходы относятся к ближайшим инструкциям (на языке высокого уровня большинство операторов if или while достаточно короткие). Измерения реальных программ показывают, что смещение в 8 или 10 бит достаточно велико для примерно 90% условных переходов (примерно ± 128 или ± 512 байт).

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

Некоторые версии этого режима адресации могут быть условными, ссылаясь на два регистра («переход, если reg1 = reg2»), один регистр («переход, если reg1 = 0») или отсутствие регистров, неявно ссылаясь на некоторый ранее установленный бит в регистре состояния. . См. Также условное выполнение ниже.

Зарегистрировать косвенный

   +-------+-----+
   |jumpVia| reg |
   +-------+-----+

   (Effective PC address = contents of register 'reg')

Действующий адрес для косвенной инструкции Register - это адрес в указанном регистре. Например, (A7) для доступа к содержимому адресного регистра A7.

В результате управление передается инструкции, адрес которой находится в указанном регистре.

Многие машины RISC, а также CISC IBM System / 360 и последующие имеют инструкции вызова подпрограмм, которые помещают адрес возврата в адресный регистр - для возврата из этого вызова подпрограммы используется режим косвенной адресации.

Последовательные режимы адресации

Последовательное исполнение

   +------+
   | nop  |              execute the following instruction
   +------+

   (Effective PC address = next instruction address)

ЦП после выполнения последовательной инструкции немедленно выполняет следующую инструкцию.

Последовательное выполнение не считается режимом адресации на некоторых компьютерах.

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

Условные переходы загружают ПК одним из двух возможных результатов, в зависимости от условия - большинство архитектур ЦП используют какой-либо другой режим адресации для «взятой» ветви и последовательное выполнение для «невыполненной» ветви.

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

Каждый « базовый блок » таких последовательных инструкций демонстрирует как временную, так и пространственную локальность ссылки .

ЦП, которые не используют последовательное выполнение

Процессоры, не использующие последовательное выполнение с программным счетчиком, встречаются крайне редко. В некоторых процессорах каждая инструкция всегда указывает адрес следующей инструкции. Такие процессоры имеют указатель инструкции, который содержит указанный адрес; это не программный счетчик, потому что нет никаких условий для его увеличения. К таким процессорам относятся некоторые компьютеры с барабанной памятью, такие как IBM 650 , машина SECD и RTX 32P.

Другие вычислительные архитектуры идут намного дальше, пытаясь обойти узкое место фон Неймана, используя множество альтернатив программному счетчику .

Условное исполнение

Некоторые компьютерные архитектуры имеют условные инструкции (например, ARM , но больше не для всех инструкций в 64-битном режиме) или инструкции условной загрузки (например, x86), которые в некоторых случаях могут сделать условные переходы ненужными и избежать очистки конвейера инструкций . Такая инструкция, как «сравнение», используется для установки кода условия , а последующие инструкции включают проверку этого кода условия, чтобы увидеть, соблюдаются они или игнорируются.

Пропускать

   +------+-----+-----+
   |skipEQ| reg1| reg2|      skip the next instruction if reg1=reg2
   +------+-----+-----+

   (Effective PC address = next instruction address + 1)

Пропускную адресацию можно рассматривать как особый вид режима адресации относительно ПК с фиксированным смещением «+1». Как и относительная адресация ПК, некоторые ЦП имеют версии этого режима адресации, которые относятся только к одному регистру («пропустить, если reg1 = 0») или ни к одному регистру, неявно ссылаясь на некоторый ранее установленный бит в регистре состояния . У других процессоров есть версия, которая выбирает определенный бит в определенном байте для тестирования («пропустить, если бит 7 в reg12 равен 0»).

В отличие от всех других условных переходов, инструкции «пропустить» никогда не нужно очищать конвейер инструкций , хотя может потребоваться игнорирование следующей инструкции.

Простые режимы адресации для данных

Зарегистрируйтесь (или Зарегистрируйтесь напрямую)

   +------+-----+-----+-----+
   | mul  | reg1| reg2| reg3|      reg1 := reg2 * reg3;
   +------+-----+-----+-----+

Этот «режим адресации» не имеет действующего адреса и не считается режимом адресации на некоторых компьютерах.

В этом примере все операнды находятся в регистрах, а результат помещается в регистр.

База плюс смещение и вариации

Иногда это называют «основание плюс смещение».

   +------+-----+-----+----------------+
   | load | reg | base|     offset     |  reg := RAM[base + offset]
   +------+-----+-----+----------------+

   (Effective address = offset + contents of specified base register)

Смещения , как правило , подписанное 16-битное значение (хотя 80386 расширил его до 32 бит).

Если смещение равно нулю, это становится примером косвенной адресации регистров ; эффективный адрес - это просто значение в базовом регистре.

На многих RISC-машинах регистр 0 имеет нулевое значение. Если регистр 0 используется как базовый регистр, это становится примером абсолютной адресации . Однако доступна только небольшая часть памяти (64 килобайта , если смещение составляет 16 бит).

16-битное смещение может показаться очень маленьким по сравнению с размером текущей памяти компьютера (вот почему 80386 расширил его до 32-битного). Могло быть и хуже: мэйнфреймы IBM System / 360 имеют только беззнаковое 12-битное смещение. Однако применяется принцип локальности ссылок : в течение короткого промежутка времени большинство элементов данных, к которым программа хочет получить доступ, находятся довольно близко друг к другу.

Этот режим адресации тесно связан с режимом индексированной абсолютной адресации.

Пример 1. Внутри подпрограммы программиста будут интересовать в основном параметры и локальные переменные, которые редко превышают 64 КБ , для которых достаточно одного базового регистра ( указателя кадра ). Если эта процедура является методом класса на объектно-ориентированном языке, то необходим второй базовый регистр, который указывает на атрибуты текущего объекта ( this или self на некоторых языках высокого уровня).

Пример 2 : Если базовый регистр содержит адрес составного типа (запись или структура), смещение можно использовать для выбора поля из этой записи (размер большинства записей / структур меньше 32 КБ).

Немедленное / буквальное

   +------+-----+-----+----------------+
   | add  | reg1| reg2|    constant    |    reg1 := reg2 + constant;
   +------+-----+-----+----------------+

Этот «режим адресации» не имеет действующего адреса и не считается режимом адресации на некоторых компьютерах.

Константа может быть со знаком или без знака. Например, move.l #$FEEDABBA, D0чтобы сразу переместить шестнадцатеричное значение «FEEDABBA» в регистр D0.

Вместо использования операнда из памяти значение операнда хранится в самой инструкции. На машине DEC VAX размеры буквальных операндов могут составлять 6, 8, 16 или 32 бита.

Эндрю Таненбаум показал, что 98% всех констант в программе уместятся в 13 битах (см. Философию проектирования RISC ).

Скрытый

   +-----------------+
   | clear carry bit |
   +-----------------+

   +-------------------+
   | clear Accumulator |
   +-------------------+

Режим подразумеваемой адресации, также называемый режимом неявной адресации ( язык ассемблера x86 ), явно не указывает эффективный адрес ни для источника, ни для пункта назначения (а иногда и для обоих).

Код операции подразумевает либо источник (если есть), либо эффективный адрес назначения (а иногда и то и другое).

Подразумеваемая адресация была довольно распространена на старых компьютерах (до середины 1970-х годов). Такие компьютеры обычно имели только один регистр, в котором можно было выполнять арифметические операции, - аккумулятор. Такие аккумуляторные машины неявно ссылаются на этот аккумулятор почти в каждой инструкции. Например, операция <a: = b + c; > можно выполнить с помощью последовательности <load b; добавить c; хранить; > - назначение (аккумулятор) подразумевается в каждой инструкции «загрузить» и «добавить»; источник (аккумулятор) подразумевается в каждой инструкции "сохранения".

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

Среди инструкций x86 некоторые используют неявные регистры для одного из операндов или результатов (умножение, деление, подсчет условного перехода).

Многие компьютеры (например, x86 и AVR) имеют один специальный регистр, называемый указателем стека, который неявно увеличивается или уменьшается при выталкивании или извлечении данных из стека, а эффективный адрес источника или назначения является (неявно) адресом, хранящимся в этом указатель стека.

Многие 32-разрядные компьютеры (например, 68000, ARM или PowerPC) имеют более одного регистра, который можно использовать в качестве указателя стека, поэтому используйте режим адресации «автоинкремент регистров косвенно», чтобы указать, какой из этих регистров следует использовать, когда выталкивание или извлечение данных из стека.

Некоторые современные компьютерные архитектуры (например, IBM / 390 и Intel Pentium) содержат некоторые инструкции с неявными операндами для обеспечения обратной совместимости с более ранними разработками.

На многих компьютерах инструкции, которые меняют бит пользовательского / системного режима, бит разрешения прерывания и т. Д., Неявно определяют специальный регистр, в котором хранятся эти биты. Это упрощает оборудование, необходимое для перехвата этих инструкций, чтобы соответствовать требованиям виртуализации Попека и Голдберга - в такой системе логике перехвата не нужно смотреть ни на какой операнд (или на конечный эффективный адрес), а только на код операции. .

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

Другие режимы адресации для кода или данных

Абсолютный / прямой

   +------+-----+--------------------------------------+
   | load | reg |         address                      |
   +------+-----+--------------------------------------+

   (Effective address = address as given in instruction)

Это требует места в инструкции для довольно большого адреса. Он часто доступен на машинах CISC с инструкциями переменной длины, например x86 .

Некоторые машины RISC имеют специальную инструкцию Load Upper Literal, которая помещает 16- или 20-битную константу в верхнюю половину регистра. Затем его можно использовать в качестве базового регистра в режиме адресации «основание плюс смещение», которое обеспечивает 16 или 12 бит младшего разряда. Комбинация позволяет получить полный 32-битный адрес.

Индексированный абсолютный

   +------+-----+-----+--------------------------------+
   | load | reg |index|         address                |
   +------+-----+-----+--------------------------------+

   (Effective address = address + contents of specified index register)

Это также требует места в инструкции для довольно большого адреса. Адрес может быть началом массива или вектора, а индекс может выбирать конкретный требуемый элемент массива. Процессор может масштабировать индексный регистр, чтобы учесть размер каждого элемента массива .

Обратите внимание, что это более или менее то же самое, что и режим адресации «основание плюс смещение», за исключением того, что смещение в этом случае достаточно велико, чтобы адресовать любую ячейку памяти.

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

Пример 2 : Программист может определить несколько больших массивов как глобальные объекты или как переменные класса . Начало массива хранится в буквальном адресе (возможно, измененном во время загрузки программы перемещающимся загрузчиком ) инструкции, которая на него ссылается. Смещение - какой элемент массива использовать на этой итерации цикла - хранится в индексном регистре. Часто инструкции в цикле повторно используют один и тот же регистр для счетчика цикла и смещений нескольких массивов.

Базовый плюс индекс

   +------+-----+-----+-----+
   | load | reg | base|index|
   +------+-----+-----+-----+

   (Effective address = contents of specified base register + contents of specified index register)

Базовый регистр может содержать начальный адрес массива или вектора, а индекс может выбирать конкретный требуемый элемент массива. Процессор может масштабировать индексный регистр, чтобы учесть размер каждого элемента массива . Это можно использовать для доступа к элементам массива, переданного в качестве параметра.

База плюс индекс плюс смещение

   +------+-----+-----+-----+----------------+
   | load | reg | base|index|         offset |
   +------+-----+-----+-----+----------------+

   (Effective address = offset + contents of specified base register + contents of specified index register)

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

Масштабированный

   +------+-----+-----+-----+
   | load | reg | base|index|
   +------+-----+-----+-----+

   (Effective address = contents of specified base register + scaled contents of specified index register)

Базовый регистр может содержать начальный адрес массива или векторной структуры данных , а индекс может содержать смещение одного конкретного требуемого элемента массива.

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

Зарегистрировать косвенный

   +------+------+-----+
   | load | reg1 | base|
   +------+------+-----+
 
   (Effective address = contents of base register)

Некоторые компьютеры имеют это как отдельный режим адресации. Многие компьютеры просто используют смещение основания плюс смещение со значением смещения 0. Например, (A7)

Зарегистрируйте косвенный автоинкремент

   +------+-----+-------+
   | load | reg | base  |
   +------+-----+-------+

   (Effective address = contents of base register)

После определения эффективного адреса значение в базовом регистре увеличивается на размер элемента данных, к которому необходимо получить доступ. Например, (A7) + получит доступ к содержимому адресного регистра A7, а затем увеличит адресный указатель A7 на 1 (обычно на 1 слово). Внутри цикла этот режим адресации можно использовать для пошагового перебора всех элементов массива или вектора.

В языках высокого уровня часто считается хорошей идеей, что функции, возвращающие результат, не должны иметь побочных эффектов (отсутствие побочных эффектов значительно упрощает понимание и проверку программы). Этот режим адресации имеет побочный эффект в том, что изменяется базовый регистр. Если последующий доступ к памяти вызывает ошибку (например, отказ страницы, ошибка шины, ошибка адреса), ведущую к прерыванию, то перезапуск инструкции становится гораздо более проблематичным, поскольку один или несколько регистров, возможно, потребуется вернуть в состояние, в котором они находились раньше. инструкция изначально запустилась.

Было по крайней мере две компьютерные архитектуры, которые имели проблемы с реализацией в отношении восстановления после прерываний при использовании этого режима адресации:

  • Motorola 68000 (адрес представлен в 24 бита). Может иметь один или два операнда регистра автоинкремента. 68010 + решить проблему путем сохранения внутреннего состояния процессора на шины или адреса ошибок.
  • DEC VAX. Может иметь до 6 операндов регистра автоинкремента. Каждый доступ к операнду может вызвать две ошибки страницы (если операнды перекрывают границу страницы). Конечно, сама инструкция может иметь длину более 50 байт и может выходить за границы страницы!

Зарегистрируйте косвенный автодекремент

   +------+-----+-----+
   | load | reg | base|
   +------+-----+-----+

   (Effective address = new contents of base register)

Перед определением эффективного адреса значение в базовом регистре уменьшается на размер элемента данных, к которому необходимо получить доступ.

Внутри цикла этот режим адресации можно использовать для перехода назад по всем элементам массива или вектора. Стек может быть реализован с использованием этого режима в сочетании с предыдущим режимом адресации (автоинкремент).

См. Обсуждение побочных эффектов в режиме адресации с автоинкрементом .

Непрямая память

Любой из режимов адресации, упомянутых в этой статье, может иметь дополнительный бит для обозначения косвенной адресации, т. Е. Адрес, вычисленный с использованием какого-либо режима, на самом деле является адресом местоположения (обычно полным словом ), которое содержит фактический эффективный адрес.

Косвенная адресация может использоваться для кода или данных. Это может значительно упростить реализацию указателей , ссылок или дескрипторов , а также может упростить вызов подпрограмм, которые иначе не адресуются. Косвенная адресация действительно снижает производительность из-за дополнительного доступа к памяти.

Некоторые ранние миникомпьютеры (например, DEC PDP-8 , Data General Nova ) имели только несколько регистров и ограниченный диапазон адресации (8 бит). Следовательно, использование косвенной адресации памяти было почти единственным способом обращения к любому значительному объему памяти.

ПК-родственник

   +------+------+---------+----------------+
   | load | reg1 | base=PC |     offset     |
   +------+------+---------+----------------+

   reg1 := RAM[PC + offset]
   (Effective address = PC + offset)

Режим адресации относительно ПК может использоваться для загрузки в регистр значения, хранящегося в памяти программ, на небольшом расстоянии от текущей инструкции. Его можно рассматривать как частный случай режима адресации «основание плюс смещение», когда в качестве «базового регистра» выбирается программный счетчик (ПК).

Есть несколько процессоров, которые поддерживают ссылки на данные, относящиеся к ПК. К таким процессорам относятся:

MOS 6502 и его производные , используемые относительной адресации для всех команд ветвления . Только эти инструкции использовали этот режим, прыжки использовали множество других режимов адресации.

Архитектура x86-64 и 64-разрядная архитектура ARMv8-A имеют режимы адресации относительно ПК, называемые «относительной RIP» в x86-64 и «буквальной» в ARMv8-A. Motorola 6809 также поддерживает режим адресации PC-относительна.

Архитектура PDP-11, архитектура VAX и 32-разрядные архитектуры ARM поддерживают адресацию относительно ПК, имея ПК в регистровом файле.

IBM г / Архитектура включает в себя конкретные инструкции, например, нагрузки Относительный длинный, с PC-относительной адресации , если General-инструкции-Extension Facility активен.

Когда используется этот режим адресации, компилятор обычно помещает константы в литеральный пул непосредственно перед или сразу после подпрограммы, которая их использует, чтобы предотвратить случайное выполнение этих констант в качестве инструкций.

Этот режим адресации, который всегда извлекает данные из памяти или сохраняет данные в памяти, а затем последовательно переходит к выполнению следующей инструкции (эффективный адрес указывает на данные), не следует путать с «относительной ветвью ПК», которая не извлекает данные. из или сохранить данные в памяти, но вместо этого выполняет переход к какой-либо другой инструкции по заданному смещению (эффективный адрес указывает на исполняемую инструкцию).

Устаревшие режимы адресации

Перечисленные здесь режимы адресации использовались в период 1950–1980 годов, но больше не доступны на большинстве современных компьютеров. Этот список далеко не полный; время от времени использовалось много других интересных и своеобразных режимов адресации, например, «абсолютное минус логическое ИЛИ» двух или трех индексных регистров.

Многоуровневая косвенная память

Если размер слова больше, чем адрес, тогда слово, на которое ссылаются для косвенной адресации памяти, само может иметь косвенный флаг, установленный для указания другого косвенного цикла памяти. Этот флаг называется битом косвенного обращения , а результирующий указатель является тегированным указателем , причем бит косвенного обращения указывает, является ли он прямым указателем или косвенным указателем. Необходимо следить за тем, чтобы цепочка косвенных адресов не ссылалась на себя; если это так, можно получить бесконечный цикл при попытке разрешить адрес.

IBM 1620 , то данные Общий Нова , на HP 2100 серии, а НАРЫ 2 имеют памяти , такие многоуровневых косвенные, и могут ввести такой бесконечный цикл вычисления адреса. Режим косвенной адресации памяти в Nova повлиял на изобретение косвенного многопоточного кода .

Компьютер DEC PDP-10 с 18-битными адресами и 36-битными словами допускал многоуровневую косвенную адресацию с возможностью использования индексного регистра на каждом этапе. Перед декодированием каждого адресного слова опрашивалась система приоритетных прерываний. Таким образом, косвенный адресный цикл не будет препятствовать выполнению процедур обслуживания устройства, включая любой обработчик истечения срока действия временного кванта планировщика с вытесняющей многозадачностью . Инструкция цикла будет рассматриваться как любое другое задание, связанное с вычислением.

Регистры с отображением в память

На некоторых компьютерах регистры считались занимающими первые 8 или 16 слов памяти (например, ICL 1900 , DEC PDP-10). Это означало, что не было необходимости в отдельной инструкции «добавить регистр в регистр» - можно было просто использовать команду «добавить память в регистр».

В случае ранних моделей PDP-10, у которых не было кэш-памяти, жесткий внутренний цикл, загруженный в первые несколько слов памяти (где быстрые регистры были адресуемыми, если они были установлены), выполнялся намного быстрее, чем это было бы в память на магнитном сердечнике.

Более поздние модели серии DEC PDP-11 отображали регистры на адреса в области ввода / вывода, но это было в первую очередь предназначено для удаленной диагностики. Как ни странно, 16-битные регистры были отображены на последовательные 8-битные байтовые адреса.

Косвенная память и автоинкремент

Миникомпьютер DEC PDP-8 имел восемь специальных мест (по адресам с 8 по 15). При доступе через косвенную адресацию памяти эти ячейки будут автоматически увеличиваться после использования. Это позволило легко перемещаться по памяти в цикле без необходимости использовать какие-либо регистры для обработки шагов.

Миникомпьютер Data General Nova имел 16 специальных ячеек памяти с адресами с 16 по 31. При доступе через косвенную адресацию памяти значения с 16 по 23 автоматически увеличивались перед использованием, а с 24 по 31 автоматически уменьшались перед использованием.

Нулевая страница

Процессоры семейства Data General Nova , Motorola 6800 и MOS Technology 6502 имели очень мало внутренних регистров. Арифметические и логические инструкции в основном выполнялись со значениями в памяти, а не во внутренних регистрах. В результате для многих инструкций требовалось двухбайтовое (16-битное) расположение в памяти. Учитывая, что коды операций на этих процессорах имели длину всего один байт (8 бит), адреса памяти могли составлять значительную часть размера кода.

Разработчики этих процессоров предусмотрели частичное средство, известное как адресация «нулевой страницы». К начальным 256 байтам памяти ($ 0000 - $ 00FF; также известной как страница "0") можно было получить доступ, используя однобайтовый абсолютный или индексированный адрес памяти. Это сократило время выполнения инструкции на один такт и длину инструкции на один байт. Хранение часто используемых данных в этом регионе позволяет делать программы меньше и быстрее.

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

Прямая страница

Режим адреса нулевой страницы был улучшен в нескольких поздних моделях 8-битных процессоров, включая WDC 65816 , CSG 65CE02 и Motorola 6809 . В новом режиме, известном как «прямая страничная» адресация, добавлена ​​возможность перемещать 256-байтовое окно памяти нулевой страницы из начала памяти (адрес смещения $ 0000) в новое место в пределах первых 64 КБ памяти.

CSG 65CE02 позволял переместить прямую страницу на любую 256-байтовую границу в пределах первых 64 КБ памяти, сохраняя 8-битное значение смещения в регистре новой базовой страницы (B). Motorola 6809 может сделать то же самое со своим регистром прямой страницы (DP). WDC 65816 пошел дальше и позволил переместить прямую страницу в любое место в пределах первых 64 КБ памяти, сохранив 16-битное значение смещения в новом прямом (D) регистре.

В результате большее количество программ могло использовать расширенный режим прямой адресации страниц по сравнению с устаревшими процессорами, которые включали только режим адресации нулевой страницы.

Масштабированный индекс с проверкой границ

Это похоже на адресацию масштабированного индекса, за исключением того, что инструкция имеет два дополнительных операнда (обычно константы), и оборудование проверяет, находится ли значение индекса между этими границами.

Другой вариант использует векторные дескрипторы для хранения границ; это упрощает реализацию динамически выделяемых массивов и при этом сохраняет полную проверку границ.

Косвенно в битовое поле в слове

Некоторые компьютеры имели специальные режимы косвенной адресации для подполей внутри слов.

GE / Honeywell серии 600 символов адресации косвенное слово , указанное либо 6-битные или 9-битовых полей символов в пределах его 36-битового слова.

DEC PDP-10 , также 36-битный, имел специальные инструкции, которые позволяли обрабатывать память как последовательность битовых полей фиксированного размера или байтов любого размера от 1 до 36 бит. Дескриптор последовательности из одного слова в памяти, называемый «байтовым указателем», содержал текущий адрес слова в последовательности, позицию бита в слове и размер каждого байта.

Существовали инструкции для загрузки и сохранения байтов через этот дескриптор, а также для увеличения дескриптора, чтобы он указывал на следующий байт (байты не разделялись по границам слова). Многие программы DEC использовали пять 7-битных байтов на слово (простые символы ASCII), при этом один бит на слово не использовался. Реализации C должны были использовать четыре 9-битных байта на слово, поскольку функция 'malloc' в C предполагает, что размер int в несколько раз больше размера char ; фактическое кратное значение определяется системно-зависимым оператором времени компиляции sizeof .

Индексировать следующую инструкцию

Elliott 503 , то Elliott 803 , и Apollo Guidance Computer используется только абсолютной адресации, и не было никаких индексных регистров. Таким образом, косвенные переходы или переходы по регистрам не поддерживаются в наборе команд. Вместо этого можно было бы проинструктировать добавить содержимое текущего слова памяти к следующей инструкции . Добавление небольшого значения к следующей инструкции, которая должна быть выполнена, может, например, изменить a JUMP 0на a JUMP 20, таким образом создавая эффект индексированного перехода. Обратите внимание, что инструкция модифицируется на лету и остается неизменной в памяти, то есть это не самомодифицирующийся код . Если значение, добавляемое к следующей инструкции, было достаточно большим, она могла изменить код операции этой инструкции, а также адрес или вместо него.

Глоссарий

Косвенный
Данные, на которые имеется ссылка через указатель или адрес .
Немедленный
Данные, встроенные непосредственно в инструкцию или список команд.
Показатель
Динамическое смещение, обычно хранящееся в индексном регистре , возможно, масштабируемое размером объекта.
Компенсировать
Немедленное добавление стоимости к адресу; например, соответствующий доступ Структура поля в языке программирования Си .
Родственник
Адрес сформирован относительно другого адреса.
Прирост публикации
Степпинг адреса прошлых данных используется, аналогично *p++в языке программирования , используемый для стека поп - операций.
Предварительный декремент
Декрементирование из адреса перед использованием, аналогично *--pв языке программирования , используемое для стека кнопочных операций.

Смотрите также

использованная литература

внешние ссылки