Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
468028.rtf
Скачиваний:
4
Добавлен:
09.11.2019
Размер:
701.39 Кб
Скачать

Команды сдвига.

Все команды сдвига имеют два операнда. Первый из них (байт или слово) рассматривается просто как набор битов, которые будут сдвигаться на несколько позиции влево или вправо. Второй же операнд рассматривается как целое без знака и определяет, на сколько разрядов надо сдвинуть первый операнд. Результат сдвига записывается на место первого операнда.

В микропроцессоре каждая команда сдвига имеет две разновидности, которые на языке ассемблера записываются следующим образом:

<мнемокод> operand, 1; сдвиг operand на 1 разряд

<мнемокод> operand, CL; сдвиг орerand на CL разрядов (CL>=0)

Допустимые типы операнда орerand: r8, m8, r16, m16.

В первом варианте орerand сдвигается только на 1 разряд, а во втором варианте орerand можно сдвигать на любое число разрядов, причем это число должно находиться в байтовом регистре CL и оно всегда трактуется как неотрицательное.

Команды сдвига меняют все флаги, но, как правило, интерес представляет только флаг переноса CF.

Все команды сдвига можно разделить на команды логического сдвига (или просто сдвига), арифметического и циклического.

Команды логического сдвига shl и shr.

К логическим сдвигам относятся две команды:

SHL (Shift Logical Left) - логический сдвиг влево;

SHR (Shift Logical Right) - логический сдвиг вправо.

Синтаксис: SHL dst, countdst, count

В сдвиге участвуют все биты первого операнда dst. При этом бит, уходящий за пределы ячейки, заносится в флаг CF, а с другого конца в операнд добавляется 0. На рисунке 6.1 показан принцип работы этих команд.

Команды сдвига модифицирует флаги переполнения (OF), знака (SF), нуля (ZF), четности (PF) и переноса (CF) в зависимости от результата. Флаг переноса CF содержит значение последнего сдвинутого бита. В однобитных сдвигах флаг переполнения OF = 1, если операция изменила значение старшего бита операнда. При сдвиге на несколько бит состояние флага переполнения OF не определено.

Фрагменты использования логических сдвигов

SHL BL, 1 ; сдвигает регистр BL на 1 бит влево

SHL val_16, 1 byte ptr[si], 1 AL, CLAL, 01000111bAL, 1; AL = 10001110b, CF = 0AL, 01000111bAL, 1; AL = 00100011b, CF = 1DH, 00111000bCL, 3DH, CL; CF = 1, DH = 11000000b

Команды арифметического сдвига sal и sar.

К командам арифметического сдвига относятся две команды:

SAL (Shift Arithmetic Left) - арифметический сдвиг влево;

SAR (Shift Arithmetic Right) - арифметический сдвиг вправо.

Синтаксис: SAL dst, countdst, count

Команды арифметического сдвига предназначены для реализации быстрого умножения и деления знаковых чисел на степени двойки. Эти команды отличаются от команд логического сдвига тем, что они особым образом работают со знаковым разрядом операнда.

Содержимое операнда сдвигается влево / вправо на количество битов, определяемое значением count. Справа/слева вписываются нули. Команда SAL не сохраняет знака, но устанавливает флаг CF в случае смены знака очередным выдвигаемым битом. В остальном команда SAL полностью аналогична команде SHL.

Команда SAR сохраняет знак, восстанавливая его после сдвига каждого очередного бита. На рис. 6.2 показан принцип работы команд линейного арифметического сдвига.

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