Індексний регістр

Неонові індикатори індексних регістрів комп'ютера IBM 7094, початок 1960-х років.

Індексний регістр — регістр процесора, у якому вказується адреса операнда під час виконання програми. Можуть використовуватися при операціях над векторами або масивами.

Вміст індексного регістра додається (а у деяких випадках віднімається) до адреси, закодованої у самій інструкції. Таким чином отримується так звана ефективна адреса даних. Як правило процесор містить спеціальні команди для перевірки індексних регістрів, а за результатами перевірки здійснюються які-небудь дії (наприклад, збільшення чи зменшення значення індексного регістра, перехід за умовою тощо). У деяких процесорних архітектурах присутні додаткові індексні регістри; у цьому випадку їх вибір здійснюється додатковими бітовими полями у кодуванні інструкції.[1] Якщо процесор має команди, де присутні два і більше індексних регістри, зазвичай[де?] їх вміст складається, проте деякі комп'ютери IBM замість складання виконували операцію OR над індексними регістрами.[2]

У ранніх комп'ютерах, що не мали ніяких форм непрямої адресації, операції на масивах даних вимагали написання коду, що модифікує сам себе. Таке програмування, що змінювало поля адрес у машинних інструкціях, було досить незручним, і крім того, вимагало додаткової пам'яті, яка у часи перших комп'ютерів була вкрай обмежена.[3]:77

Реалізації у деяких процесорах[ред. | ред. код]

Мала електронна обчислювальна машина[ред. | ред. код]

Унікальна команда складання команд малої електронної обчислювальної машини[4] (1950 р.) додавала число до команди та цим забезпечувалась динамічна модифікація програми. Комірки пам'яті, в якій зберігалося ці числа, виконували роль індексних регістрів, що дозволяло при циклуванні звертатися до даних (елементів масивів) у послідовно розміщених комірках пам'яті.

Окрім цього в цих комірках можна будо визначати числові значення, які відповідали довільним адресам оперативної пам'яті. Це дозволило перед виконанням команди визначати адресу за якими знаходяться потрібні значення або адресу підпрограми, яку слід викликати. Це надало можливість використати опосередковану адресацію 2-ого рангу (вказівники) до даних та до підпрограм.

IBM 7094[ред. | ред. код]

Дана машина мала 36-бітний формат машинної інструкції, з яких 15 розрядів відводилося на адресу, а три спеціальних розряди називалися «теґ» (англ. tag), і слугували саме для вибору одного з семи індексних регістрів. Значення індексного регістра віднімалося від адреси, і отримана адреса ставала «ефективною адресою» операнда.[2]

Z80[ред. | ред. код]

Мікропроцесор Zilog Z80, на відміну від Intel 8080, має два 16-розрядні індексні регістри IX і IY, що вибираються спеціальними префіксами до коду операції (DD і FD відповідно). Адресація за індексним регістром може здійснюватися з 8-розрядним зміщенням (англ. displacement) або без нього.[5] Наприклад: LD B,(IX+9), або LD (IY),C.

Недокументованою є можливість застосування даних префіксів коду операції (DD і FD) також для однобайтних регістрів — «половинок» IX і IY (за аналогією з регістрами H і L, що утворюють 16-розрядну пару HL).[6]

Intel 8086[ред. | ред. код]

У процесорах Intel 8086 і сумісних присутні індексні регістри SI і DI. У випадку так званої «базово-індексної адресації» до індексного регістра може додаватися також значення регістра BX. Приклади: mov ax,[bx+si]; mov [bx+di+9],dl

Джерела[ред. | ред. код]

  1. IBM 709 Reference Manual, Form A22-6501-0, 1958, p. 12
  2. а б IBM 7094 Principles of Operation (PDF). Fifth Edition (англ.). IBM. 21 жовтня 1966. A22-6703-4. Архів оригіналу (PDF) за 26 вересня 2019. Процитовано 9 грудня 2019.
  3. IBM 1401 Reference manual (PDF) (англ.). 1960. A24-1403-4. Архів оригіналу (PDF) за 9 грудня 2019. Процитовано 9 грудня 2019.
  4. Лебедев, С.А.; Дашевський, Л.Н.; Шкабара, Е.А. (1952). Малая электронная счетная машина (рос.). Москва: Академия наук СССР. с. 162. Архів оригіналу за 23 липня 2021. Процитовано 23 липня 2021.
  5. Z80 CPU introduction (англ.). Архів оригіналу за 25 грудня 2019. Процитовано 10 грудня 2019.
  6. Bot, Jacco J. T. Z80 Undocumented Instructions. Home of the Z80 CPU (англ.). Архів оригіналу за 15 грудня 2019. Процитовано 10 грудня 2019. If an opcode works with the registers HL, H or L then if that opcode is preceded by #DD (or #FD) it works on IX, IXH or IXL (or IY, IYH, IYL), with some exceptions. The exceptions are instructions like LD H,IXH and LD L,IYH.