Форматы команд
Типовая команда, в общем случае, должна указывать:
• подлежащую выполнению операцию;
• адреса исходных данных (операндов), над которыми выполняется операция;
• адрес, по которому должен быть помещен результат операции.
В соответствии с этим команда состоит из двух частей: операционной и адресной.
Длина команды
где
l—
количество
адресов в команде; RA
— количество
разрядов для записи i-гo
адреса;
—
разрядность поля кода операции;
—разрядность
поля способа адресации.
Количество адресов в команде
В «максимальном» варианте необходимо указать три компонента: адрес первого операнда; адрес второго операнда и адрес ячейки; куда заносится результат операции; адрес, указывающий место хранения следующей инструкции. В итоге имеет место четырехадресный формат команды. Такой формат поддерживался в ВМ EDVAC, разработанной в 1940-хгодах.
В
фон-неймановских ВМ необходимость в
четвертом адресе отпадает, поскольку
команды располагаются в памяти в порядке
их выполнения, и адрес очередной команды
может быть получен за счет простого
увеличения адреса текущей команды
в счетчике команд. Это позволяет перейти
к трехадресному
формату команды.
Требуется только добавить в систему
команд ВМ команды, способные изменять
порядок вычислений.
Если по умолчанию взять в качестве адреса результата адрес одного из операндов (обычно второго), то можно обойтись без третьего адреса, и в итоге получаем двухадресный формат команды. Естественно, что в этом случае соответствующий операнд после выполнения операции теряется.
Команду можно еще более сократить, перейдя к одноадресному формату, что возможно при выделении определенного стандартного места для хранения первого операнда и результата. Обычно для этой цели используется специальный регистр центрального процессора (ЦП), известный под названием аккумулятора, поскольку здесь аккумулируется результат.
Время выполнения одной команды складывается из времени выполнения операции и времени обращения к памяти.
Для трехадресной команды последнее суммируется из четырех составляющих времени:
• выборки команды;
• выборки первого операнда;
• выборки второго операнда;
• записи в память результата.
Одноадресная команда требует двух обращений к памяти:
• выборки команды;
• выборки операнда.
Способы адресации операндов
Непосредственная адресация
При непосредственной адресации (НА) в адресном поле команды вместо адреса содержится непосредственно сам операнд (рис. 2.45). Этот способ может применяться при выполнении арифметических операций, операций сравнения, а также для загрузки констант в регистры.
Помимо того, что в адресном поле могут быть указаны только константы, еще одним недостатком данного способа адресации является то, что размер непосредственного операнда ограничен длиной адресного поля команды, которое в большинстве случаев меньше длины машинного слова.
Непосредственная адресация сокращает время выполнения команды, так как не требуется обращение к памяти за операндом. Кроме того, экономится память, поскольку отпадает необходимость в ячейке для хранения операнда. В плане эффективности этот способ можно считать «идеальным».
Прямая адресация
При прямой или абсолютной адресации (ПА) адресный код прямо указывает номер ячейки памяти, к которой производится обращение, то есть адресный код совпадает с исполнительным адресом.
При всей простоте использования способ имеет существенный недостаток - ограниченный размер адресного пространства, так как для адресации к памяти большой емкости нужно «длинное» адресное поле.
Косвенная адресация
Одним из путей преодоления проблем, свойственных прямой адресации, может служить прием, когда с помощью ограниченного адресного поля команды указывается адрес ячейки, в свою очередь, содержащей полноразрядный адрес операнда. Этот способ известен как косвенная адресация (КА). Запись (Ак) означает содержимое ячейки, адрес которой указан в скобках.
Недостатком косвенной адресации является необходимость в двукратном обращении к памяти: сначала для извлечения адреса операнда, а затем для обращения к операнду. Сверх того задействуется лишняя ячейка памяти для хранения исполнительного адреса операнда.
Регистровая адресация
Регистровая адресация (РА) напоминает прямую адресацию. Различие состоит в том, что адресное поле инструкции указывает не на ячейку памяти, а на регистр процессор. Идентификатор регистра в дальнейшем будем обозначать буквой R. Обычно размер адресного поля в данном случае составляет три или четыре бита, что позволяет указать соответственно на один из 8 или 16 регистров общего назначения (РОН).
Двумя основными преимуществами регистровой адресации являются: короткое адресное поле в команде и исключение обращений к памяти. Малое число РОН позволяет сократить длину адресного поля команды. К сожалению, возможности по использованию регистровой адресации ограничены малым числом РОН в составе процессора.
Косвенная регистровая адресация
Косвенная регистровая адресация (КРА) представляет собой косвенную адресацию, где исполнительный адрес операнда хранится не в ячейке основной памяти, а в регистре процессора. Соответственно, адресное поле команды указывает не на ячейку памяти, а на регистр.
Достоинства и ограничения косвенной регистровой адресации те же, что и у обычной косвенной адресации, но благодаря тому, что косвенный адрес хранится не в памяти, а в регистре, для доступа к операнду требуется на одно обращение к памяти меньше.
Адресация со смещением
При адресации со смещением исполнительный адрес формируется в результате суммирования содержимого адресного поля командых содержимым одного или нескольких регистров процессора.
Адресация со смещением предполагает, что адресная часть команды включает в себя как минимум одно поле (Ак). В нем содержится константа. Константа может представлять собой некий базовый адрес, к которому добавляется хранящееся в регистре смещение.
Относительная адресация
При относительной адресации (OA) для получения исполнительного адреса операнда содержимое подполя Ак команды складывается с содержимым счетчика команд. Таким образом, адресный код в команде представляет собой смещение относительно адреса текущей команды.
Главное достоинство данного способа адресации состоит в том, что он делает программу перемещаемой в памяти: независимо от текущего расположения программы в адресном пространстве взаимное положение команды и операнда остается неизменным, поэтому адресация операнда остается корректной.
