Optron #30
03 сентября 1999

Ликбез - Ассемблер взгляд издалека: Что такое сдвиг?

<b>Ликбез</b> - Ассемблер взгляд издалека: Что такое сдвиг?
       Ассемблер - взгляд издалека

               Продолжение.
    Начало в || 20, 21, 24, 25, 28, 29

{}Инфарх, 1999

              Команды сдвига

             Что такое сдвиг?

  Смысл сдвига в том,  что все биты в бай-
те, не меняя своего положения относительно
друг друга,  смещаются вправо или влево. А
в завсимости от типа команды биты, "уходя-
щие за край" байта, могут появиться с про-
тивоположной стороны (циклические  сдвиги)
или затеряться в первозданном хаосе (сдви-
ги простые или нециклические).

  Пример.
  Применим к числу

                %01100010

циклический сдвиг вправо.
  Результатом будет число

                %00110001

  А используя простой сдвиг влево, получим

                %1100010?

  Знак "?" означает, что бит принял состо-
яние, нам заранее неизвестное, и зависящее
от типа команды, состояния флагов и т.д.


       Команды сдвига аккумулятора

  Существуют четыре команды смещения битов
в аккумуляторе:

  RLCA
  RLA
  RRCA
  RRA

  Вторая буква  здесь  красноречиво свиде-
тельствует о направлении  сдвига.  Команды
"RLCA"  и  "RLA"  сдвигают  содержимое "А"
влево,  "RRCA" и "RRA" - вправо.  А если в
мнемонике  команды есть буква "C",  то это
указывает на участие в операции флага  пе-
реноса CY.
  Для пущей   наглядности  проиллюстрируем
исполнение таких команд.

       ┌──┐   ┌─┬─┬─┬─┬─┬─┬─┬─┐
       │CY│<─┬┤7│6│5│4│3│2│1│0│<─┐
       └──┘  │└─┴─┴─┴─┴─┴─┴─┴─┘  │
             └───────────────────┘

  Как видно из привeдённой схемы,  при вы-
полнении   "RLCA"  происходит  циклический
сдвиг битов аккумулятора влево. Бит, зани-
мавший крайнее левое положение (D7), пере-
ходит  на место крайне правого (D0)  и ко-
пируется  в  флаг  переноса "CY", а прочие
биты  просто  смещаются влево. Это можно с
успехом применять для проверки содержимого
крайнего бита:

       LD   A,%10011010
       RLCA
       JR   C,MET
       ...
MET

  Приведённый фрагмент   программы  вполне
пригоден к эксплуатации.  Естественно, за-
грузка "A" будет не такой явной, иначе ка-
кой смысл в проверке?  Но суть в том,  что
если в  старшем  бите  аккумулятора  будет
"1", то процессор совершит переход на мет-
ку "MET",  тем самым отказав в  исполнении
фрагменту програмы,  обозначенному в нашем
примере многоточием.
  А теперь - команда "RLA":

        ┌──┐   ┌─┬─┬─┬─┬─┬─┬─┬─┐
      ┌─┤CY│<──┤7│6│5│4│3│2│1│0│<─┐
      │ └──┘   └─┴─┴─┴─┴─┴─┴─┴─┘  │
      └───────────────────────────┘

  Перед вами циклический свиг аккумулятора
вправо. В отличие от "RLCA" здесь флаг пе-
реноса  тоже  принимает  участие в работе,
предоставляя своё  содержимое  в  качестве
ещё одного бита для сдвига.

  Пример.
  Если в "А" находится число

                %01101010,

и флаг  переноса установлен,  то после ис-
полнения "RLA" в "А" будет находится число

                %11010101,

и флаг "CY" окажется сброшенным.

  А вот сдвиги в противоположную сторону:

          ┌─┬─┬─┬─┬─┬─┬─┬─┐   ┌──┐
       ┌─>│7│6│5│4│3│2│1│0├─┬>│CY│
       │  └─┴─┴─┴─┴─┴─┴─┴─┘ │ └──┘
       └────────────────────┘

         ┌─┬─┬─┬─┬─┬─┬─┬─┐   ┌──┐
      ┌─>│7│6│5│4│3│2│1│0├──>│CY├─┐
      │  └─┴─┴─┴─┴─┴─┴─┴─┘   └──┘ │
      └───────────────────────────┘

  Как видите,  команды "RRCA" и "RRA" пол-
ностью идентичны рассмотренным  ранее,  за
исключением направления сдвига.


         Команды сдвига регистров
            общего назначения

  Выше мы рассмотрели действия с аккумуля-
тором.  Но и все прочие регистры также "не
остались обездоленными" в этом плане. Даже
наоборот, команд для них ещё больше.
  Есть, например, группа команд:

  RLC  s
  RL   s
  RRC  s
  RR   s

  В них "s" обозначает

        "(HL)", "(IX+d)", "(IY+d)"

или один из регистров:

    "A", "B", "C", "D", "E", "H", "L"

  Во всём остальном эти комады  аналогичны
тем,  что относятся к "A": "RLC s", "RL s"
выполняют сдвиг "s" влево, "RRC s", "RR s"
- вправо. Флаг переноса участвует в опера-
ции аналогичным образом.

  Рассмотрим теперь "SLA s" и "SRL s":

       ┌──┐   ┌─┬─┬─┬─┬─┬─┬─┬─┐
       │CY│<──┤7│6│5│4│3│2│1│0│<──0
       └──┘   └─┴─┴─┴─┴─┴─┴─┴─┘

           ┌─┬─┬─┬─┬─┬─┬─┬─┐   ┌──┐
       0──>│7│6│5│4│3│2│1│0├──>│CY│
           └─┴─┴─┴─┴─┴─┴─┴─┘   └──┘

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

  И, наконец, команда "SRA s":

       ┌────┐
       │   ┌┴┬─┬─┬─┬─┬─┬─┬─┐   ┌──┐
       └──>│7│6│5│4│3│2│1│0├──>│CY│
           └─┴─┴─┴─┴─┴─┴─┴─┘   └──┘

  Её можно рассматривать как операцию "де-
ление на два со знаком". В сдвиге принима-
ют участие только 7 младших бит, а старший
остаётся без изменения.
  Но не подумайте, что это всё! Существует
ещё...


             Сдвиг полубайтов

  Он выполняется по "RLD" и "RRD". Эти ко-
манды используются не так уж и часто. Быть
может, вам вообще не придётся обращаться к
ним.  Но, тем не менее, рассмотреть их всё
же надо. Итак, схема:

               ┌───────────────┐
      ┌─────╥──┴──┐   ┌─────╥──v──┐
      │7...4║3...0│   │7...4║3...0│
      └─────╨──^──┘   └─┬─^─╨──┬──┘
         A     └────────┘ └────┘ (HL)

               ┌───────────────┐
      ┌─────╥──v──┐   ┌─────╥──┴──┐
      │7...4║3...0│   │7...4║3...0│
      └─────╨──┬──┘   └─^─┬─╨──^──┘
         A     └────────┘ └────┘ (HL)

  Как видите,  в работе принимают  участие
одновременно как "A",  так и "(HL)". Обмен
между ними происходит группами по  4 бита,
причём старшие 4 бита аккумулятора остают-
ся без измнений.

   Пример.
   Если в аккумуляторе содержится байт

                %11010010,

а по адресу "HL" хранится байт

                %01111001,

то после  исполнения команды "RLD" в акку-
муляторе окажется число

                %11010111,

а "HL" будет адресовать байт

                %10010010

  Команда "RRD" выполняется аналогично, за
исключением,  конечно, направления сдвига,
как и видно на схеме.
  Ну  и,  конечно, рассмотрим такую важную
часть любой команды ассемблера, как...


      Влияние команд сдвига на флаги

      ╔═══════════╤═══════════════╗
      ║ Мнемоника │    Флаги      ║
      ║ операции  ├───────────────╢
      ║           │ C Z P/V S N H ║
      ╟───────────┼───────────────╢
      ║   RL s    │ x x  P  x 0 0 ║
      ║   RR s    │ x x  P  x 0 0 ║
      ║   RLC s   │ x x  P  x 0 0 ║
      ║   RRC s   │ x x  P  x 0 0 ║
      ║   RLA     │ x .  .  . 0 0 ║
      ║   RRA     │ x .  .  . 0 0 ║
      ║   RLCA    │ x .  .  . 0 0 ║
      ║   RRCA    │ x .  .  . 0 0 ║
      ║   RLD     │ . x  P  x 0 0 ║
      ║   RRD     │ . x  P  x 0 0 ║
      ╚═══════════╧═══════════════╝

  Вот и всё влияние!
  Все обозначения в  таблице  должны  быть
вам знакомы из прошлых занятий. Единствен-
ный новый знак - "s", но о нём было сказа-
но выше.

          Продолжение следует...




Другие статьи номера:

Non Possumus - Критические отметки на рубрику ZX-Обоз.

ZX-Обоз - Обзор электронной прессы: ZX-Pilot 31, Born Dead 0A, 0B, Nicron 109, Don News 8, C-Net Week 19, Полесье 9.

Ликбез - Ассемблер взгляд издалека: Что такое сдвиг?

Лит. страничка - Три веселых буквы: отзывы к газете.

Обратная связь - Отклики читателей о газете.

Реклама - Реклама и объявления...

Рубрика X - Новелла к "Черному ворону" - не хвались идучи на рать.

Хобби - Искусство Бонсаи.

Четыре килобайта - С началом Нового учебного года!


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Вступление - стихи и содержание номера.
Жyрнaл Miracle #03 нa ХАЛЯВУ !!! - Paздaчa cлoнoв oт ТRIUMPН: Итaк вam прeдocтaвляeтcя yникaльнaя вoзmoжнocть пoлyчить бecплaтнyю кoпию нaшeгo diskzine...
Обьявление - Ищем дрyзей пo Sрeссy!
HARDWARE - Переключатель режимов работы Profi/Pentagon.
Wanted - Список Заслуженных Пользователей AC Edit.

В этот день...   21 ноября