Читайте также:
|
|
До сих пор мы рассматривали только те команды, которые оперируют данными, Командам перехода (а также командам вызова процедур) также нужны особые режимы адресации для определения целевого адреса. Режимы адресации, о которых мы говорили в предыдущих подразделах, применимы и к большинству команд перехода. Один из возможных режимов - прямая адресация, когда целевой адрес просто полностью включается в команду.
Другие режимы адресации тоже имеют смысл. Косвенная регистровая адресация позволяет программе вычислить целевой адрес, поместить его в регистр, а затем перейти по полученному адресу. Такой способ дает максимальную гибкость, поскольку целевой адрес вычисляется во время выполнения программы. Но он также оставляет лазейку для бессчетного числа трудно обнаруживаемых ошибок.
Индексная адресация, при которой известно смещение от регистра, также является вполне приемлемой. Этот режим обладает теми же характеристиками, что и косвенная регистровая адресация.
Еще один режим - относительная адресация по счетчику команд. В данном случае для получения целевого адреса смещение (со знаком), находящееся в самой команде, прибавляется к счетчику команд. По сути, это индексная адресация, где в качестве регистра используется счетчик команд.
Ортогональность кодов операций и режимов адресации
С точки зрения программного обеспечения команды и режимы адресации должны иметь регулярную структуру с минимальным числом форматов команд. При такой структуре компилятору гораздо проще порождать нужный код. Все коды операций должны поддерживать любые режимы адресации, если это имеет смысл. Более того, для всех регистровых режимов должны быть доступны все регистры, включая указатель фрейма (РР), указатель стека (ЭР) и счетчик команд (РС).
Рассмотрим форматы 32-разрядных команд для трехадресной машины (рис. 5.17). Здесь поддерживаются до 256 кодов операций. В варианте 1 формата каждая команда имеет два входных регистра (источника) и один выходной регистр (приемник). Этот формат используется для всех арифметических и логических команд.
Рис. 5.17. Форматы команд для трехадресной машины
Неиспользованное 8-разрядное поле в конце команды может потребоваться для дальнейшей дифференциации команд. Например, можно иметь один код для всех операций с плавающей точкой, а различаться эти операции будут по дополнительному полю. Кроме того, если установлен бит 23, тогда задействуется вариант 2 формата, а второй операнд уже является не регистром, а 13-разрядной непосредственной константой со знаком. Команды LOAD и STORE тоже могут использовать этот формат для обращения к памяти при индексном способе адресации.
Необходимо также иметь небольшое число дополнительных команд (например, команд условных переходов), но они легко подходят под вариант 3 формата. Например, можно приписать один код операции каждому (условному) переходу, вызову процедуры и т. д., тогда останется 24 бита для смещения по счетчику команд. Если предположить, что это смещение считается в словах, диапазон будет составлять 32 Мбайт. Несколько кодов операций можно зарезервировать для команд LOAD и STORE, которым нужны длинные смещения в варианте 3 формата.
Теперь рассмотрим структуру двухадресной машины, в которой в качестве любого операнда может использоваться слово из памяти (рис. 5.18). Такая машина умеет складывать слово памяти с регистром, регистр со словом памяти, два регистра и два слова памяти. В настоящее время обращение к памяти связано со значительными издержками, поэтому такая структура не очень распространена, но если с развитием технологий обращаться к памяти станет менее накладно, получится простое и эффективное решение. Машины PDP-11 и VAX, в которых использовались похожие форматы, были очень популярны и доминировали на рынке мини-компьютеров в течение двух десятилетий.
Рис. 5.18. Простые форматы команд для двухадресной машины
Здесь мы снова имеем 8-разрядный код операции, но теперь у нас есть по 12 бит для задания источника и приемника. Для каждого операнда 3 бита позволяют указать режим адресации, 5 бит - регистр и 4 бита - смещение. Имея 3 бита для задания режима адресации, мы можем поддерживать непосредственную, прямую, регистровую, косвенную регистровую индексную и стековую адресации, и при этом еще остается место для двух дополнительных режимов, которые, возможно, появятся в будущем. Это простая система, которую легко компилировать, в то же время она достаточно гибкая, особенно если счетчик команд, указатель стека и указатель локальных переменных находятся среди регистров общего назначения, к которым можно получить доступ.
Единственная проблема в том, что при прямой адресации нам нужно большее количество битов для адреса. В машинах PDP-11 и VAX к команде было добавлено дополнительное слово для указания адреса каждого прямо адресуемого операнда. Мы тоже могли бы использовать один из двух доступных режимов адресации для индексной адресации с 32-разрядным смещением, которое следует за командой. Тогда в худшем случае при сложении двух слов памяти, когда обращение к обоим операндам производится в режиме прямой адресации или с использованием длинной индексной формы, команда была бы размером 96 бит и занимала бы 3 цикла шины (один для команды и два для данных). В то же время для прибавления произвольного слова памяти к другому произвольному слову памяти большинству RISC-систем потребовалось бы по крайней мере 96 бит, а может и больше, на что нужно по крайней мере 4 цикла шины.
Форматы, изображенные на рис. 5.18, допускают самые разные варианты. В данной системе с помощью одной 32-разрядной команды, при условии что переменные i и j находятся среди первых 16 локальных переменных, можно выполнить следующую операцию:
i = J:
Для переменных, расположенных после первых 16, нам потребуется перейти к 32-разрядным смещениям. Можно также придумать формат с одним 8-разрядным смещением вместо двух 4-разрядных при условии, что это смещение может использоваться либо источником, либо приемником, но не тем и другим вместе. Варианты компромиссов не ограничены, и чтобы получить хороший результат, разработчикам приходится учитывать многие факторы.
Сравнение режимов адресации
На практике для эффективной архитектуры команд вовсе не нужно множество разнообразных режимов адресации. Поскольку практически весь код, написанный на этом уровне, порождается компиляторами (за исключением 8051), режимов адресации должно быть мало и они должны быть простыми и понятными. Машине приходится занимать одну из крайних позиций, предлагая либо все доступные варианты, либо только один вариант. В промежуточных случаях компилятор сталкивается с необходимостью выбора, сделать который он не в силах ввиду недостатка информации или сложности алгоритма.
Поэтому в наиболее простых архитектурах используют очень немного режимов адресации, причем на каждый из этих режимов накладываются жесткие ограничения. Обычно практически для любых применений достаточно непосредственной, прямой, регистровой и индексной адресации. Каждый регистр (включая указатель локальных переменных, указатель стека и счетчик команд) должен быть доступен всегда, когда это требуется. В более сложных режимах адресации можно сократить число команд, но при этом придется ввести жесткие последовательности операций, которые трудно будет выполнять
Дата добавления: 2015-07-08; просмотров: 166 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Косвенная регистровая адресация | | | параллельно с другими операциями. |