Режимы адресации Операнды команд могут быть как регистрами, так
и ячейками памяти. Некоторые архитектуры, например 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 — имеют по крайней мере одно отклонение от
полной ортогональности: режим адресации коротким смещением относительно счетчика
команд (см. разд. Адресация с использованием счетчика команд,
используемый в этих архитектурах в командах условного перехода и недоступный в
других командах. |