
- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •1. Арифметические команды
- •2. Логические команды
- •3. Сдвиговые команды
- •4. Команды передачи управления и управления флагами
- •5. Формат строк ассемблера. Метки и их использование
- •6. Директивы распределения памяти
- •7. Сегменты
- •8. Прерывания
- •9. Директивы порядка загрузки сегментов
- •10. Директивы управления программным счетчиком
- •11. Условия
- •12. Процедуры
- •13. Глобальные объявления
- •14. Макроопределения
- •15. Выражения
- •16. Директивы управления файлами
- •17. Резидентные программы
- •Библиографический список
- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •400005, Волгоград, просп. Ленина, 28, корп.1
- •400005, Волгоград, ул. Советская, 35, корп.7
3. Сдвиговые команды
Сдвиговые команды можно разделить на три основных типа: команды арифметического, логического и циклического сдвигов. Перечислим их:
- SAR – арифметический сдвиг вправо;
- SAL - арифметический сдвиг влево;
- SHR – логический сдвиг вправо;
- SHL – логический сдвиг влево;
- ROR – циклический сдвиг вправо;
- ROL – циклический сдвиг влево;
- RCR – циклический сдвиг вправо с учетом флага переноса CF;
- RCL – циклический сдвиг влево с учетом флага переноса CF.
Формат любой из команд имеет следующий вид:
SAR приемник, счетчик.
Приемник, как и в других случаях, может быть регистром или переменной, а вот операнд «счетчик» может являться либо числом, либо регистром СL (младшей частью регистра-счетчика CX). В последнем варианте используется лишь младшая часть регистра по причине эффективного применения доступных ресурсов. Весь регистр-счетчик не требуется, поскольку число позиций, на которые будет осуществлен сдвиг, в любом случае поместится в одном байте, слово тут излишне.
SAR AX, 2; использование непосредственного значения
SAR AX, CL; использование СL в качестве операнда «счетчик».
Команды арифметического и логического сдвига похожи друг на друга по логике действия, поэтому опишем их работу в связке. Эти команды выполняют двоичный сдвиг приемника (регистр или переменная) вправо (в сторону старшего бита) или влево (в сторону младшего бита) на значение счетчика. Отметим, что сдвиг на одну позицию влево или вправо в данных случаях идентичен умножению или делению на два соответственно.
К тому же команды SAL и SHL – по сути одно и то же, просто названное по разному. При каждом шаге сдвига старший бит заносится в CF, все биты сдвигаются влево на одну позицию, и младший бит обнуляется.
Команда логического сдвига вправо SHR по своему действию противоположна двум предидущим - младший бит заносится в CF, все биты сдвигаются на 1 вправо, старший бит обнуляется. С точки зрения арифметики ее ставим в соответствие беззнаковому целочисленному делению на 2.
При выполнении арифметического сдвига вправо SAR действия похожи на работу SHR, но старший бит не обнуляется, а сохраняет предыдущее значение. SAR, таким образом, аналогична знаковому делению на 2, но, в отличие от IDIV, округление происходит не в сторону нуля, а в сторону отрицательной бесконечности.
Кроме того, для всех команд арифметического и логического сдвига бит, который выталкивается за крайнюю левую или правую позицию приемника, а в освободившиеся ячейки заносятся нули.
Команды циклического сдвига отличаются от ранее рассмотренных. Начнем с того, что бит, который выталкивается за крайнюю левую или правую позицию приемника, не «проваливается в никуда», как в случае арифметического и логического сдвига, а появляется в крайней правой (младшей) или крайней левой (старшей) позиции.
Данные команды осуществляют циклический сдвиг приемника на число бит, указанное в счетчике. При выполнении циклического сдвига на 1 команды ROR (ROL) сдвигают каждый бит приемника вправо (влево) на одну позицию, за исключением самого младшего (старшего), который записывается в позицию самого старшего (младшего) бита. Команды RCR и RCL выполняют аналогичное действие, но включают флаг CF в цикл, как если бы он был дополнительным битом в приемнике.