Cтраница 2
При выполнении любой команды десятичной арифметики проверяется, действительно ли поля операндов содержат упакованные десятичные числа. Все полубайты поля операнда, кроме знакового, должны содержать шестнадцатеричные цифры от 0 до 9, а знаковый полубайт должен иметь значение от А до F. Если поля операндов содержат недопустимый код цифры или знака, выполнение команды прерывается, и программа, содержащая такую команду, не может продолжаться. [16]
Второй операнд помещается на место первого при условии, что перекрытие полей операндов не влияет на окончательное содержимое поля первого операнда. Если младшие позиции байтов поля первого операнда остались незаполненными, в них помещается символ-заполнитель. [17]
В силу этого выполнение команд десятичной арифметики в упакованном формате в случае полей операндов разной длины требует соответствующего знания особенностей этих команд. Если указатель длины первого десятичного операнда больше, чем указатель длины второго операнда, то обычно не возникает никаких трудностей для успешного завершения выполнения команды. Однако если указатель длины второго операнда больше, чем указатель длины первого операнда, то выполнение программы, использующей команды десятичной арифметики, вполне может привести к десятичному переполнению и программному прерыванию. [18]
![]() |
Схема алгоритма выполнения команд УПАКОВАТЬ, РАСПАКОВАТЬ. ПЕРЕСЫЛКА СО СДВИГОМ.| Пример расположения в регистровой памяти. [19] |
Особенность этих команд состоит в том, что по принципам работы ЕС ЭВМ поля операндов могут перекрываться. Поэтому их обработка должна вестись так, как будто каждый байт результата записывается в память после того, как были выбраны необходимые байты операнда. Это требует большого количества обращений в оперативную память, равного удвоенному числу байтов результата. [20]
Должно быть ясно теперь, что при таком подходе код для каждой функции ( поля операндов и списки выходов каждой инструкции) не изменяется при вычислении функции. Отсюда следует, что копирование тела применяемой функции в стек не является необходимым. [21]
Высказывания языка ассемблера состоят из четырех полей: поля метки, поля операции, поля операндов и поля комментариев. Метки используются для того, чтобы обеспечить символические имена для адресов памяти. Они нужны для того, чтобы можно было совершить переход к командам. Они также нужны для слов с данными, чтобы по символическому имени можно было получить доступ к тому месту, где они хранятся. [22]
Во всех командах обработки десятичных данных, за исключением ОТРЕДАКТИРОВАТЬ и ОТРЕДАКТИРОВАТЬ И ОТМЕТИТЬ, либо поля операндов не должны перекрываться совсем, либо у них должны совпадать самые правые байты. В команде СЛОЖЕНИЕ С ОЧИСТКОЙ поля операндов могут перекрываться, но при этом самый правый байт первого операнда должен находиться правее самого правого байта второго операнда; при правильном перекрытии операндов результат будет получен такой же, как если бы операнды обрабатывались справа налево. Так как в процессе выполнения арифметических операций коды цифр и знаков проверяются, то неправильное перекрытие полей операндов рассматривается как особый случай в данных. В командах редактирования перекрытие операндов приводит к непредсказуемым результатам. [23]
Иными словами, ассемблер вместо макрокоманды в исходную программу подставляет команды из макроопределения, заменяя каждую псевдопеременную соответствующей переменной из поля операндов макрокоманды. [24]
После того как все символы определены, становится возможным завершить ассемблирование, обрабатывая каждую карту и определяя значения кодов операций и полей операндов. Кроме того, в процессе второго просмотра сгенерированные коды должны быть представлены в соответствующем формате для последующей обработки загрузчиком и должен быть напечатан листинг, содержащий исходную программу и эквивалентную сгенерированную программу в шестнадцатеричном представлении. Счетчик адреса устанавливается, как и в первом просмотре. Обработка карт осуществляется следующим образом. [25]
![]() |
Процессор с управлением потоком данных. [26] |
Результат выполнения команды над ее непосредственно адресуемыми операндами направляется через командный коммутатор ( КК) согласно указанным в команде адресам в ячейки команд и помещается в поля операндов. Далее указанная процедура циклически повторяется, причем управление этим процессом полностью децентрализовано и не нуждается в счетчике команд. [27]
При использовании макрокоманд код операции может быть длиннее; в этом случае под код операции отводится столько позиций, сколько требуется, но поле кода операции должно отделяться от следующего поля ( поля операндов) хотя бы одним пробелом. [28]
![]() |
Схема алгоритма выполнения команд УПАКОВАТЬ, РАСПАКОВАТЬ. ПЕРЕСЫЛКА СО СДВИГОМ.| Пример расположения в регистровой памяти. [29] |
При этом поле каждого операнда занимает несколько операционных регистров с последовательно возрастающими номерами так, чтобы позиции соответствующих байтов операнда в ОП и регистровой памяти совпали. Если поля операндов в ОП перекрываются, то они перекрываются и в регистровой памяти. Второй операнд выбирается из ОП и помещается в регистровую память в отведенное для него поле. Поле первого операнда в регистровой памяти определяет поле записи результата. [30]