Индексный регистр в ЦП компьютера — это регистр процессора (или назначенная ячейка памяти) [1] , используемый для указания адресов операндов во время выполнения программы. Это полезно для перемещения по строкам и массивам . Его также можно использовать для хранения итераций цикла и счетчиков. В некоторых архитектурах он используется для чтения/записи блоков памяти. В зависимости от архитектуры это может быть специальный индексный регистр или регистр общего назначения. [2] Некоторые наборы команд позволяют использовать более одного индексного регистра; в этом случае дополнительные поля инструкций могут указывать, какие индексные регистры использовать. [3]
Как правило, содержимое индексного регистра добавляется (в некоторых случаях вычитается) к непосредственному адресу (который может быть частью самой инструкции или храниться в другом регистре) для формирования «эффективного» адреса фактических данных (операнда). . Специальные инструкции обычно предоставляются для проверки индексного регистра и, если проверка не удалась, индексный регистр немедленно увеличивается на константу и переходит, обычно до начала цикла. В то время как обычно процессоры, которые позволяют команде указывать несколько индексных регистров, складывают содержимое вместе, у IBM была линейка компьютеров, в которых содержимое было объединено. [4]
Индексные регистры оказались полезными для выполнения операций с векторами / массивами , а также в коммерческой обработке данных для навигации от поля к полю внутри записей. В обоих случаях индексные регистры существенно сократили объем используемой памяти и увеличили скорость выполнения.
В ранних компьютерах без какой-либо формы косвенной адресации операции с массивами приходилось выполнять путем изменения адреса инструкции, что требовало нескольких дополнительных шагов программы и занимало больше компьютерной памяти, [5] дефицитного ресурса в компьютерных установках ранней эпохи (как а также в первых микрокомпьютерах два десятилетия спустя).
Индексные регистры, широко известные как B-линии в ранних британских компьютерах, как B-регистры на некоторых машинах и X-регистры [a] на других, впервые были использованы в британском компьютере Manchester Mark 1 в 1949 году. Регистры стали стандартной частью компьютеров во время второго поколения технологии , примерно в 1954–1966 годах. Они были установлены на большинстве [b] машин серии мэйнфреймов IBM 700/7000 , начиная с IBM 704 в 1954 году, хотя на некоторых машинах меньшего размера, таких как IBM 650 и IBM 1401, они были необязательными .
Ранние «маленькие машины» с индексными регистрами включают AN/USQ-17 , выпущенный примерно в 1960 году, и компьютеры реального времени серии 9 от Scientific Data Systems , выпущенные в начале 1960-х годов.
UNIVAC 1107 1962 года имеет 15 X-регистров, четыре из которых также были A-регистрами.
GE-635 1964 года имеет 8 специальных X-регистров; однако он также позволяет индексировать по счетчику команд или по половине регистра A или Q.
Digital Equipment Corporation (DEC) PDP-6 , представленная в 1964 году, и IBM System/360 , анонсированная в 1964 году, не включают выделенные индексные регистры; вместо этого у них есть регистры общего назначения (называемые в PDP-6 «аккумуляторами»), которые могут содержать либо числовые значения, либо адреса. Адрес памяти операнда в PDP-6 представляет собой сумму содержимого регистра общего назначения и 18-битного смещения, а в System/360 — сумму содержимого двух регистров общего назначения. и 12-битное смещение. [6] [7] Совместимая линейка PDP-10, преемников PDP-6, а также IBM System/370 и более поздних совместимых преемников System/360, включая текущую z/Architecture , работают таким же образом.
Миникомпьютеры Data General Nova 1969 года и преемник Eclipse , а также DEC PDP-11 1970 года также предоставляли регистры общего назначения (называемые «аккумуляторами» в Nova и Eclipse), а не отдельные аккумуляторы и индексные регистры, как это делали их Eclipse MV и VAX . Преемники 32-битных суперминикомпьютеров . В PDP-11 и VAX любой регистр мог использоваться при вычислении адреса памяти операнда; в Nova, Eclipse и Eclipse MV можно было использовать только регистры 2 и 3. [8] [9] [10]
CDC STAR-100 1971 года имеет файл регистров, состоящий из 256 64-битных регистров, 9 из которых зарезервированы. В отличие от большинства компьютеров, инструкции STAR-100 имеют только поля регистров и поля операндов, поэтому регистры служат скорее регистрами-указателями, чем традиционными индексными регистрами.
Хотя Intel 8080 допускал косвенную адресацию через пары регистров, первым микропроцессором с настоящим индексным регистром, по-видимому, был Motorola 6800 1974 года .
В 1975 году 8-битный процессор MOS Technology 6502 имел два индексных регистра «X» и «Y». [11]
В 1978 году Intel 8086 , первый процессор x86 , имел восемь 16-битных регистров, называемых «общего назначения», каждый из которых можно было использовать как регистры целочисленных данных в большинстве операций; четыре из них: «SI» (индекс источника), «DI» (индекс назначения), «BX» (база) и «BP» (базовый указатель), также могут использоваться при вычислении адреса памяти операнда, который представляет собой сумму одного из этих регистров и смещения, или сумму одного из «BX» или «BP», одного из «SI» или «DI» и смещения. [12] Intel 8088 1979 года и 16 -битные процессоры Intel 80186 , Intel 80188 и Intel 80286 работают одинаково. -битовые регистры становятся 32-битными, с добавлением «E» в начало имени регистра; в IA-32 адрес операнда в памяти представляет собой сумму одного из этих восьми регистров, одного из семи из этих регистров (стек указатель здесь не допускается в качестве второго регистра), умноженный на 1, 2, 4 или 8, и смещение. [13] : 3-11–3-12, 3-22–3-23 The Advanced Micro Devices Opteron , первая модель, выпущенная в 2003 году, представила x86-64 , 64-битную версию набора команд x86; в x86-64 регистры общего назначения были расширены до 64 бит и добавлены восемь дополнительных регистров общего назначения; адрес памяти операнда представляет собой сумму двух из этих 16 регистров и смещения. [14] [13] : 3–12, 3–24
Все наборы команд вычислений с сокращенным набором команд (RISC), представленные в 1980-х и 1990-х годах, предоставляют регистры общего назначения, которые могут содержать либо числовые значения, либо значения адреса. В большинстве этих наборов команд имеется 32 регистра общего назначения (в некоторых из этих наборов команд значение одного из этих регистров жестко привязано к нулю), которые можно использовать для вычисления адреса операнда; у них не было специальных индексных регистров. В 32-битной версии архитектуры ARM , впервые разработанной в 1985 году, имеется 16 регистров, обозначенных как «регистры общего назначения», но только 13 из них могут использоваться для всех целей, причем регистр R15 содержит программный счетчик . Адрес памяти инструкции загрузки или сохранения представляет собой сумму любого из 16 регистров и либо смещения, либо другого регистра, за исключением R15 (возможно, сдвинутого влево для масштабирования). [15] В 64-битной версии архитектуры ARM имеется 31 64-битный регистр общего назначения, а также указатель стека и нулевой регистр; адрес памяти инструкции загрузки или сохранения представляет собой сумму любого из 31 регистра и либо смещения, либо другого регистра. [16]
Вот простой пример использования индексного регистра в псевдокоде языка ассемблера, который суммирует массив из 100 записей 4-байтовых слов:
Очистить_аккумулятор Load_index 400,index2 //загружаем 4*размер массива в индексный регистр 2 (индекс2)loop_start : Add_word_to_accumulator array_start,index2 //Добавляем в AC слово по адресу (array_start + index2) Branch_and_decrement_if_index_not_zero loop_start,4,index2 //цикл уменьшается на 4, пока индексный регистр не станет нулевым