Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
SHLD
Влияние команды на флаги и форматы команды:
? |
|
|
|
* |
* |
? |
* |
* |
OF A4 |
SHLD r/m16,r16,imm8 |
Сдвинуть r/m16 влево на imm8 бит, заполнив сдвинутые биты битами из r16 |
Intel386 |
shld ax,bx,10 |
OF A4 |
SHLD r/m32,r32,imm8 |
Сдвинуть r/m32 влево на imm8 бит, заполнив сдвинутые биты битами из r32 |
Intel386 |
shld eax,ecx,4 |
OF A5 |
SHLD r/m16,r16,CL |
Сдвинуть r/m16 влево на CL бит, заполнив сдвинутые биты битами из r16 |
Intel386 |
shld [di],bx,cl |
OF A5 |
SHLD r/m32,r32,CL |
Сдвинуть r/m32 влево на CL бит, заполнив сдвинутые биты битами из r32 |
Intel386 |
shld [ebx],eax,cl |
Описание:
Команда SHLD сдвигает первый операнд, задаваемый полем r/m, влево на столько бит, на сколько указывает третий операнд-счетчик. Второй операнд (регистр общего назначения) содержит биты, которые при выполнении операции вдвигаются справа в значение первого операнда. Результат сохраняется обратно в первый операнд, а второй операнд-регистр остается неизменным.
Операнд-счетчик задается либо непосредственным байтом, либо содержимым регистра CL. Значение счетчика сдвига берется по модулю 32, чтобы ограничить его в рамках от 0 до 31. Эта команда полезна для сдвигов двойной точности (операнды длиной 64 бита или более).
Флаги SF, ZF и PF устанавливаются согласно значению результата. Флаг CF устанавливается в значение последнего старшего выдвинутого бита операнда-источника. Флаги OF и AF оставляются неопределенными для операций многобитовых сдвигов, для операции сдвига на 1 бит флаг OF устанавливается, если происходит изменение знака операнда-источника, и сбрасывается, если изменения знака не происходит. Если операнд-счетчик равен 0, то флаги не изменяются. Если величина операнда-счетчика превышает размерность операнда-источника, то по результатам операции значения флагов не определены.
Операция:
(* Count представляет собой беззнаковое целое, согласованное с последним операндом команды (байтом imm8 или байтом в регистре CL) *)
ShiftAmt = count MOD 32;
InBits = register; (* Допускается частичное перекрытие операндов *)
IF ShiftAmt = 0
THEN (Нет операции)
ELSE
IF ShiftAmt ³ OperandSize
THEN (* Плохие параметры *)
r/m = UNDEFINED;
CF, OF, SZ, ZF, AF, PF = UNDEFINED;
ELSE (* Выполнить сдвиг *)
CF = BIT[Base, OperandSize - ShiftAmt]; (* Последний бит выдвигается *)
FOR i = OperandSize - 1 DOWNTO ShiftAmt
DO BIT[Base,i] = BIT[Base,i-ShiftAmt]; OD;
FOR i = ShiftAmt - 1 DOWNTO 0
DO BIT[Base,i] = BIT[Base,i - ShiftAmt + OperandSize]; OD;
Установить SF, ZF, PF (r/m); (* SF, ZF, PF устанавливаются согласно значению результата *)
AF = UNDEFINED;
FI;
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