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

Опубликовано февраля 3, 2018 в Архитектура процессора Intel

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

Если этот операнд равен единице, то выполняется так называемый однократный сдвиг (сдвиг на 1 разряд), если же в качестве второго операнда задается CL, то число разрядов, на которое осуществляется сдвиг, выбирается из регистра CL, в этом случае имеет место так называемый многократный сдвиг.

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

Способ задания счетчика выражается в машинной команде с помощью специального бита V кода операции. Этот бит является предпоследним в коде операции и имеет смысл только в командах сдвигов. При V = 0 имеет место однократный сдвиг, при V = 1 многократный.

Во всех командах сдвигов последний выдвигаемый из операнда бит фиксируется во флаге CF.

SAL/SAR/SHL/SHR (Shift instruction) — команды сдвига.

Отличие команд арифметического сдвига от команд логического сдвига проявляется только для сдвига вправо. При арифметическом сдвиге вправо (SAR) в освобождающийся старший разряд копируется его прежнее значение. Это позволяет сохранить знак операнда при его сдвиге вправо. В свою очередь, при выполнении команды логического сдвига вправо (SHR), в освобождающийся старший разряд заносится 0.

Арифметический и логический сдвиги влево реализуются одинаково, в связи с чем в машинной системе команд они имеют одинаковый код операции.

Команды арифметического и логического сдвигов, как правило, используются в ассемблерных программах для умножения или деления на степени двойки. Например, сдвиг вправо на два разряда осуществляет деление операнда на 4, а сдвиг влево на два разряда — умножение на 4. Прн этом арифметический сдвиг используется прн знаковом представлении операнда, а логический — при беззнаковом.

Cpa network, create your own advertising campaigns with help of a user-friendly, self-service interface which was developed based on client feedback!

RCL/RCR.ROL/ROR — вращение (циклический сдвиг).

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

Для RCR и RCL предполагается, что предварительное значение флага CF (до выполнения команды) равно 0.

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

Команды арифметического и логического сдвигов оказывают влияние на все арифметические флаги, кроме AF, значение этого флага после команд сдвигов не определено.

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

При левом сдвиге (SAL , SHL) установка флага OF производится в том случае, если при сдвиге изменяется значение старшего бита операнда, интерпретируемого как знак.

При однократном арифметическом сдвиге вправо флаг OF сбрасывается (приравнивается 0), при логическом сдвиге он может быть установлен или сброшен в зависимости от значения старшего бита операнда (при нулевом бите OF = 0, при единичном бите OF = 1).

Команды циклического сдвига оказывают влияние только на флаги OF и CF, остальные флаги не изменяют своего значения. Влияние команд на флаг OF такое же, как и для предыдущих команд.