Циклічний зсув
До команд циклічного зсуву відносяться команди, що зберігають значення бітів, що зрушуються. Є два типи команд циклічного зсуву:
- команди простого циклічного зсуву;
- команди циклічного зсуву через прапор перенесення CF.
Далі перераховані команди простого циклічного зсуву:
rol операнд_лічильник_зсувів - циклічний зсув вліво (Rotate Left). Вміст операнда зсувається вліво на кількість бітів, що визначається операндом лічильник_зсувів. Зсувні ліворуч біти записуються в той же операнд
rоrоперанд_лічильник_свитів - циклічний зсув вправо (Rotate Right). Вміст операнда зсувається праворуч на кількість бітів, що визначається операндом лічильник_зрушень. Зсувні вправо біти записуються в той же операнд зліва.
Команди простого циклічного зсуву в процесі своєї роботи здійснюють одну корисну дію: біт, що циклічно зрушується не тільки всувається в операнд з іншого кінця, але і одночасно його значення стає значенням прапора CF. Наприклад, щоб обміняти вміст двох половинок регістру ЕАХ, досить виконати таку послідовність команд:
mov eax, ffff0000h
Команди циклічного зсуву через прапор переносу CF відрізняються від команд простого циклічного зсуву тим, що біт, що зрушується, не відразу потрапляє в операнд з іншого його кінця, а спочатку записується у прапор переносу CF. Лише наступне виконання цієї команди зсуву (за умови, що вона виконується в циклі) призводить до приміщенню висунутого раніше біта в інший кінець операнда. Команди циклічного зсуву через прапор переносу CF перелічені далі:
rcl операнд, лічильник_зсувів - циклічний зсув вліво через перенесення (Rotate through Carry Left). Вміст операнда зсувається вліво на кількість бітів,визначається операндом лічильник_зрушень. Збиті біти по черзі стають значенням прапора переносу CF;
rcr операнд, лічильник_зсувів - циклічний зсув вправо через перенесення (Rotate through Carry Right). Вміст операнда зсувається праворуч на кількість бітів, що визначається операндом лічильник_зрушень. Збиті біти по черзі стають значенням прапора переносу CF.
При зсуві через прапор переносу з'являється проміжний елемент, за допомогою якого можна проводити заміну бітів, що циклічно зсуваються, зокрема, виконувати неузгодження бітових послідовностей. Під неузгодженістю бітової послідовності тут і далі мається на увазі дія, яка дозволяє деяким чином локалізувати та витягти потрібні ділянки цієї послідовності та записати їх в інше місце. Наприклад, розглянемо, як переписати до регістру ВХ старшу половину регістру ЄАХ з одночасним її обнуленням у регістрі ЕАХ:
mov cx,16 ;кількість зрушень для еах
clc ;скидання прапора cf 0
rcl eax.l ;зсув крайнього лівого біта з еах в cf
rcl bx, 1 переміщення біта з cf праворуч у Ьх
loopml; цикл 16 разів
rol еах,16 відновити праву частину еах
Команди простого циклічного зсуву можна використовувати для операцій іншого
гого роду. Наприклад, підрахуємо кількість одиничних бітів у регістрі ЕАХ:
хог dx.dx; очищення dx для підрахунку одиничних бітів
mov з х, 3 2; число циклів підрахунку
cycl: ;мітка циклу
гог еах,1 циклічний зсув вправо на 1 біт
jnc not_one ;перехід, якщо черговий біт у cf
;не дорівнює одиниці
inc dx збільшення лічильника циклу
loopcycl ;перехід на мітку cycl, якщо
; значення в сх не дорівнює 0
Цей фрагмент не вимагає особливих пояснень,єдине, що необхідно пам'ятати, особливості роботи команди циклу ШОР (глава 10). Команда ШОР порівнює значення регістру ЕСХ/СХ з нулем і, якщо воно не дорівнює нулю, виконує зменшення ЕСХ/СХ на одиницю і передає керування на мітку в програмі, зазначену в цій команді як операнда.