Команда ZAP. Пересылка десятичной информации

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

Вы помните, что при рассмотрении команды МР мы столкнулись с определенного рода проблемой. Необходимо было каким-то образом организовать дополнение десятичного числа спереди желаемым количеством нулей. Эта задача была нами решена простой пересылкой числа в область, предварительно заполненную нулями. Команда ZAP (СЛОЖЕНИЕ С ОЧИСТКОЙ) позволяет получить тот же результат гораздо более эффективно. Эта команда также может оказаться чрезвычайно полезной в некоторых других ситуациях.

ZAP D1(L1,B1),D2(L2,B2)

Zero and Add Packed

D1 +(B1)?0L1;D1+(B1)? (D1 +(B1))L1 + (D2 + (B2))L3

Выполнение команды ZAP проходит в два этапа. Сначала поле первого операнда заполняется десятичными нулями. Первоначальное содержимое этой L1-байтовой области при выполнении команды не играет роли. Затем второй операнд складывается по правилам десятичной арифметики с «очищенным» первым операндом. Этот шаг практически выполняется аналогично выполнению команды АР с нулевым первым операндом.

Признак результата вырабатывается по тем же правилам, что и при выполнении команды АР. Если первый операнд по размерам уступает получившейся сумме, то фиксируется десятичное переполнение.

Пусть, например, мы хотим произвести пересылку 5-байтового десятичного числа, находящегося в памяти по адресу В, в 7-байтовую область С, дополнив его спереди четырьмя незначащими нулями. Для этого достаточно выполнить команду

ZAP С(7),В(5)

При этом в соответствии с содержимым поля В будет установлен признак результата. Если исходным содержимым В являлось

678901234D

то после выполнения команды в поле С будем иметь

С: 0000678901234D

Первоначальное содержимое поля С на процесс выполнения команды ZAP никакого влияния не оказывает. С другой стороны, при попытке выполнения команды

ZAP С(3),В(5)

будет зафиксировано десятичное переполнение, так как четыре первые цифры числа В в отведенную область не помещаются.

Возвращаясь к примеру использования команды МР, описанному в разд. 16.2.2, где требуется умножить 5-байтовое десятичное число, находящееся в памяти по адресу NUM1, на 6-байтовое число, расположенное по адресу NUM2, мы теперь знаем, каким образом можно дополнить первый операнд таким количеством незначащих нулей, чтобы произведение поместилось в поле первого операнда независимо от содержимого полей NUM1 и NUM2. Использование команды ZAP, производящей пересылку NUM1 в некоторую рабочую область и одновременно дополняющей его нужным количеством нулей, позволяет достичь желаемой цели:

ZAP ТЕМР1(11),NUM1(5)

Если первоначальным содержимым поля NUM1 являлось

1038000 10С

то в результате выполнения команды ZAP содержимое поля TEMP примет следующий вид:

TEMPI: 0000000000001038000 10С

независимо от его первоначального содержимого. Значение вырабатываемого признака результата будет равно 2. Далее следует выполнить ту же, что и раньше, команду МР:

МР ТЕМР1(1 !),NUM2(6)

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



 
Оглавление
Команда ZAP. Пересылка десятичной информации
Команды MVZ, MVN и MVO
Команда SRP