Режимы адресации
Операнды команд могут быть как регистрами, так и ячейками
памяти. Некоторые архитектуры, например PDP-11 и VAX, допускают произвольное
сочетание регистров и ячеек памяти в одной команде. В частности, допустимы
команды пересылки из памяти в память и арифметические операции, оба (у
двухадресной PDP-11) или все три (у трехадресного VAX) операнда которых
расположены в памяти. В других архитектурах, например в х86 и МС680хО
только один операнд команды может размещаться в памяти, а второй всегда
обязан быть регистром (впрочем, оба эти процессора имеют и отдельные команды
память-память, например инструкции групповой пересылки данных). У RISC-процессоров
арифметические операции разрешены только над регистрами, а для обращений
к памяти выделены специальные команды LD (LoaD,
загрузить) и ST (Store, сохранить).
В зависимости от подхода, применяемого в конкретной системе команд, архитектуры
подразделяются на память-память,
регистр-память и регистр-регистр. Архитектура
регистр-регистр привлекательна тем, что позволяет сделать длину команды
фиксированной (адресное поле могут иметь только команды LD/ST и команды
вызова и перехода) и за счет этого упростить работу дешифратора и логики
предварительной выборки команд. При небольшой длине адреса (как у старых
компьютеров и современных микроконтроллеров) этим преимуществом обладают
и архитектуры регистр-память.
Напротив, процессоры с большим адресным пространством и архитектурами
память-память и регистр-память вынуждены иметь команды переменной длины.
У процессоров VAX длина команды меняется от одного (безадресная команда)
до 61 байта (шестиадресная команда, все операнды которой используют самый
сложный из допустимых режимов адресации). Впрочем, пределом экстравагантности
в этом смысле является Intel 432, команды которого имели длину, некратную
байту. Адресация команд в 1432 происходила с точностью до бита.
По мере роста адресного пространства адресные поля команд, обращающихся
к памяти, занимают все большую и большую долю кода. Это является дополнительным
стимулом к замене, где это возможно, обращений к памяти на обращения к
регистрам. Благодаря этому же, код активно использующих регистры RISC-процессоров,
несмотря на гораздо большую длину кодов команд (если у х86 наиболее широко
используемые операции кодируются двумя байтами, то у типичного RISC все
команды имеют длину 4 байта), ненамного превосходит по объему эквивалентный
код для CISC-процессоров. По мере перехода к 64-разрядным адресам, выигрыш
в объеме кода может стать преимуществом RISC-архитектур.
На основе сказанного выше, у читателя могло сложиться впечатление, что
единственным способом указания адреса операнда в памяти является помещение
этого адреса в адресное поле команды. В действительности это не так, или,
точнее, не всегда так — в зависимости от режима адресации, адрес операнда
может вычисляться различными, иногда довольно сложными способами, с учетом
значений одного или нескольких регистров, и как с использованием адресного
поля, так и без него.
Большинство современных процессоров поддерживает многочисленные режимы
адресации. Как и при работе с регистрами, это может реализоваться двумя
путями: ортогональным, когда режим адресации кодируется битовым полем
в коде команды, и неортогональным, когда различные режимы адресации соответствуют
разным командам.
Поскольку различные режимы адресации могут как использовать адресное поле,
так и не использовать его, чтобы реализовать ортогональную систему с командами
фиксированной длины, нужно проявить незаурядную фантазию.
Режимы адресации VAX
У процессоров VAX операнды команд кодируются одним байтом. Старшие 4 бита
операнда указывают режим адресации, младшие— номер регистра. Если режим
предполагает использование адресных полей, эти поля следуют за операндом.
При некоторых режимах возможно использование нескольких адресных полей
и длина одного операнда, таким образом, может доходить до 10 байт (рис.
2.6).
Рис. 2.6. Форматы одно-, двух- и трехадресной команд процессора
VAX
Режимы адресации SPARC
У процессоров SPARC адресацию осуществляют лишь четыре группы команд —
LD (загрузка слова из памяти в регистр), ST (сохранение значения регистра
в памяти), JMPL (переход по указанному адресу и сохранение текущего адреса
в регистре) и команды условного перехода. Все остальные команды манипулируют
регистрами и константами. Команда длиной 32 бита имеет три битовых поля:
два задают 5-разрядные номера регистров, третье — либо регистр, либо 13-разрядное
целое число (см. рис. 2.3). Команды LD, SP и JMPL имеют такой же формат
и позволяют использовать в качестве адреса либо сумму двух регистров,
либо регистра и 13-разрядного значения, интерпретируемого как знаковое
число в двоично-дополнительной кодировке. Это перекрывает далеко не все
перечисленные далее режимы адресации. Многие распространенные режимы адресации
на SPARC приходится реализовать с помощью нескольких команд.
Даже классические полностью ортогональные архитектуры — PDP-11, VAX,
MC680xO — имеют по крайней мере одно отклонение от полной ортогональности:
режим адресации коротким смещением относительно счетчика команд (см. разд.
Адресация с использованием счетчика команд,
используемый в этих архитектурах в командах условного перехода и недоступный
в других командах. |