Індексний регістр
Індексний регістр — регістр процесора, у якому вказується адреса операнду під час виконання програми. Можуть використовуватися при операціях над векторами або масивами.
Вміст індексного регістру додається (а у деяких випадках віднімається) до адреси, закодованої у самій інструкції. Таким чином отримується так звана ефективна адреса даних. Як правило процесор містить спеціальні команди для перевірки індексних регістрів, а за результатами перевірки здійснюються які-небудь дії (наприклад, збільшення чи зменшення значення індексного регістру, перехід за умовою тощо). У деяких процесорних архітектурах присутні додаткові індексні регістри; у цьому випадку їх вибір здійснюється додатковими бітовими полями у кодуванні інструкції.[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
Джерела
- IBM 709 Reference Manual, Form A22-6501-0, 1958, p. 12
- IBM 7094 Principles of Operation. Fifth Edition (англ.). IBM. 21 жовтня 1966. A22-6703-4.
- IBM 1401 Reference manual (англ.). 1960. A24-1403-4.
- Лебедев, С.А.; Дашевський, Л.Н.; Шкабара, Е.А. (1952). Малая электронная счетная машина (рос.). Москва: Академия наук СССР. с. 162.
- Z80 CPU introduction (англ.).
- Bot, Jacco J. T. Z80 Undocumented Instructions. Home of the Z80 CPU (англ.). «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.»