Введение
Индексный регистр центрального процессора – это регистр процессора (или выделенная область памяти), используемый для модификации адресов операндов в процессе выполнения программы. Он полезен для последовательного доступа к элементам строк и массивов, а также для хранения счетчиков итераций циклов. В некоторых архитектурах он применяется для чтения и записи блоков памяти. В зависимости от архитектуры, это может быть специализированный индексный регистр или регистр общего назначения. Некоторые наборы инструкций поддерживают использование нескольких индексных регистров, при этом дополнительные поля инструкции указывают, какие регистры следует использовать. Обычно содержимое индексного регистра добавляется (в некоторых случаях вычитается) из непосредственного адреса (который может быть частью самой инструкции или храниться в другом регистре) для формирования "эффективного" адреса данных (операнда). Обычно предусмотрены специальные инструкции для проверки значения индексного регистра, и в случае неудачи, регистр увеличивается на заданную константу с последующим переходом, как правило, к началу цикла. В то время как большинство процессоров, поддерживающих несколько индексных регистров, суммируют их содержимое, в компьютерах IBM существовала линейка, где содержимое регистров выполнялось побитовое ИЛИ. Индексные регистры оказались эффективными при выполнении векторных и операций с массивами, а также в системах коммерческой обработки данных для перемещения между полями записей. В обоих случаях индексные регистры существенно снижали объем используемой памяти и повышали скорость выполнения.
An index register in a computer's CPU is a processor register (or an assigned memory location) used for pointing to operand addresses during the run of a program. It is useful for stepping through strings and arrays. It can also be used for holding loop iterations and counters. In some architectures it is used for read/writing blocks of memory. Depending on the architecture it may be a dedicated index register or a general purpose register. Some instruction sets allow more than one index register to be used; in that case additional instruction fields may specify which index registers to use. Generally, the contents of an index register is added to (in some cases subtracted from) an immediate address (that can be part of the instruction itself or held in another register) to form the "effective" address of the actual data (operand). Special instructions are typically provided to test the index register and, if the test fails, increments the index register by an immediate constant and branches, typically to the start of the loop. While normally processors that allow an instruction to specify multiple index registers add the contents together, IBM had a line of computers in which the contents were or'd together. Index registers has proved useful for doing vector/array operations and in commercial data processing for navigating from field to field within records. In both uses index registers substantially reduced the amount of memory used and increased execution speed.
История
В ранних компьютерах, не имевших какой-либо формы косвенной адресации, операции с массивами приходилось выполнять путем модификации адреса инструкции, что требовало нескольких дополнительных шагов программы и использовало больше компьютерной памяти – дефицитного ресурса в компьютерных установках ранней эпохи (а также в ранних микрокомпьютерах два десятилетия спустя). Индексные регистры, обычно известные как B-линии в ранних британских компьютерах, как B-регистры на некоторых машинах и X-регистры на других, впервые были использованы в британском компьютере Manchester Mark 1 в 1949 году. В целом, индексные регистры стали стандартной частью компьютеров во время второго поколения технологий, примерно в 1954–1966 годах. Большинство машин серии 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-регистра. PDP 6 от Digital Equipment Corporation (DEC), представленный в 1964 году, и IBM System/360, анонсированный в 1964 году, не включают специальные индексные регистры; вместо этого они имеют регистры общего назначения (называемые "аккумуляторами" в PDP 6), которые могут содержать либо числовые значения, либо адреса. Адрес памяти операнда в PDP 6 представляет собой сумму содержимого регистра общего назначения и 18-битного смещения, а в System/360 – сумму содержимого двух регистров общего назначения и 12-битного смещения. Совместимая линейка PDP 10, преемников PDP 6, а также IBM System/370 и более поздние совместимые преемники System/360, включая текущую архитектуру z/Architecture, работают аналогичным образом. В 1969 году Data General Nova и преемник Eclipse, а также DEC PDP 11 1970 года, миникомпьютеры также предоставляли регистры общего назначения (называемые "аккумуляторами" в Nova и Eclipse), а не отдельные аккумуляторы и индексные регистры, как и их преемники Eclipse MV и VAX – 32-битные суперминикомпьютеры. В PDP 11 и VAX любой регистр можно было использовать при вычислении адреса памяти операнда; в Nova, Eclipse и Eclipse MV можно было использовать только регистры 2 и 3. CDC STAR 100 1971 года имеет файл регистров, состоящий из 256 64-битных регистров, 9 из которых зарезервированы. В отличие от большинства компьютеров, инструкции STAR 100 имеют только поля регистров и поля операндов, поэтому регистры служат скорее как указательные регистры, чем как традиционные индексные регистры. В то время как Intel 8008 1972 года позволял косвенную адресацию через пары регистров, первым микропроцессором с истинным индексным регистром, по-видимому, был Motorola 6800 1974 года. В 1975 году 8-битный процессор MOS Technology 6502 имел два индексных регистра – 'X' и 'Y'. В 1978 году Intel 8086, первый процессор x86, имел восемь 16-битных регистров, называемых "регистрами общего назначения", все из которых могут использоваться в качестве целочисленных регистров данных в большинстве операций; четыре из них – 'SI' (индекс источника), 'DI' (индекс назначения), 'BX' (база) и 'BP' (указатель базы) – также могут использоваться при вычислении адреса памяти операнда, который представляет собой сумму одного из этих регистров и смещения, или сумму одного из 'BX' или 'BP', одного из 'SI' или 'DI' и смещения. Intel 8088 1979 года и 16-битные Intel 80186, Intel 80188 и Intel 80286, преемники, работают аналогично. В 1985 году i386, 32-битный преемник этих процессоров, представивший 32-битную версию архитектуры x86 IA 32, расширил восемь 16-битных регистров до 32 бит, добавив "E" в начало имени регистра; в IA 32 адрес памяти операнда представляет собой сумму одного из этих восьми регистров, одного из семи из этих регистров (указатель стека не разрешен в качестве второго регистра здесь), умноженную на 1, 2, 4 или 8, и смещения. Advanced Micro Devices Opteron, первая модель которого была выпущена в 2003 году, представил x86 64 – 64-битную версию набора инструкций x86; в x86 64 регистры общего назначения были расширены до 64 бит, и было добавлено восемь дополнительных регистров общего назначения; адрес памяти операнда является суммой двух из этих 16 регистров и смещения. В 64-битной версии архитектуры ARM существует 31 64-битный регистр общего назначения, а также указатель стека и нулевой регистр; адрес памяти инструкции загрузки или сохранения является суммой любого из 31 регистра и либо смещения, либо другого из регистров.