Программирование функций сдвига в STL

Доступные пользователю функции сдвига приведены в таблице 2.9. Их обозначение зависит от способа задания количества разрядов, на которое осуществляется сдвиг. Число позиций для функции сдвига может быть задано двумя путями – в аккумуляторе 2 или в параметре инструкции.

Таблица 2.9 - Обзор функций сдвига

Функция сдвига W (слово) DW (двойное слово)
Число позиц. как параметр Число поз. в Accum2 Число позиц. как параметр Число поз. в Accum2
Сдвиг влево Slwn SLW Sldn SLD
Сдвиг вправо Srwn SRW Srdn SRD
Сдвиг со знаком Ssin SSI Ssdn SSD
Циклический сдвиг влево     Rldn RLD
Циклический сдвиг вправо     Rrdn RRD
Циклический сдвиг влево через бит СС1     RLDA  
Циклический сдвиг вправо через бит СС1     RRDA  

Так, например, сдвиг слова данных влево осуществляется инструкциями:

SLW n // Сдвиг слова данных влево на n разрядов

SLW // Сдвиг слова данных влево на количество разрядов, указанных в аккумуляторе 2

Функция сдвига SLW позволяет бит за битом сдвигать влево данные, которые находятся в младшем слове аккумулятора 1 ( с 0 по 15). При этом разряды, которые освобождаются при сдвиге указанных бит, заполняются нулями. Биты, которые находятся в старшем слове аккумулятора остаются без изменения. Перенесение данных в бит 16 не выполняется.

Если содержимое аккумулятора 1 (младшего слова) интерпретируется как целое типа INT, то сдвиг влево эквивалентный умножению на 2.

Для сдвига двойного слова данных влево следует применять инструкции:

SLD n; //сдвиг двойного слова влево на n разрядов

SLD; //сдвиг двойного слова данных влево на количество разрядов, указанных в аккумуляторе 2

При сдвиге слова данных вправо применяются инструкции:

SRW n;

SRW;

Если содержимое аккумулятора 1 (младшего слова) интерпретируется как целое число формата INT, то сдвиг вправо эквивалентный делению на 2.

Функции сдвига устанавливают бит состояния CC0 в "0", а бит CC1 в состояние, в котором находился последний перемещенный бит.

Биты состояния проверяются с помощью двоичного опроса или в операциях перехода.

Функция циклического сдвига с битом состояния CC1 смещает содержимое аккумулятора 1 на одну разрядную позицию.

Примеры программирования функций сдвига:

L MW 130;

SLW 4; //сдвиг слова на 4 разряда влево

T MW 132;

… …

L #actval;

SSI 2; //сдвиг слова данных на 2 разряда вправо со знаком

T #display;

При сдвиге числа INT со знаком инструкцией SSI освобождающиеся разряды заполняются значением знакового бита 15, то есть значением "0", если число положительное и значением "1", если число отрицательное.

При сдвиге двойного слова данных (числа типа DINT) со знаком применяется инструкция SSD. Разряды, которые освобождаются при сдвиге, заполняются значением бита 31, который содержит знак числа формата DINT.

Операции циклического сдвига RLD и RRD позволяют бит за битом сдвигать влево (RLD) или вправо (RRD) данные, которые находятся во всех разрядах аккумулятора 1. При этом освобожденный при сдвиге разряд заполняется значением бита, который был "вытолкнут" из аккумулятора последним.

Циклический сдвиг может также выполняться через бит состояния CC1.