Режим адресации
Эта статья нуждается в дополнительных цитатах для проверки . ( май 2009 г. ) |
Режимы адресации являются аспектом архитектуры набора команд в большинстве конструкций центрального процессора (ЦП). Различные режимы адресации, определенные в конкретной архитектуре набора команд, определяют, как машинного языка инструкции в этой архитектуре идентифицируют операнд (ы) каждой инструкции. Режим адресации определяет, как вычислить эффективный адрес операнда в памяти, используя информацию, хранящуюся в регистрах и/или константах, содержащихся в машинной инструкции или где-либо еще.
В компьютерном программировании режимы адресации в первую очередь представляют интерес для тех, кто пишет на ассемблере , и для разработчиков компиляторов . Соответствующую концепцию см. в разделе «Ортогональный набор команд» , который касается способности любой инструкции использовать любой режим адресации.
Предостережения
[ редактировать ]Общепринятых названий режимов адресации не существует: разные авторы и производители компьютеров могут давать разные названия одному и тому же режиму адресации или одни и те же названия разным режимам адресации. Более того, режим адресации, который в одной данной архитектуре рассматривается как единый режим адресации, может представлять функциональность, которая в другой архитектуре покрывается двумя или более режимами адресации. Например, некоторые архитектуры компьютеров со сложным набором команд (CISC), такие как Digital Equipment Corporation (DEC) VAX , рассматривают регистры и литеральные или непосредственные константы как еще один режим адресации. Другие, такие как IBM System/360 и ее преемники, а также большинство конструкций компьютеров с сокращенным набором команд (RISC), кодируют эту информацию внутри инструкции. Таким образом, последние машины имеют три различных кода инструкций для копирования одного регистра в другой, копирования константы в регистр и копирования содержимого ячейки памяти в регистр, в то время как VAX имеет только одну инструкцию «MOV».
Сам термин «режим адресации» может интерпретироваться по-разному: либо «режим вычисления адреса памяти», либо «режим доступа к операнду». Согласно первой интерпретации, инструкции, которые не читают из памяти и не записывают в память (например, «добавить литерал в регистр»), считаются не имеющими «режима адресации». Вторая интерпретация позволяет использовать такие машины, как VAX, которые используют биты режима операнда для регистрации регистра или литерального операнда. Только первая интерпретация применима к таким инструкциям, как «загрузка эффективного адреса», которая загружает адрес операнда, а не сам операнд.
Перечисленные ниже режимы адресации делятся на кодовую адресацию и адресацию данных. Большинство компьютерных архитектур сохраняют это различие, но существуют (или существовали) некоторые архитектуры, которые позволяют использовать (почти) все режимы адресации в любом контексте.
Инструкции, показанные ниже, являются чисто репрезентативными и служат для иллюстрации режимов адресации и не обязательно отражают мнемонику, используемую каким-либо конкретным компьютером.
Некоторые компьютеры, например IBM 709 , RCA 3301, [ 1 ] не имеют единого поля режима адреса, а имеют отдельные поля для косвенной адресации и индексации.
Количество режимов адресации
[ редактировать ]Архитектуры компьютеров сильно различаются по количеству режимов адресации, которые они обеспечивают аппаратно. Есть некоторые преимущества в исключении сложных режимов адресации и использовании только одного или нескольких более простых режимов адресации, хотя для этого требуется несколько дополнительных инструкций и, возможно, дополнительный регистр. [ 2 ] [ 3 ] Это доказало [ 4 ] [ 5 ] [ 6 ] Гораздо проще проектировать конвейерные процессоры, если доступны только простые режимы адресации.
Большинство RISC-архитектур имеют всего около пяти простых режимов адресации, в то время как CISC-архитектуры, такие как DEC VAX, имеют более дюжины режимов адресации, некоторые из которых довольно сложны. Архитектура IBM System/360 имеет только четыре режима адресации; еще несколько были добавлены для архитектуры ESA/390 .
Когда существует всего несколько режимов адресации, конкретный требуемый режим адресации обычно кодируется в коде инструкции. (например, IBM System/360 и его преемники, большинство RISC). Но когда существует множество режимов адресации, в инструкции часто выделяется специальное поле для указания режима адресации. DEC VAX допускал использование нескольких операндов памяти почти для всех инструкций и поэтому зарезервировал первые несколько битов каждого спецификатора операнда для указания режима адресации для этого конкретного операнда. Сохранение битов спецификатора режима адресации отдельно от битов операции кода операции создает ортогональный набор команд .
Даже на компьютере с множеством режимов адресации измерения реальных программ [ 7 ] указывают, что простые режимы адресации, перечисленные ниже, составляют около 90% или более всех используемых режимов адресации. Поскольку большинство таких измерений основано на коде, сгенерированном компиляторами из языков высокого уровня, это в некоторой степени отражает ограничения используемых компиляторов. [ 8 ] [ 7 ] [ 9 ]
Важный вариант использования
[ редактировать ]Некоторые архитектуры набора команд, такие как Intel x86 и IBM/360 и его преемники, имеют адресную инструкцию с эффективной нагрузкой . [ 10 ] [ 11 ] При этом вычисляется эффективный адрес операнда и загружается в регистр без доступа к памяти, к которой он относится. Это может быть полезно при передаче адреса элемента массива в подпрограмму. Это также может быть разумным способом выполнения большего количества вычислений, чем обычно, за одну инструкцию; например, использование такой инструкции с режимом адресации «база+индекс+смещение» (подробно описано ниже) позволяет сложить два регистра и константу вместе в одной инструкции и сохранить результат в третьем регистре.
Простые режимы адресации кода
[ редактировать ]Ниже показаны некоторые простые режимы адресации кода. Номенклатура может различаться в зависимости от платформы.
Абсолютный или прямой
[ редактировать ]+----+------------------------------+ |jump| address | +----+------------------------------+ (Effective PC address = address)
Эффективным адресом для абсолютного адреса команды является сам параметр адреса без каких-либо изменений.
относительно ПК
[ редактировать ]+----+------------------------------+ |jump| offset | jump relative +----+------------------------------+ (Effective PC address = next instruction address + offset, offset may be negative)
Эффективный адрес для адреса инструкции относительно ПК — это параметр смещения, добавляемый к адресу следующей инструкции. Это смещение обычно подписывается, чтобы разрешить ссылку на код как до, так и после инструкции. [ 12 ]
Это особенно полезно в связи с инструкциями перехода , поскольку типичные переходы происходят к соседним инструкциям (на языке высокого уровня большинство операторов if или while достаточно короткие). Измерения реальных программ показывают, что 8- или 10-битное смещение достаточно велико для примерно 90% условных переходов (примерно ±128 или ±512 байт). [ 13 ] Для переходов к инструкциям, которых нет рядом, используются другие режимы адресации.
Еще одним преимуществом адресации относительно ПК является то, что код может быть независимым от позиции , то есть его можно загрузить в любое место памяти без необходимости корректировки каких-либо адресов.
Регистрация косвенная
[ редактировать ]+-------+-----+ |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 , Librascope LGP-30 и RTX 32P. [ 14 ]
Другие вычислительные архитектуры идут гораздо дальше, пытаясь обойти узкое место фон Неймана, используя множество альтернатив программному счетчику .
Условное исполнение
[ редактировать ]В некоторых компьютерных архитектурах есть условные инструкции (например, ARM , но уже не для всех инструкций в 64-битном режиме) или инструкции условной загрузки (например, x86), которые в некоторых случаях могут сделать условные переходы ненужными и избежать очистки конвейера команд . Такая инструкция, как «сравнить», используется для установки кода условия , а последующие инструкции включают проверку этого кода условия, чтобы увидеть, соблюдаются ли они или игнорируются.
Пропускать
[ редактировать ]+------+-----+-----+ |skipEQ| reg1| reg2| skip the next instruction if reg1=reg2 +------+-----+-----+ (Effective PC address = next instruction address + 1)
Пропускную адресацию можно рассматривать как особый вид режима адресации относительно ПК с фиксированным смещением «+1». Как и адресация относительно ПК, некоторые процессоры имеют версии этого режима адресации, которые относятся только к одному регистру («пропустить, если reg1=0») или ни к одному из регистров, неявно ссылаясь на некоторый ранее установленный бит в регистре состояния . У других процессоров есть версия, которая выбирает для проверки определенный бит в определенном байте («пропустить, если бит 7 в регистре 12 равен 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; добавить С; хранить а; > -- пункт назначения (аккумулятор) подразумевается в каждой инструкции «загрузка» и «добавление»; источник (аккумулятор) подразумевается в каждой инструкции «сохранения».
Более поздние компьютеры обычно имели более одного регистра общего назначения или ячейки ОЗУ, которые могли быть источником или местом назначения, или и тем, и другим для арифметических операций, поэтому более поздним компьютерам требовался какой-то другой режим адресации для указания источника и назначения арифметических действий.
Среди инструкций 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+ решил проблему , сохранив внутреннее состояние процессора при ошибках шины или адреса.
- ДЕКАБРЬ ВАКС. Может иметь до 6 операндов автоинкрементного регистра. Доступ к каждому операнду может вызвать две ошибки страницы (если операнды выходят за границу страницы). Конечно, сама инструкция может иметь длину более 50 байт и может выходить за границу страницы!
Зарегистрировать косвенное автодекрементирование
[ редактировать ]+------+-----+-----+ | load | reg | base| +------+-----+-----+ (Effective address = new contents of base register)
Перед определением эффективного адреса значение в базовом регистре уменьшается на размер элемента данных, к которому осуществляется доступ.
Внутри цикла этот режим адресации можно использовать для обхода всех элементов массива или вектора назад. Стек можно реализовать, используя этот режим в сочетании с предыдущим режимом адресации (автоинкремент).
См. обсуждение побочных эффектов в режиме автоинкрементной адресации .
Память непрямая или отложенная
[ редактировать ]Любой из режимов адресации, упомянутых в этой статье, может иметь дополнительный бит для обозначения косвенной адресации, т. е. адрес, рассчитанный с использованием некоторого режима, на самом деле является адресом местоположения (обычно полное слово ), которое содержит фактический эффективный адрес.
Косвенная адресация может использоваться для кода или данных. Это может значительно упростить реализацию указателей , ссылок или дескрипторов , а также упростить вызов подпрограмм, которые иначе не адресуются. Косвенная адресация действительно снижает производительность из-за необходимости дополнительного доступа к памяти.
Некоторые ранние миникомпьютеры (например, DEC PDP-8 , Data General Nova ) имели всего несколько регистров и лишь ограниченный диапазон прямой адресации (8 бит). Следовательно, использование косвенной адресации памяти было почти единственным способом обращения к сколько-нибудь значительному объему памяти.
Половина из восьми режимов адресации DEC PDP-11 отложена. Регистр отложенного @Rn аналогичен косвенному регистру, как определено выше. Режимы предварительной отсрочки @-(Rn), постинкрементной отложенной @(Rn)+ и индексированной отложенной @nn(Rn) указывают на адреса в памяти, которые считываются для нахождения адреса параметра. Режимы отсрочки PDP-11 в сочетании со счетчиком программ обеспечивают режимы абсолютной и относительной адресации ПК.
относительно ПК
[ редактировать ]+------+------+---------+----------------+ | load | reg1 | base=PC | offset | +------+------+---------+----------------+ reg1 := RAM[PC + offset] (Effective address = PC + offset)
Режим адресации относительно ПК можно использовать для загрузки в регистр значения, хранящегося в памяти программы, на небольшом расстоянии от текущей инструкции. Его можно рассматривать как частный случай режима адресации «база плюс смещение», при котором программный счетчик (ПК) выбирается в качестве «базового регистра».
Есть несколько процессоров, которые поддерживают ссылки на данные, относящиеся к ПК. К таким процессорам относятся:
Архитектура x86-64 и 64-битная ARMv8-A. архитектура [ 15 ] имеют режимы адресации относительно ПК, называемые «RIP-относительными» в x86-64 и «литеральными» в ARMv8-A. Motorola 6809 также поддерживает режим адресации относительно ПК.
Архитектура PDP-11 , архитектура VAX и 32-битная архитектура ARM поддерживают адресацию относительно ПК за счет указания ПК в файле регистров.
IBM включает в себя специальные инструкции, например, Load Relative Long, с адресацией относительно ПК , z/Architecture если активна функция расширения общих инструкций.
При использовании этого режима адресации компилятор обычно помещает константы в пул литералов непосредственно перед или сразу после подпрограммы, которая их использует, чтобы предотвратить случайное выполнение этих констант в качестве инструкций.
Этот режим адресации, который всегда извлекает данные из памяти или сохраняет данные в памяти, а затем последовательно проваливается для выполнения следующей инструкции (эффективный адрес указывает на данные), не следует путать с «ветвью относительно ПК», которая не извлекает данные. из памяти или сохранения данных в памяти, но вместо этого переходит к какой-либо другой инструкции по заданному смещению (эффективный адрес указывает на исполняемую инструкцию).
Устаревшие режимы адресации
[ редактировать ]Перечисленные здесь режимы адресации использовались в период 1950–1980 годов, но больше не доступны на большинстве современных компьютеров. Этот список ни в коем случае не является полным; время от времени использовалось много других интересных и своеобразных режимов адресации, например, абсолютное минус логическое ИЛИ для двух или трех индексных регистров. [ 16 ] [ 17 ]
Многоуровневая косвенная память
[ редактировать ]Если размер слова больше адреса, то слово, на которое ссылаются для косвенной адресации памяти, само может иметь установленный косвенный флаг, указывающий на другой косвенный цикл памяти. Этот флаг называется битом косвенности , а результирующий указатель является помеченным указателем , бит косвенности отмечает, является ли это прямым указателем или косвенным указателем. Необходимо следить за тем, чтобы цепочка косвенных адресов не ссылалась сама на себя; если это так, можно получить бесконечный цикл при попытке разрешить адрес.
IBM 1620 , Data General Nova , серия HP 2100 и NAR 2 имеют такую многоуровневую косвенную память и могут войти в такой бесконечный цикл вычисления адреса. Режим непрямой адресации памяти на Nova повлиял на изобретение косвенного многопоточного кода .
Компьютер DEC PDP-10 с 18-битными адресами и 36-битными словами допускал многоуровневую косвенную адресацию с возможностью использования индексного регистра на каждом этапе. Система приоритетных прерываний запрашивалась перед декодированием каждого адресного слова. [ 18 ] Таким образом, цикл косвенного адреса не помешает выполнению процедур обслуживания устройства, включая вытесняющей многозадачности обработчик истечения интервала времени любого планировщика . Инструкция цикла будет рассматриваться как любое другое задание, связанное с вычислениями.
Регистры, отображаемые в памяти
[ редактировать ]На некоторых компьютерах были адреса, которые относились к регистрам, а не к первичному хранилищу или к первичной памяти, используемой для реализации этих регистров. Хотя на некоторых ранних компьютерах адреса регистров находились в верхней части диапазона адресов, например IBM 650 , [ 19 ] [ а ] ИБМ 7070 , [ 20 ] [ с ] тенденция заключалась в том, чтобы использовать только адрес регистра на нижнем уровне и использовать только первые 8 или 16 слов памяти (например, ICL 1900 , DEC PDP-10). Это означало, что не было необходимости в отдельной инструкции «добавить регистр для регистрации» — можно было просто использовать инструкцию «добавить память для регистрации».
В случае ранних моделей PDP-10, которые не имели кэш-памяти, жесткий внутренний цикл, загружаемый в первые несколько слов памяти (где быстрые регистры были адресуемы, если они были установлены), работал намного быстрее, чем это было бы в память на магнитном сердечнике.
Более поздние модели серии DEC PDP-11 сопоставляли регистры с адресами в области ввода/вывода, но это было в первую очередь предназначено для обеспечения удаленной диагностики. Как ни странно, 16-битные регистры были сопоставлены с последовательными 8-битными байтовыми адресами.
Косвенная память и автоинкремент
[ редактировать ]Миникомпьютер DEC PDP-8 имел восемь специальных мест (по адресам с 8 по 15). При доступе через косвенную адресацию памяти эти ячейки автоматически увеличиваются перед использованием. [ 21 ] Это позволило легко перемещаться по памяти в цикле без необходимости использования аккумулятора для увеличения адреса.
Миникомпьютер Data General Nova имел 16 специальных ячеек памяти по адресам с 16 по 31. [ 22 ] При доступе через косвенную адресацию памяти значения с 16 по 23 автоматически увеличиваются перед использованием, а значения с 24 по 31 автоматически уменьшаются перед использованием.
Нулевая страница
[ редактировать ]MOS Technology 6502 имели очень мало Процессоры Data General Nova, семейства Motorola 6800 и семейства внутренних регистров. Арифметические и логические инструкции в основном выполнялись со значениями в памяти, а не с внутренними регистрами. В результате для многих инструкций требовалось двухбайтовое (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 ; [ 23 ] фактическое кратное определяется системно-зависимым оператором sizeof времени компиляции .
Индексировать следующую инструкцию
[ редактировать ]Эллиотт 503 , [ 24 ] Эллиотт 803 , [ 24 ] [ 25 ] а управляющий компьютер Apollo использовал только абсолютную адресацию и не имел индексных регистров.
Таким образом, набор команд не поддерживал непрямые переходы или переходы через регистры. Вместо этого ему может быть дано указание добавить содержимое текущего слова памяти к следующей инструкции . Добавление небольшого значения к следующей выполняемой инструкции может, например, изменить JUMP 0
в JUMP 20
, создавая тем самым эффект индексированного прыжка. Обратите внимание, что инструкция модифицируется «на лету» и остается неизменной в памяти, т. е. это не самомодифицирующийся код . Если значение, добавляемое к следующей инструкции, было достаточно большим, оно могло бы изменить код операции этой инструкции, а также или вместо адреса.
Глоссарий
[ редактировать ]- Косвенный
- Данные, на которые ссылаются через указатель или адрес .
- Немедленный
- Данные, встроенные непосредственно в список инструкций или команд.
- Индекс
- Динамическое смещение, обычно хранящееся в индексном регистре , возможно, масштабируемое по размеру объекта.
- Компенсировать
- Немедленное добавление стоимости к адресу; например, соответствующий доступу к полю структуры в языке программирования C.
- Родственник
- Адрес формируется относительно другого адреса.
- Приращение публикации
- Шаг адреса после используемых данных, аналогично
*p++
на языке программирования C , используемый для извлечения стека . операций - Предварительное уменьшение
- Уменьшение адреса перед использованием, аналогично
*--p
на языке программирования C , используемом для добавления в стек . операций
См. также
[ редактировать ]Примечания
[ редактировать ]- ^ Конденсаторные накопители на 650:
- 8000 Консольные переключатели
- 8001 Дистрибьютор
- 8002 Нижний аккумулятор
- 8003 Верхний гидроаккумулятор
- ^ Jump up to: а б Действует только с консоли
- ^ Для 5К или 10К 7070
Ссылки
[ редактировать ]- ^ Справочное руководство системы — RCA 3301 REALCOM EDP (PDF) . РКА . Сентябрь 1967 г. 94-16-000-1 . Проверено 21 декабря 2023 г.
- ^ Ф. Чоу; С. Коррелл; М. Химельштейн; Э. Киллиан; Л. Вебер (1987). «Сколько режимов адресации достаточно?» . Новости компьютерной архитектуры ACM Sigarch . 15 (5): 117–121. дои : 10.1145/36177.36193 .
- ^ Джон Л. Хеннесси ; Марк А. Горовиц (1986). «Обзор проекта MIPS-X-MP» (PDF) .
... MIPS-X использует единственный режим адресации: базовый регистр плюс смещение. Этот простой режим адресации позволяет начать вычисление эффективного адреса очень рано...
- ^ Доктор Джон Сквайр. «Лекция 19. Конвейерная пересылка данных» . CS411 Избранные конспекты лекций .
- ^ «Высокопроизводительные вычисления, заметки для класса 11 (15 и 20 сентября 2000 г.) — Конвейерная обработка» . Архивировано из оригинала 27 декабря 2013 г. Проверено 8 февраля 2014 г.
- ^ Джон Пол Шен, Микко Х. Липасти (2004). Современный дизайн процессора . МакГроу-Хилл Профессионал . ISBN 9780070570641 .
- ^ Jump up to: а б Джон Л. Хеннесси; Дэвид А. Паттерсон (29 мая 2002 г.). Компьютерная архитектура: количественный подход . Эльзевир. п. 104. ИСБН 9780080502526 .
C54x имеет 17 режимов адресации данных, не считая доступа к регистрам, но четыре режима, имеющиеся в MIPS, составляют 70% режимов. На автоинкремент и автодекремент, встречающиеся в некоторых RISC-архитектурах, приходится еще 25% использования. Эти данные были собраны в результате измерения статических инструкций для вызываемой на C библиотеки из 54 подпрограмм DSP, закодированных на языке ассемблера.
- ^ Доктор Софиен Таар. «Принципы набора инструкций: использование режима адресации (краткое содержание)» (PDF) . Архивировано из оригинала (PDF) 30 сентября 2011 г.
3 программы измерены на станке со всеми режимами адресации (VAX) ... смещение 75% и немедленное
- ^ Али-Реза Адл-Табатабай; Джефф Лэнгдейл; Стивен Лукко; Роберт Вахбе (1995). «Эффективные и языконезависимые мобильные программы» . Материалы конференции ACM SIGPLAN 1996 года по проектированию и реализации языков программирования — PLDI '96 . стр. 127–136. дои : 10.1145/231379.231402 . ISBN 0897917952 . S2CID 2534344 .
79% всех выполняемых инструкций можно заменить инструкциями RISC или синтезировать в инструкции RISC, используя только комбинацию базовых блочных инструкций.
- ^ Принципы работы IBM System/360 (PDF) . ИБМ. Сентябрь 1968 г. с. 135. А22-6821-7 . Проверено 12 июля 2019 г.
- ^ z/Принципы работы архитектуры (PDF) . ИБМ. Сентябрь 2017. стр. 7–266. SA22-7832-11 . Проверено 12 июля 2019 г.
- ^ Макс Максфилд. «Сборка 4-битного компьютера: язык ассемблера и ассемблер» . Раздел «Режимы адресации». 2019.
- ^ Конг, Шинг; Паттерсон, Дэвид (1995). «Конструирование набора инструкций» . Слайд 27.
- ^ Купман, Филип (1989). «Архитектура RTX 32P» . Стековые компьютеры .
- ^ «Введение в 64-битную архитектуру ARMv8» . Академия УИК . quequero.org. 9 апреля 2014 г.
- ^ Руководство по эксплуатации электронной машины обработки данных 704 (PDF) . ИБМ . 1955. стр. 10–11.
- ^ Справочное руководство по системе обработки данных IBM 7090 (PDF) . ИБМ. 1962. стр. 9–10.
- ^ DEC-10-HMAA-D: Руководство по техническому обслуживанию центрального процессора PDP-10 KA10 (PDF) (1-е издание). Мейнард, Массачусетс : Корпорация цифрового оборудования . Декабрь 1968 г., стр. 2–11 . Проверено 15 мая 2021 г.
Рисунок 2-9: Расчет эффективного адреса: проверьте «PI RQ ?»
- ^ «Хранение» (PDF) . Машина обработки данных с магнитным барабаном 650 - инструкция по эксплуатации (PDF) . Июнь 1955 г. с. 9 . 22-6060-2 . Проверено 14 марта 2022 г.
- ^ «Основные адреса хранения и регистрации» (PDF) . Справочное руководство — Система обработки данных IBM 7070 (PDF) . Январь 1960 г. с. 252. А22-7003-0 . Проверено 14 марта 2022 г.
- ^ Джонс, Дуглас, Справочные инструкции для PDP-8 , получено 1 июля 2013 г.
- ^ Френд, Карл, Обзор набора инструкций Data General NOVA , получено 1 июля 2013 г.
- ^ "Справочник по C: функция malloc()"
- ^ Jump up to: а б Дэйв Брукс. «Некоторые старые компьютеры» .
- ^ Билл Первис. «Некоторые подробности аппаратной части Elliott 803B»