Режим адресации

редактировать

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

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

Содержание
  • 1 Предостережения
  • 2 Количество режимов адресации
  • 3 Полезный побочный эффект
  • 4 Простые режимы адресации для кода
    • 4.1 Абсолютный или прямой
    • 4.2 Относительно ПК
    • 4.3 Регистр косвенного
  • 5 Режимы последовательной адресации
    • 5.1 Последовательное выполнение
      • 5.1.1 ЦП, которые не используют последовательное выполнение
    • 5.2 Условное выполнение
    • 5.3 Пропуск
  • 6 Простые режимы адресации для данных
    • 6.1 Регистр (или регистр прямой)
    • 6.2 Базовый плюс смещение и варианты
    • 6.3 Немедленное / буквальное
    • 6.4 Неявное
  • 7 Другие режимы адресации для кода или данных
    • 7.1 Абсолютный / прямой
    • 7.2 Абсолютный индекс
    • 7.3 Базовый плюс индекс
    • 7.4 Базовый плюс индекс плюс смещение
    • 7.5 Масштабируемый
    • 7.6 Косвенный регистр
    • 7.7 Регистр косвенного автоинкремента
    • 7.8 Регистр косвенного автоинкремента
    • 7.9 Непрямая память
    • 7.10 Относительно ПК
  • 8 Устаревшие режимы адресации
    • 8.1 Непрямая многоуровневая память
    • 8.2 Регистры с отображением памяти
    • 8.3 Косвенная память и автоинкремент
    • 8.4 Нулевая страница
    • 8.5 Прямая страница
    • 8.6 Масштабируемый индекс с проверкой границ
    • 8.7 Косвенно в битовое поле в слове
    • 8.8 Индекс следующей инструкции
  • 9 Глоссарий
  • 10 См. Также
  • 11 Ссылки
  • 12 Внешние ссылки
Предостережения

Обратите внимание на то, что не существует общепринятого способа наименования различных режимов адресации. В частности, разные авторы и производители компьютеров могут давать разные имена одному и тому же режиму адресации или одни и те же имена разным режимам адресации. Кроме того, режим адресации, который в одной данной архитектуре рассматривается как единственный режим адресации, может представлять функциональные возможности, которые в другой архитектуре охватываются двумя или более режимами адресации. Например, некоторые архитектуры компьютера со сложным набором команд (CISC), такие как Digital Equipment Corporation (DEC) VAX, обрабатывают регистры и буквальным или непосредственные константы как еще один режим адресации. Другие, такие как 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 и их преемники, имеют инструкцию загрузки эффективного адреса . Он выполняет вычисление эффективного адреса операнда, но вместо того, чтобы воздействовать на эту ячейку памяти, он загружает адрес, к которому был бы доступ, в регистр. Это может быть полезно при передаче адреса элемента массива в подпрограмму. Это также может быть немного хитрый способ выполнить больше вычислений, чем обычно, за одну инструкцию; например, использование такой инструкции с режимом адресации «основание + индекс + смещение» (подробно описано ниже) позволяет складывать два регистра и константу вместе в одной инструкции.

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

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

+ ---- + ------------------ ------------ + | прыжок | адрес | + ---- + ------------------------------ + (Действующий адрес ПК = адрес)

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

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

+ ---- + ----------------------------- - + | прыжок | смещение | относительный переход + ---- + ------------------------------ + (Действующий адрес ПК = адрес следующей инструкции + смещение, смещение может быть отрицательным)

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

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

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

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

Регистр косвенного

+ ------- + ----- + | jumpVia | рег | + ------- + ----- + (Действующий адрес ПК = содержимое регистра 'reg')

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

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

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

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

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

+ ------ + | nop | выполнить следующую инструкцию + ------ + (Действующий адрес ПК = адрес следующей инструкции)

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

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

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

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

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

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

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

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

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

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

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

Пропустить

+ ------ + ----- + ----- + | skipEQ | reg1 | reg2 | пропустить следующую инструкцию, если reg1 = reg2 + ------ + ----- + ----- + (Действующий адрес ПК = адрес следующей инструкции + 1)

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

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

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

Регистр (или Прямой регистр)

+ ------ + ----- + ----- + - ---- + | муль | reg1 | reg2 | reg3 | рег1: = рег2 * рег3; + ------ + ----- + ----- + ----- +

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

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

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

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

+ ------ + ----- + - ---- + ---------------- + | загрузка | рег | база | смещение | reg: = RAM [база + смещение] + ------ + ----- + ----- + ---------------- + (Действующий адрес = смещение + содержимое указанного базового регистра)

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

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

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

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

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

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

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

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

+ ------ + ----- + ----- + --------------- - + | добавить | reg1 | reg2 | постоянная | reg1: = reg2 + константа; + ------ + ----- + ----- + ---------------- +

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

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

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

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

Неявный

+ ----------------- + | бит очистки | + ----------------- + + ------------------- + | очистить аккумулятор | + ------------------- +

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

Фактический адрес источника (если есть) или получателя (а иногда и то и другое) подразумевается кодом операции.

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

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

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

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

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

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

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

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

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

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

+ ------ + ----- + -------- ------------------------------ + | загрузка | рег | адрес | + ------ + ----- + ------------------------------------ - + (Действующий адрес = адрес, указанный в инструкции)

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

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

Абсолютное индексирование

+ ------ + ----- + ----- + ---------------- ---------------- + | загрузка | рег | индекс | адрес | + ------ + ----- + ----- + ------------------------------ - + (Действующий адрес = адрес + содержимое указанного индексного регистра)

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

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

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

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

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

+ ------ + ----- + ----- + ----- + | загрузка | рег | база | индекс | + ------ + ----- + ----- + ----- + (Действующий адрес = содержимое указанного базового регистра + содержимое указанного индексного регистра)

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

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

+ ------ + ----- + ----- + ----- + ------- --------- + | загрузка | рег | база | индекс | смещение | + ------ + ----- + ----- + ----- + ---------------- + (Действующий адрес = смещение + содержимое указанного базового регистра + содержимое указанного индексного регистра)

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

Scaled

+ ------ + ----- + ----- + - ---- + | загрузка | рег | база | индекс | + ------ + ----- + ----- + ----- + (Действующий адрес = содержимое указанного базового регистра + масштабированное содержимое указанного индексного регистра)

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

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

Регистр косвенного

+ ------ + ------ + ----- + | загрузка | reg1 | база | + ------ + ------ + ----- + (Действующий адрес = содержимое базового регистра)

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

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

+ ------ + ----- + - ------ + | загрузка | рег | база | + ------ + ----- + ------- + (Действующий адрес = содержимое базового регистра)

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

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

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

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

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

+ ------ + ----- + ---- - + | загрузка | рег | база | + ------ + ----- + ----- + (Действующий адрес = новое содержимое базового регистра)

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

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

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

Непрямая адресация памяти

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

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

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

ПК-относительный

+ ------ + ------ + --------- + ---------- ------ + | загрузка | reg1 | база = ПК | смещение | + ------ + ------ + --------- + ---------------- + reg1: = RAM [ПК + смещение ] (Действующий адрес = ПК + смещение)

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

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

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

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

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

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

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

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

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

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

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

IBM 1620, Data General Nova, серия HP 2100 и NAR 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.

Index next command

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

Глоссарий
Косвенные
Данные, на которые имеется ссылка через указатель или адрес.
Немедленное
Данные, встроенные непосредственно в инструкцию или список команд.
Индекс
Динамическое смещение, обычно содержащееся в индексном регистре , возможно масштабируемое размером объекта.
Смещение
Немедленное значение, добавляемое к адресу; например, соответствующий доступу к полю структуры в языке программирования C.
Относительный
Адрес, сформированный относительно другого адреса.
Пост-инкремент
Пошаговый переход адреса в прошлые использованные данные, аналогично * p ++в языке программирования C, используется для операций выталкивания стека.
Предварительный декремент
Уменьшение адреса перед использованием, аналогично * - pв языке программирования C, используется для операций проталкивания стека.
См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-06-10 00:18:37
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте