Команды сдвига - Логические сдвиги

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

Начнем наше рассмотрение с примера. Пусть содержимое регистра 5 в двоичной форме записывается как

10 1000 0111 0010 1001 1100 1111 0110

Команда

SLL 5,6

(Shift Left Logical — СДВИГ ВЛЕВО КОДА) производит сдвиг содер¬жимого регистра 5 на 6 разрядов влево. Результат ее выполнения вы-

глядит так:

(5)=ООО11100101001110011110110000000

формат команд сдвига является модификацией формата RS. Как обычно, первый операнд указывает регистр. Содержимое этого регистра (или регистров) будет сдвинуто в процессе выполнения команды. В обычных командах формата RS вторым операндом является адрес области памяти. Однако в командах сдвига этот операнд не используется для адресации. В качестве второго операнда выступает S-адрес, использующийся в данном случае не по своему обычному назначению. Последние 6 битов суммы

D2+(B2)

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

SLL R1,D2(B2)

Shift Left Logical

Сдвиг R1 влево наD2-f(B2) разрядов

SRL R1,D2(B2)

Shift Right Logical

Сдвиг (R1) вправо на D2+(B2) разрядов (учитываются последние6 разрядов)

Команды логического сдвига обычно используются для придания двоичной информации более компактной формы. Например, чтобы запомнить последовательность, состоящую из 100 чисел в форме полных слов, требуется 3200 битов памяти. Если известно, что все числа положительные и не превышают 64, то для хранения каждого числа на самом деле оказывается достаточно 6 битов, всего 600 битов для всей последовательности. (Если быть более точными, то при хранении 5 чисел в каждом полном слове потребуется всего 640 битов.) На рис. 14.4 изображен программный сегмент, выполняющий упаковку 5 таких чисел, первоначально находящихся в последовательных словах памяти, в регистр 7. Перед записью каждого следующего числа необходимо предварительно сдвинуть содержимое регистра 7 влево на шесть разрядов с тем, чтобы освободить место для вновь записываемого числа. Непосредственная запись может быть произведена с помощью команды О (ИЛИ). После ее выполнения число оказывается в последних шести разрядах регистра.

Рис. 14.4. Размещение в регистре 7 пяти 6-битовых чисел, расположенных в полных словах памяти, начиная с адреса NMBRS.

При проведении обратного преобразования (т. е. при переводе данных из компактной формы в обычную) удобно использовать сдвиг содержимого одного регистра в другой. Для этого предусмотрены две команды двойного сдвига: SLDL (Shift Left Double Logical — СДВИГ ВЛЕВО ДВОЙНОЙ КОДА) и SRDL (Shift Right Double Logical — СДВИГ ВПРАВО ДВОЙНОЙ КОДА).

SLDR R1,D2(B2)

Shift Left Double Logical

Сдвиг (R1.R1 + 1) влево на D2 + (B2) разрядов

SRDL R1,D2(B2)

Shift Right Double Logical

Сдвиг (R1.R1+1) вправо на D2 + (B2) (учитываются последние6 разрядов)

Здесь R1 на самом деле является ссылкой сразу на два регистра, R1 и R1 + 1. R1 при этом должен быть четным. При выполнении двойных сдвигов 64-разрядное содержимое двух регистров рассматривается как единое число. При левом сдвиге теряются старшие биты R1. Старшие биты R1 +1 занимают места в правом конце R1. Освобождающимися в данном случае являются младшие разряды R1 + 1.

Пусть регистры 4 и 5 содержат соответственно

(4) =0011 ООП ООН 0101 0110 0111 1000 1001

(5) = 1100 1011 1010 1001 1000 0111 0110 0101

По команде

SLDL 4,7

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

Двойной сдвиг вправо выполняется совершенно аналогично. Теряется содержимое младших разрядов R1 + 1. Биты из младших разрядов R1 попадают в старшие разряды R1 + 1. И, наконец, старшие разряды R1, освобождаясь, заполняются нулями.

Как уже упоминалось, двоичные сдвиги используются для «распаковки» двоичной информации. Предположим, что из слова BITDATA требуется выделить число, расположенное в битах 13—18, и затем записать его уже в обычной форме по адресу BITS. Приводимая ниже последовательность команд обеспечивает выполнение требуемых действий.

L 11,BITDATA

SLDL 10,13

LA 10,0

SLDL 10,5

ST 10,BITS

На рис. 14.5 приведен программный сегмент, предназначенный для «распаковки» содержимого регистра 7 (см. программу рис. 14.4) и записи результатов в форме полных слов последовательно, начиная со слова NMBRS.

 



 
Оглавление
Статьи раздела