Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
SHRD
Влияние команды на флаги и форматы команды:
? |
|
|
|
* |
* |
? |
* |
* |
OF AC |
SHRD r/m16,r16,imm8 |
Сдвинуть r/m16 вправо на imm8 бит, заполнив сдвинутые биты битами из r16 |
Intel386 |
shrd ax,bx,10 |
OF AC |
SHRD r/m32,r32,imm8 |
Сдвинуть r/m32 вправо на imm8 бит, заполнив сдвинутые биты битами из r32 |
Intel386 |
shrd eax,ecx,4 |
OF AD |
SHRD r/m16,r16,CL |
Сдвинуть r/m16 вправо на CL бит, заполнив сдвинутые биты битами из r16 |
Intel386 |
shrd [di],bx,cl |
OF AD |
SHRD r/m32,r32,CL |
Сдвинуть r/m32 вправо на CL бит, заполнив сдвинутые биты битами из r32 |
Intel386 |
shrd [ebx],eax,cl |
Описание:
Команда SHRD сдвигает первый операнд, задаваемый полем 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[r/m,ShiftArm - 1]; (* Последний бит выдвигается *)
FOR i = 0 TO OperandSize - 1 - ShiftAmt
DO BIT[r/m,i] = BIT[r/m,i-ShiftAmt]; OD;
FOR i = OperandSize - ShiftAmt TO OperandSize - 1
DO BIT[r/m,i] = BIT[InBits,i + ShiftAmt - OperandSize]; OD;
(* SF, ZF, PF устанавливаются согласно значению результата *)
Установить SF, ZF, PF согласно r/m;
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