Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11656
Последний выпуск: 19.06.2015

СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0


Оглавление

                      Сдвиги и циклические сдвиги
-----------------------------------------------------------------

     В процессорах 8086 имеется множество способов, с помощью ко-
торых  можно сдвигать биты регистра или переменной в памяти влево
или вправо. Простейшим из них является логический сдвиг.

     Инструкция SHL (сдвиг влево, синоним - SAL) перемещает  каж-
дый бит операнда-приемника на один разряд влево, по направлению к
самому  значащему  биту.  На  Рис.  5.8  показано,  как  значение
100010110b (96h или 150 в десятичном представлении), записанное в
AL, сдвигается влево с помощью инструкции SHL AL,1. В  результате
получается  значение  00101100b  (24Ch или 44 в десятичном виде),
которое записывается обратно в регистр AL. Флаг переноса устанав-
ливается в значение 1.

                              AL
   ----------------------------------------------------------
   | -----  -----  -----  -----  -----  -----  -----  ----- |
---| | 1 |<-| 0 |<-| 0 |<-| 1 |<-| 0 |<-| 1 |<-| 1 |<-| 0 | |<--
|  | -----  -----  -----  -----  -----  -----  -----  ----- |  |
|  ----------------------------------------------------------  |
| Бит  7      6      5      4      3      2      1      0      |
|    -----                                                     |
---->|   |                                         0 -----------
     -----
 Флаг переноса

     Рис. 5.8 Пример выполнения сдвига влево.

     Самый значащий (старший) бит вовсе сдвигается из  операнда и
попадает во флаг переноса, а в наименее значащий бит заносится 0.

     Для чего используется сдвиг влево? Чаще всего  это  делается
для  выполнения с помощью операции SHL умножения на степень числа
2, так как каждая инструкция SHL умножает операнд на 2. Например,
с помощью следующих инструкций DX умножается на 16:

           .
           .
           .
           shl   dx,1   ; DX * 2
           shl   dx,1   ; DX * 4
           shl   dx,1   ; DX * 8
           shl   dx,1   ; DX * 16
           .
           .
           .

     Умножение с помощью сдвига выполняется гораздо быстрее,  чем
с помощью операции MUL.

     Как вы могли заметить, в предыдущем примере в инструкции SHL
используется второй операнд - значение 1. Этот операнд указывает,
что содержимое DX нужно сдвинуть на 1 бит. К сожалению, процессор
8086  не  поддерживает  использования в качестве константы сдвига
других, отличных от 1 постоянных значений - 2, 3 и т.д. Однако, в
качестве  счетчика сдвигов допускается использование регистра CL.
Например, инструкции:

           .
           .
           .
           mov   cl,4
           shl   dx,cl
           .
           .
           .

умножают содержимое  регистра DX на 16 (как и в предыдущем приме-
ре).

     Если есть сдвиг влево, то логично было бы предположить,  что
существует  также  сдвиг  вправо,  и это так. Фактически, имеется
даже две операции сдвига вправо. Инструкция  SHR  (сдвиг  вправо)
очень похожа на инструкцию SHL. Она выполняет сдвиг разрядов опе-
ранда  вправо  на 1 или CL бит,  затем сдвигает наименее значащий
бит во флаг переноса и помещает 0 в самый значащий бит.  Инструк-
ция  SHR  дает  быстрый способ выполнения беззнакового деления на
степень числа 2.

     Инструкция  SAR  (арифметический  сдвиг  вправо)  аналогична
инструкции  SHR,  только  при ее выполнении наиболее значащий бит
операнда сдвигается вправо в следующий бит,  а  затем  копируется
обратно.  На  Рис.  5.9 показано, как значение 10010110b (96h или
-106 в десятичном представлении со знаком), записанное в регистре
AL, сдвигается вправо с помощью инструкции SAR AL,1. В результате
получается значение 11001011b (0CBh или -53 в  десятичном  предс-
тавлении  со  знаком), которое записывается обратно в регистр AL.
Флаг переноса устанавливается в значение 0.

                              AL
------------------------------------------------------------
|   ------                                                 |
|   |    |                                                 |
|   V    |                                                 |
| -----  | -----  -----  -----  -----  -----  -----  ----- |
| | 1 |<---| 0 |<-| 0 |<-| 1 |<-| 0 |<-| 1 |<-| 1 |<-| 0 | |<--
| -----    -----  -----  -----  -----  -----  -----  ----- |  |
----------------------------------------------------------    |
  Бит  7      6      5      4      3      2      1      0     |
                                                     -----    |
                                                     |   |-----
                                                     -----
                                             Флаг переноса

     Рис. 5.9 Пример выполнения  инструкции  SAR  (арифметический
сдвиг вправо).

     Таким образом, при выполнении данной инструкции  сохраняется
знак  операнда,  поэтому  инструкцию SAR полезно использовать для
выполнения деления со знаком на степень числа 2. Например, в  ре-
зультате выполнения инструкций:

           .
           .
           .
           mov   bx,-4
           sar   bx,1
           .
           .
           .

в регистре BX будет записано значение -2.

     В наборе инструкций процессора  8086  имеется  также  четыре
инструкции  циклического  сдвига: ROR, ROL, RCR и RCL. Инструкция
ROR аналогична  инструкции  SHR,  но  при  ее выполнении наименее
значащий бит сдвигается в наиболее значащий бит,  а также во флаг
переноса.  На Рис. 5.10 показано, как значение 10010110b (96h или
159  в  десятичном  представлении),  записанное  в  регистре  AL,
циклически  сдвигается  вправо  с помощью инструкции ROR AL,1.  В
результате  получается  значение  01001011b  (04Bh   или   75   в
десятичном представлении), которое записывается обратно в регистр
AL. Флаг переноса устанавливается в значение 0.

                              AL
   ----------------------------------------------------------
   | -----  -----  -----  -----  -----  -----  -----  ----- |
-->| | 1 |->| 0 |->| 0 |->| 1 |->| 0 |->| 1 |->| 1 |->| 0 | |---
|  | -----  -----  -----  -----  -----  -----  -----  ----- |  |
|  ----------------------------------------------------------  |
| Бит  7      6      5      4      3      2      1      0      |
|                                                              |
---------------------------------------------------------------|
                                                      -----    |
                                Флаг переноса         |   |<----
                                                      -----
      Рис. 5.10 Пример выполнения операции ROR (циклический сдвиг
вправо).

      Операция ROL имеет  действие,  обратное  действию  операции
ROR. Операнд также сдвигается циклически,  но  сдвиг  выполняется
влево. При этом наиболее значащий бит сдвигается в наименее  зна-
чащий.  Инструкции ROR и ROL полезно использовать для  переупоря-
дочивания бит в байте или в слове.  Например, в результате выпол-
нения инструкций:

           .
           .
           .
           mov   si,49F1h
           mov   cl,4
           ror   si,cl
           .
           .
           .

в регистр SI будет записано значение 149Fh: биты 3-0 переместятся
в биты 15-12, биты 7-4 - в биты 3-0 и т.д.

     Инструкции RCR и RCL работают несколько по-другому. Инструк-
ция  RCR  аналогично  инструкции сдвига вправо, при этом наиболее
значащий бит сдвигается из флага переноса. На Рис. 5.11 показано,
как  значение 10010110b (96h или 159 в десятичном представлении),
записанное в регистре AL, циклически сдвигается вправо через флаг
переноса, начальное значение которого равно 1, с помощью инструк-
ции RCR AL,1. В результате получается  значение  11001011b  (0CBh
или 203 в десятичном представлении), которое записывается обратно
в регистр AL. Флаг переноса устанавливается в значение 0.

                              AL
   ----------------------------------------------------------
   | -----  -----  -----  -----  -----  -----  -----  ----- |
-->| | 1 |->| 0 |->| 0 |->| 1 |->| 0 |->| 1 |->| 1 |->| 0 | |---
|  | -----  -----  -----  -----  -----  -----  -----  ----- |  |
|  ----------------------------------------------------------  |
| Бит  7      6      5      4      3      2      1      0      |
|                                                     -----    |
------------------------------------------------------| 1 |<----
                                                      -----
                                               Флаг переноса

     Рис. 5.11  Пример  выполнения  инструкции  RCR  (циклический
сдвиг вправо и перенос).

     Инструкция RCL аналогично,  соответственно,  левому  сдвигу.
При выполнении этой инструкции наименее значащий  бит  сдвигается
из флага переноса.  Инструкции RCR и RCL полезно использовать для
сдвига операнда, состоящего из нескольких слов. Например, следую-
щие  инструкции выполняют умножение значения в DX:AX,  размером в
двойное слово, на 4:

             .
             .
             .
             shl   ax,1  ; бит 15 регистра AX сдвигается во
                         ; флаг переноса
             rcl   dx,1  ; флаг переноса сдвигается в бит 0
                         ; регистра DX
             shl   ax,1  ; бит 15 регистра AX сдвигается во
                         ; флаг переноса
             rcl   dx,1  ; флаг переноса сдвигается в бит 0
                         ; регистра DX
             .
             .
             .

      Инструкции  циклического  сдвига,   аналогично  инструкциям
сдвига, могут сдвигать операнд на 1 бит или на число бит,  задан-
ных регистром CL.




Оглавление

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог