Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
SAL
Влияние команды на флаги и форматы команды:
? |
|
|
|
* |
* |
? |
* |
* |
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 |
Описание:
Команды арифметического сдвига SAL, SARи команды логического сдвига SHL, SHR смещают биты регистра или операнда в памяти столько раз, сколько задано явно или неявно представленным вторым операндом.
Команды сдвига влево SALи SHL идентичны, они сдвигают все биты вверх (к старшему), при этом самый старший бит операнда-источника сдвигается во флаг EFLAGS.CF. Такое действие равнозначно беззнаковому умножению исходного операнда на два, четыре и т.д. Команды сдвига вправо SARи SHRделают обратное: биты сдвигаются вниз (к младшему), а самый младший бит переносится во флаг EFLAGS.CF. Команда SAR фактически выполняет знаковое деление на два, четыре и т.д. с округлением в сторону -¥(не тоже самое, что команда IDIV), старший бит исходного опернада остается неизменным, а его значение копируется при сдвиге в менее значимые биты. Команда SHR выполняет беззнаковое деление, старшие биты при сдвиге заполняются нулями.
Сдвиг повторяется столько раз, сколько указано вторым операндом, который может быть либо непосредственным числом, либо содержимым регистра CL. Чтобы уменьшить максимальное время выполнения команды процессор не позволяет счетчику вращений быть больше 31. Если счетчик вращений больше 31, используются только его младшие 5 бит. Процессор 8086/8088 не маскирует счетчик вращений. (Процессоры Intel186 и старше во всех режимах, в том числе и в режиме V86 маскируют счетчик вращений.)
Флаг OF определен только для форм команд однократного сдвига (вторым операндом является 1). Он неопределен во всех остальных случаях. Для сдвигов влево бит CF после сдвига складывается по модулю два (XOR) со старшим битом результата, полученное значение заносится во флаг OF. Для команды SAR флаг OF очищается. Для команды SHR флаг OF устанавливается в значение старшего бита исходного операнда.
Операция:
(* 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;
Особые ситуации защищенного режима:
#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) при невыровненной ссылке в память.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru