Предварительные сведения

ТИПЫ КОМАНД

Мы видели, что команда машинного языка состоит из двух частей, поля операции и поля операндов. В Системе 360 существует по крайней мере три различных типа операндов. Операнд может находиться в регистре общего назначения, храниться в памяти, его значение также может быть указано в самой команде. Операнды последнего типа называются непосредственными операндами. В пяти типах команд встречаются различные комбинации операндов различных типов. Каждый тип команд языка ассемблера соответствует определенному формату машинного языка. Тип команды определяется типом ее операндов. Существуют следующие типы команд (в скобках указаны стандартные сокращения их названий):

Регистр-Регистр (RR): оба операнда хранятся в регистрах общего назначения.

Регистр-Индексированная Память (RX): первый операнд — в регистре общего назначения, второй — в ячейке памяти, которая может быть указана с использованием индекс-регистра.

Регистр-Память (RS): первые два операнда в регистрах, третий— в основной памяти.

Память-Память (SS): оба операнда находятся в основной памяти. Память-Непосредственный операнд (SI): первый операнд в памяти, второй задан в самой команде.

Рассмотренное разделение команд по типам чисто механическое, тип команды зависит исключительно от типов операндов и нужен для правильного написания соответствующей команды и правильного задания операндов. Можно классифицировать команды в соответствии с действиями, которые по ним выполняются, т. е. в соответствии с функциями команд. Таким способом можно разделить все существующие команды на пять основных категорий.

Команды пересылки: по командам этого типа производится пересылка информации из одной области памяти в другую. Например, команда MVCслужит для пересылки содержимого областей памяти по новому адресу, а команда LRпересылает содержимое одного регистра в другой регистр.

Арифметические команды: именно эти команды действительно преобразуют информацию. К этому типу относятся такие операции, как «сложить», «умножить», логические операции «и», «или» и некоторые другие команды, изменяющие форму хранимой информации.

Команды сравнения: часто требуется сравнить поля информации без нарушения их содержимого. Мы, например, можем установить, больше ли содержимой регистра 3 содержимого регистра 10, с помощью команды сравнения формата RR.

Команды перехода: эти команды используются для изменения обычного порядка выполнения команд в программе. Существуют команды условного и безусловного перехода. Например, можно использовать команду условного перехода для выбора следующей команды из некоторой заданной ячейки, если результат выполнения предшествующей команды сложения окажется отрицательным.

Команды ввода-вывода: эти команды осуществляют управление работой периферийных устройств и соответствующими потоками информации.

Тип и функция позволяют определить группу, из которой следует выбирать команду, наиболее подходящую для выполнения заданных действий. Размещение операндов в памяти и их тип определяют тип команды; выполняемое по данной команде действие характеризует функцию команды. Во многих случаях эта классификация позволяет программисту однозначно выбрать необходимую команду. Иногда требуется дальнейший выбор, например выбор соответствующей арифметической команды. В любом случае описанная классификация достаточно полезна программисту, пишущему на языке ассемблера.

В нескольких последующих главах будет рассмотрен каждый тип команд в отдельности. Будут показаны типичные примеры применения команд каждого типа и подробно рассмотрены их эквиваленты на машинном языке. По окончании рассмотрения всех пяти типов команд мы будем готовы к применению основных изученных принципов в некоторых специальных случаях программирования на языке ассемблера.

Всюду в дальнейшем мы будем пользоваться символической формой рассматриваемой команды. При этом мы будем демонстрировать возможности записи команд в этой символической форме по мере необходимости. Пока заключим следующее соглашение: все операнды, находящиеся в регистрах, мы будем обозначать с помощью буквы Rс последующим указанием номера соответствующего операнда. Так, например, R2 может означать операнд, находящийся в любом из 16 регистров общего назначения, причем этот операнд является вторым операндом данной команды. Содержимое данного регистра обозначается заключением его адреса в круглые скобки. Поэтому (5) обозначает либо содержимое ячейки памяти с номером 5, либо содержимое регистра 5. В каждом конкретном случае будет ясно, что представляет собой адрес, заключенный в скобки.

Мы будем также использовать стрелку () для обозначения операции запоминания результата в регистре или в ячейке памяти. Используя все эти соглашения, можно символически записать результат выполнения команды ARкак

что можно выразить словами так: «Содержимое регистра, указанного первым, сложено с содержимым регистра, указанного вторым, и результат помещен в первый регистр». Конец стрелки направлен влево, так как в большинстве случаев это отвечает реальному направлению перемещения информации. Результат выполнения операции обычно запоминается в регистре или ячейке памяти, заданных в качестве первого операнда, т. е. указанных первыми в поле операндов команды.

Обычно нас интересует, что происходит, если команда написана и выполняется правильно. Однако случается и так, что вследствие нашей ошибки производится попытка выполнения команды, которое невозможно завершить или которое по завершении дает бессмысленные результаты. Мы уже видели, что попытка сложить два слишком больших числа может привести к ситуации, называемой переполнением; в результате обычно получается число, которое никак нельзя рассматривать как сумму двух исходных чисел.

Ошибки, приводящие к попыткам выполнения того, для чего ЭВМ не предназначена, называются особыми случаями в программе. Они обычно приводят к прерыванию выполнения нашей программы и выдаче некоторой информации, по которой можно судить о причине прерывания. Сообщение выдается в форме, которая будет рассмотрена в гл. 12; пока мы будем просто отмечать возможность возникновения таких ситуаций.

{toc_noshowall}

 
Статьи раздела