- •Тема 2. Архітектура процесора і мова асемблера: Основи програмування на мові асемблера
- •4.1. Команди лінійного зсуву
- •Р ис. 11.3 - Схема роботи команд лінійного арифметичного зсуву.
- •4.2. Команди циклічного зсуву
- •Р ис.11.4 - Схема роботи команд простого циклічного зсуву
- •4.3. Додаткові команди зсуву
4.1. Команди лінійного зсуву
До команд цього типу відносяться команди, що здійснюють зсуви за наступним алгоритмом:
• черговий "висуваємий" біт встановлює прапор cf;
• біт, що вводиться в операнд з іншого кінця, має значення 0;
• при зсуві чергового біта він переходить в прапор cf, при цьому значення попереднього зсунутого біта втрачається!
Команди лінійного зсуву поділяються на два підтипи:
• команди логічного лінійного зсуву;
• команди арифметичного лінійного зсуву.
До командам логічного лінійного зсуву відносяться наступні:
shl операнд, лічильник_зсувів (Shift Logical Left) - логічний зсув вліво. Вміст операнда зсувається вліво на кількість бітів, яке визначається значенням лічильник_зсувів. Справа (у позицію молодшого біта) вписуються нулі;
shr операнд, лічильник_зсувів (Shift Logical Right) - логічний зсув вправо. Вміст операнда зсувається вправо на кількість бітів, яке визначається значенням лічильник_зсувів. Зліва (в позицію старшого, знакового біта) вписуються нулі. На рис. 11.2 показаний принцип роботи цих команд.
Рис. 11.2 - Схема роботи команд лінійного логічного зсуву
Нижче показано фрагмент програми, який виконує перетворення двох неупакованих BCD-чисел у слові пам'яті bcd_dig в упаковане BCD-число в регістрі al.
-
...
bcd_dig dw 0905h ; опис неупакованого BCD-числа 95
...
mov ax,bcd_dig ; пересилання
shl ah,4 ; зсув вліво
add al,ah ;додавання для отримання результату: al = 95h
Команди арифметичного лінійного зсуву відрізняються від команд логічного зсуву тим, що вони особливим чином працюють зі знаковим розрядом операнда.
sal операнд,лічильник_зсувів (Shift Arithmetic Left) - арифметичний зсув вліво. Вміст операнда зсувається вліво на кількість бітів, яка визначається значенням лічильник_зсувів. Справа (у позицію молодшого біта) вписуються нулі. Команда sal не зберігає знаку, але встановлює прапор cf у випадку зміни знака черговим висуваємим бітом. В іншому команда sal повністю аналогічна команді shl;
sar операнд,лічильник_зсувів (Shift Arithmetic Right) - арифметичний зсув вправо. Вміст операнда зсувається вправо на кількість бітів, яка визначається значенням лічильник_зсувів. Зліва в операнд вписуються нулі. Команда sar зберігає знак, відновлюючи його після зсуву кожного чергового біта. На рис. 11.3 показаний принцип роботи команд лінійного арифметичного зсуву.
Р ис. 11.3 - Схема роботи команд лінійного арифметичного зсуву.
4.2. Команди циклічного зсуву
До команд циклічного зсуву відносяться команди, що зберігають значення зсуваних бітів. Є два типи команд циклічного зсуву:
• команди простого циклічного зсуву;
• команди циклічного зсуву через прапор переносу cf.
До команд простого циклічного зсуву відносяться:
rol операнд, (Rotate Left) - циклічний зсув вліво. Вміст операнда зсувається вліво на кількість бітів, яка визначається операндом лічильник_зсувів. Біти, що зсуваються вліво, записуються в той же операнд справа.
ror операнд, (Rotate Right) - циклічний зсув вправо. Вміст операнда зсувається вправо на кількість бітів, яка визначається операндом лічильник_зсувів. Біти, що зсуваються вправо, записуються в той же операнд зліва.
... mov eax,ffff0000h mov cl,16 rol eax,cl |
Команди циклічного зсуву через прапор переносу cf відрізняються від команд простого циклічного зсуву тим, що зсуваємий біт не відразу потрапляє в операнд з іншого його кінця, а записується спочатку в прапор переносу cf. Лише наступне виконання даної команди зсуву (за умови, що вона виконується в циклі) призводить до поміщення висунутого раніше біту з іншого кінця операнда (див. рис. 11.5).
До команд циклічного зсуву через прапор переносу cf відносяться наступні:
rcl операнд, (Rotate through Carry Left) - циклічний зсув вліво через перенесення. Вміст операнда зсувається вліво на кількість біт, яка визначається операндом лічильник_зсувів. Біти, що зсуваються, по черзі стають значенням прапора переносу cf.