К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 28
Текст из файла (страница 28)
2.3В. Подпрограмма для удаления записи из связного списка Мы предполагаем, что в регистре К1?)Х?) М содержится код удаляемой записи, а регистры КНЕА?), КСПККЕХТ и КХЕХТ выполняют те же функции, что и при добавлении записи. Первая пара команд сравнения и перехода проверяет, является ли подлежащая удалению запись первой записью списка. Если да, эта запись удаляется, для чего значение ее поля указателя копируется в КНЕАП. Причем, если первая запись была единственной в списке, ее поле указателя содержит О.
Поэтому копирование этого указателя в регистр КНЕАП означает, что теперь 118 Глава 2. Машинные команды и программы КНЕА?),КС?)ККЕХТ 4(КС?)ККЕХТ), КХЕХТ (КХЕХТ),К1?)Х??М 1)Е1.ЕТЕ КХЕХТ КСНККЕХТ 1.ООР 4(КХЕХТ),КТЕМР КТЕМР,4(КСНККЕХТ) 2.12. Кодирование машинных команд 119 список пуст. Регистры КСБККЕХТ и КХЕХТ применяются для сканирования списка в поисках удаляемой записи. Когда эта запись будет найдена, вторая команда сравнения и перехода передаст управление по адресу ПЕКЕТЕ. Запись, на которую указывает регистр КХЕХТ, будет удалена из списка, для чего ее поле указателя будет скопировано в поле указателя предыдущей записи, на которую указывает КСПККЕХТ. Последние две команды пересылки выполняют такое копирование через регистр КТЕМР.
Если компьютер поддерживает непосредственное копирование из памяти в память, эти две команды можно заменить одной: Моче 4(КХЕХТ),4(КСПККЕХТ) Обработка ошибок Подпрограммы добавления и удаления записи, показанные на рис. 2.37 и 2.38, не учитывают, что возможны две такие ситуации, из-за которых в них наверняка произойдут ошибки. Подпрограмма добавления записи предполагает, что в списке нет записи с таким кодом, как у новой записи, а подпрограмма удаления прсдполагает, что в списке такая запись имеется. Модификации этих подпрограмм с учетом двух указанных ситуаций посвящены упражнения 2.23 и 2.24.
2.12. Кодирование машинных команд Итак, вы познакомились со множеством полезных команд и адресных режимов. Зги команды определяют действия, которые должны быть произведены процессором для выполнения конкретных задач. В предыдущих разделах мы часто называли их машинными командами. На самом же деле та форма, в которой приводись эти команды, близка к языку ассемблера — мы лишь пытались избежать использования сокращенных обозначений команд, так как они, во-первых, трудны для запоминания, а во-вторых, специфичны для конкретных процессоров. Чтобы процессор мог выполнить команду, ее необходимо закодировать в компактном двоичном формате.
Именно такие закодированные команды следует называть машинными командами. А команды с символическими именами и сокращениями называются командами на языке ассемблера; программа-ассемблер преобразует их перед исполнением в машинные инструкции, как рассказывалось в разделе 2.6. В предыдущих разделах мы, чтобы облегчить восприятие излагаемого материала, предполагали, что все команды имеют длину в одно слово.
Поскольку речь обычно шла о 32-разрядных словах, считалось, что этой длины достаточно для представления всей необходимой информации. Теперь пришло время проверить это предположение. Вам уже известны команды, выполняющие такие операции, как сложение, вычитание, пересылка, сдвиг и переход. В этих командах могут использоваться операнды разного размера, в частности 32- и 8-разрядные числа, 8-разрядные АВСП- коды символов. Типы выполняемых операций и их операндов могут определяться в двоичной спецификации, называемой кодом операции данной команды. Предположим, для кода операции выделяется 8 разрядов, что позволяет закодировать 256 разных команд.
После этого в машинной команде для записи остальной информации остается 24 разряда. 120 Глава 2. Машинные команды и программы Рассмотрим несколько типичных случаев. В команде Аоо К1,К2 помимо кода операции должны быть заданы два регистра, К1 и К2. Если процессор имеет 16 регистров, для идентификации каждого их ннх нужно 4 разряда. Кроме того, необходимо указать, что для каждого из операндов используется регистровый режим адресации, для чего потребуется еще несколько разрядов. В команде Моче 24(КО),К5 16 разрядов необходимы для задания кода операции и двух регистров, а еще несколько разрядов для указания того, что для исходного операнда используется индексный режим адресации, а значение индекса составляет 24. Предположим, что для идентификации одного их перечисленных в табл.
2.1 режимов адресации необходимо иметь 3 разряда. Тогда в команде с двумя операндами для определения способов их адресации будет задействовано 6 разрядов. Для записи значения индекса остается 10 разрядов. Если их хватит для представления адекватного диапазона чисел со знаком, значит, команда поместится в 32-разрядное слово. В команде сдвига 1.5)пТсК №2,К0 и команде пересылки Моче №$3А,К1 необходимо предусмотреть разряды для записи непосредственно задаваемых значений 2 и ЗЗА — это помимо 18 разрядов, используемых для определения кода операции, режимов адресации и регистра. Поэтому размер заданного операнда ограничен 14 разрядами.
Рассмотрим следующую команду перехода: ВгапсЬ>0 1.00Р И здесь код операции занимает 8 разрядов, а для смещения перехода остается 24 разряда. Поскольку смещение задается как чисдо в формате дополнения до двух, целевой адрес перехода не должен отстоять от команды перехода более чем на 2зз байта. Для того чтобы выполнить переход к команде вне этого диапазона, нужно применить другой режим адресации, например абсолютную или регистровую косвенную адресацию. Команды перехода, в которых используются эти режимы, часто называют 1пшр-командами. Во всех рассмотренных примерах команды помещались в 32-разрядное слово.
Возможный формат этого слова приведен на рис. 2.39, а. В нем восемь разрядов отведено для кода операции и по семь разрядов на каждый из двух операндов. Семиразрядное поле идентифицирует режим адресации операнда и используемый регистр (если таковой имеется). В поле «Другая информация» можно задать такие дополнительные сведения, как значение индекса или значение операнда.
2.12. Кодирование машинных команд 121 Но как быть, если нам потребуется расположенный в памяти операнд задать с помощью абсолютного режима адресации? В команде Моче В2Д.ОС для кода операции, адресных режимов и регистра требуется 18 разрядов. Следовательно, для адреса ЕОС остается всего 14 разрядов, чего, конечно же, совершенно недостаточно. Если в команде нужно задать полный 32-разрядный адрес, единственным решением может стать увеличение длины команды еще на одно слово, которое и будет содержать адрес.
Формат такой команды показан на рис. 2.39, 6. Первое слово в ней точно такое же, как на рис. 2.39, а, но второе содержит полный адрес операнда в памяти компьютера. В этом формате можно задавать команды наподобие следующей: Апй №ЗГЕОООООО,В2 В данном случае второе слово будет содержать непосредственно заданный 32-разрядный операнд. 10 Рио. 2.39.
Кодирование команд в 32-разрядник словах: команда длиной в одно слово (а); команда длиной в два слова (б); команда длиной в три слова (в) Для хранения команды, в которой оба операнда заданы в абсолютном режиме, например такой: Моче ЕОС1,1.0С2 потребуется не одно, а два дополнительных слова.
122 Глава 2. Машинные команды и программы Как видите, мы пришли к выводу о необходимости использовать команды переменной длины, размер которых зависит от количества операндов и применяемых режимов адресации. Задействуя несколько слов, можно реализовать довольно сложные команды, напоминающие инструкции языков высокого уровня. Компьютеры, поддерживавпцие такие команды, называются компьютерами с полным набором команд (Сошр1ех 1пзСгисс1оп Бег Сошрпгег, С1БС). Существует и кардинально иная альтернатива этому подходу.
Если решить, что все команды должны помещаться в одно 32-разрядное слово, в них просто невозможно будет использовать 32-разрядные адреса или 32-разрядные непосредственно задаваемые операнды. Но при этом система команд все равно может быть достаточно функциональной, если в ней будут интенсивно использоваться регистры процессора. Таким образом может поддерживаться команда АсЫ К1,22 но не команда АсЫ 1.0С,В2 Вместо последней можно использовать команду АсЫ (КЗ),К2 предварительно загрузив адрес 1.0С в регистр ВЗ.
В этом случае регистр КЗ будет выполнять роль указателя на заданное место памяти, Возникает вопроса как загрузить 32-разрядный адрес в регистр, который должен служить указателем? Можно сделать так, чтобы ассемблер поместил нужный адрес в виде слова в область данных, расположенную рядом с программой.
В таком случае для загрузки адреса можно использовать относительную адресацию. При этом нужно позаботиться о том, чтобы поле индекса в команде Еоад было достаточно большим для размещения в нем нужного адреса. Вторая возможность заключается в том, чтобы с помощью логических операций и операции сдвига сформировать в регистре 32-разрядный адрес, задавая его по частям, размеры которых достаточно малы для непосредственного задания в командах. Эта технология подробно рассматривается в той части главы 3, которая посвящена процессору АКМ.
Все команды данного процессора имеют 32-разрядный формат. Компьютеры, размер команд которых ограничен одним словом, называются компьютерами с сокращенным набором команд (Кес(псес( 1пзсгис11оп Бег Сошрисег, К1ЯС). Системы команд типа К1БС имеют и другие ограничения. В частности, все операции выполняются в них только над данными, хранящимися в регистрах процессора. Это означает, что для реализации приведенной выше операции сложения необходимы две команды: Моче (КЗ),К1 АсЫ К1,К2 Если в команде АсЫ задаются два регистра, она занимает даже меньше одного слова, и становится возможным использование команды с тремя операндами: АсЫ К1,В2,КЗ Упражнения 123 выполняющей операцию ЯЗ < — 121) + 1к21 Возможный формат этой команды приведен на рис.
2.39, в. Конечно, процессор должен уметь работать с командами, имеющими по три операнда. В тех системах команд, в которых все логические и арифметические операции выполняются только над регистрами, обращение к памяти производится с помощью лишь двух команд, а именно считывания данных в регистры из памяти и записи данных из регистров в память. В системах типа ЫЗС команд обычно бывает меньше, причем сами по себе они проще, чем команды типа С1ЯС.
Относительные преимущества двух описанных подходов мы обсудим в главе 8, посвященной архитектуре процессоров. 2.13. Резюме В настоящей главе проанализированы принципы представления и выполнения команд на двух уровнях, а именно языка ассемблера и машинном. Причем сделано это бьио с точки зрения программиста. Основное внимание уделялось базовым принципам адресации и последовательности выполнения команд. Существующие типы операций, реализованных в системах команд современных компьютеров, были рассмотрены на примерах небольших программ. Вы познакомились с несколькими режимами адресации, а также с понятиями указателей и индексного доступа к данным. Были описаны базовые операции ввода-вывода и параллельно обсуждался процесс пересылки символов между клавиатурой, процессором и дисплеем, а также представлена концепция подпрограмм и перечислены команды, необходимые для ее реализации.
Обсуждая методы связывания подпрограмм, мы рассмотрели в качестве примера приложение, поддерживающее структуру данных типа стека. Затронуты были и такие темы, как способы управления другими структурами данных, в частности очередью, массивами и связными списками. Напоследок были проанализированы два разных подхода к формированию набора машинных команд, известных как В15С и С1ЯС.