Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._11.doc
Скачиваний:
3
Добавлен:
05.05.2019
Размер:
172.03 Кб
Скачать

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

Як видно з рис. 11.4, команди простого циклічного зсуву в процесі своєї роботи здійснюють одну корисну дію, а саме: циклічно зсуваємий біт не тільки всовується у операнд з іншого кінця, але й одночасно його значення стає значенням прапора cf. Наприклад, для того щоб обміняти вміст двох половинок регістра eax, досить виконати наступну послідовність команд:

Команди циклічного зсуву через прапор переносу cf відрізняються від команд простого циклічного зсуву тим, що зсуваємий біт не відразу потрапляє в операнд з іншого його кінця, а записується спочатку в прапор переносу cf. Лише наступне виконання даної команди зсуву (за умови, що вона виконується в циклі) призводить до поміщення висунутого раніше біту з іншого кінця операнда (див. рис. 11.5).

До команд циклічного зсуву через прапор переносу cf відносяться наступні:

rcl операнд, (Rotate through Carry Left) - циклічний зсув вліво через перенесення. Вміст операнда зсувається вліво на кількість біт, яка визначається операндом лічильник_зсувів. Біти, що зсуваються, по черзі стають значенням прапора переносу cf.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]