logo

Система команд x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

SHR

Логический сдвиг вправо

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

?

 

 

 

*

*

?

*

*

 

Код

Команда

Описание

Проц.

Пример

D0 /4

SAL r/m8,1

Арифметический сдвиг r/m8 влево (r/m8 = r/m8 * 2)

8086

sal al,1

D2 /4

SAL r/m8,CL

Арифметический сдвиг r/m8 влево (r/m8 = r/m8 * 2^CL)

8086

sal ah,cl

C0 /4 ib

SAL r/m8,imm8

Арифметический сдвиг r/m8 влево (r/m8 = r/m8 * 2^imm8)

8086

sal dh,4

D1 /4

SAL r/m16,1

Арифметический сдвиг r/m16 влево (r/m16 = r/m16 * 2)

8086

sal ax,1

D3 /4

SAL r/m16,CL

Арифметический сдвиг r/m16 влево (r/m16 = r/m16 * 2^CL)

8086

sal ax,cl

C1 /4 ib

SAL r/m16,imm8

Арифметический сдвиг r/m16 влево (r/m16 = r/m16 * 2^imm8)

8086

sal dx,4

D1 /4

SAL r/m32,1

Арифметический сдвиг r/m32 влево (r/m32 = r/m32 * 2)

Intel386

sal eax,1

D3 /4

SAL r/m32,CL

Арифметический сдвиг r/m32 влево (r/m32 = r/m32 * 2^CL)

Intel386

sal eax,cl

C1 /4 ib

SAL r/m32,imm8

Арифметический сдвиг r/m32 влево (r/m32 = r/m32 * 2^imm8)

Intel386

sal edx,4

D0 /7

SAR r/m8,1

Арифметический сдвиг r/m8 вправо (r/m8 = sign(r/m8) * r/m8 / 2)

8086

sal al,1

D2 /7

SAR r/m8,CL

Арифметический сдвиг r/m8 вправо (r/m8 = sign(r/m8) * r/m8 / 2^CL)

8086

sal ah,cl

C0 /7 ib

SAR r/m8,imm8

Арифметический сдвиг r/m8 вправо (r/m8 = sign(r/m8) * r/m8 / 2^imm8)

8086

sal dh,4

D1 /7

SAR r/m16,1

Арифметический сдвиг r/m16 вправо (r/m16 = sign(r/m16) * r/m16 / 2)

8086

sal ax,1

D3 /7

SAR r/m16,CL

Арифметический сдвиг r/m16 вправо (r/m16 = sign(r/m16) * r/m16 / 2^CL)

8086

sal ax,cl

C1 /7 ib

SAR r/m16,imm8

Арифметический сдвиг r/m16 вправо (r/m16 = sign(r/m16) * r/m16 / 2^imm8)

8086

sal dx,4

D1 /7

SAR r/m32,1

Арифметический сдвиг r/m32 вправо (r/m32 = sign(r/m32) * r/m32 / 2)

Intel386

sal eax,1

D3 /7

SAR r/m32,CL

Арифметический сдвиг r/m32 вправо (r/m32 = sign(r/m32) * r/m32 / 2^CL)

Intel386

sal eax,cl

C1 /7 ib

SAR r/m32,imm8

Арифметический сдвиг r/m32 вправо (r/m32 = sign(r/m32) * r/m32 / 2^imm8)

Intel386

sal edx,4

D0 /4

SHL r/m8,1

Логический сдвиг r/m8 влево (r/m8 = r/m8 * 2)

8086

shl al,1

D2 /4

SHL r/m8,CL

Логический сдвиг r/m8 влево (r/m8 = r/m8 * 2^CL)

8086

shl ah,cl

C0 /4 ib

SHL r/m8,imm8

Логический сдвиг r/m8 влево (r/m8 = r/m8 * 2^imm8)

8086

shl dh,4

D1 /4

SHL r/m16,1

Логический сдвиг r/m16 влево (r/m16 = r/m16 * 2)

8086

shl ax,1

D3 /4

SHL r/m16,CL

Логический сдвиг r/m16 влево (r/m16 = r/m16 * 2^CL)

8086

shl ax,cl

C1 /4 ib

SHL r/m16,imm8

Логический сдвиг r/m16 влево (r/m16 = r/m16 * 2^imm8)

8086

shl dx,4

D1 /4

SHL r/m32,1

Логический сдвиг r/m32 влево (r/m32 = r/m32 * 2)

Intel386

shl eax,1

D3 /4

SHL r/m32,CL

Логический сдвиг r/m32 влево (r/m32 = r/m32 * 2^CL)

Intel386

shl eax,cl

C1 /4 ib

SHL r/m32,imm8

Логический сдвиг r/m32 влево (r/m32 = r/m32 * 2^imm8)

Intel386

shl edx,4

D0 /5

SHR r/m8,1

Логический сдвиг r/m8 вправо (r/m8 = |r/m8| / 2)

8086

shl al,1

D2 /5

SHR r/m8,CL

Логический сдвиг r/m8 вправо (r/m8 =  |r/m8| / 2^CL)

8086

shl ah,cl

C0 /5 ib

SHR r/m8,imm8

Логический сдвиг r/m8 вправо (r/m8 = |r/m8| / 2^imm8)

8086

shr dh,4

D1 /5

SHR r/m16,1

Логический сдвиг r/m16 вправо (r/m16 = |r/m16| / 2)

8086

shr ax,1

D3 /5

SHR r/m16,CL

Логический сдвиг r/m16 вправо (r/m16 = |r/m16| / 2^CL)

8086

4shr ax,cl

C1 /5 ib

SHR r/m16,imm8

Логический сдвиг r/m16 вправо (r/m16 = |r/m16| / 2^imm8)

8086

shr dx,4

D1 /5

SHR r/m32,1

Логический сдвиг r/m32 вправо (r/m32 = |r/m32| / 2)

Intel386

shr eax,1

D3 /5

SHR r/m32,CL

Логический сдвиг r/m32 вправо (r/m32 = |r/m32| / 2^CL)

Intel386

shr eax,cl

C1 /5 ib

SHR r/m32,imm8

Логический сдвиг r/m32 вправо (r/m32 = |r/m32| / 2^imm8)

Intel386

shr edx,4

 

Операция:

(* COUNT это второй операнд *)

tempCOUNT = (COUNT AND 1FH);

tempDEST = DEST;

WHILE (tempCOUNT ¹ 0)

DO

  IF Команда SAL или SHL

  THEN

     CF = Старший бит DEST;

  ELSE (* Команда SAR или SHR *)

     CF = Младший бит DEST;

  FI;

  IF Команда SAL или SHL

  THEN

     DEST = DEST * 2;

  ELSE

     IF Команда SAR

     THEN

        DEST = DEST / 2 (* Знаковое деление с округлением к –INF *);

     ELSE (* Команда SHR *)

        DEST = DEST / 2 ; (* Беззнаковое деление *);

     FI;

  FI;

  tempCOUNT = tempCOUNT – 1;

OD;

(* Нахождение переполнения для всех команд *)

IF COUNT = 1

THEN

  IF Команда SAL или SHL

  THEN

     OF = (Старший бит DEST) XOR CF;

  ELSE

     IF Команда SAR

     THEN

        OF = 0;

     ELSE (* Команда SHR *)

        OF = Старший бит tempDEST;

     FI;

  FI;

ELSE IF COUNT = 0 THEN

  Все флаги остаются неизменными;

ELSE (* COUNT ¹ 1 или 0 *)

  OF неопределен;

FI;

Описание:

Команды арифметического сдвига SAL, SAR и команды логического сдвига SHL, SHR смещают биты регистра или операнда в памяти столько раз, сколько задано явно или неявно представленным вторым операндом.

Команды сдвига влево SAL и SHL идентичны, они сдвигают все биты вверх (к старшему), при этом самый старший бит операнда-источника сдвигается во флаг EFLAGS.CF. Такое действие равнозначно беззнаковому умножению исходного операнда на два, четыре и т.д. Команды сдвига вправо SAR и SHR делают обратное: биты сдвигаются вниз (к младшему), а самый младший бит переносится во флаг EFLAGS.CF. Команда SAR фактически выполняет знаковое деление на два, четыре и т.д. с округлением в сторону -¥(не тоже самое, что команда IDIV), старший бит исходного опернада остается неизменным, а его значение копируется при сдвиге в менее значимые биты. Команда SHR выполняет беззнаковое деление, старшие биты при сдвиге заполняются нулями.

Сдвиг повторяется столько раз, сколько указано вторым операндом, который может быть либо непосредственным числом, либо содержимым регистра CL. Чтобы уменьшить максимальное время выполнения команды процессор не позволяет счетчику вращений быть больше 31. Если счетчик вращений больше 31, используются только его младшие 5 бит. Процессор 8086/8088 не маскирует счетчик вращений. (Процессоры Intel286, … во всех режимах, в том числе и в режиме V86 маскируют счетчик вращений.)

Флаг OF определен только для форм команд однократного сдвига (вторым операндом является 1). Он неопределен во всех остальных случаях. Для сдвигов влево бит CF после сдвига складывается по модулю два (XOR) со старшим битом результата, полученное значение заносится во флаг OF. Для команды SAR флаг OF очищается. Для команды SHR флаг OF устанавливается в значение старшего бита исходного операнда.

Особые ситуации защищенного режима:

#GP(0), если операнд-назначение находится в сегменте, запрещенном для записи, если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.

Особые ситуации режима реальной адресации:

#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.

Особые ситуации режима V86:

Такие же, как и в режиме реальной адресации.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память.


Входит в группу команд: Базовая система команд CPU



Все права защищены © 1997-2011 Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Яндекс.Метрика               Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники