Operation
(* count is an unsigned integer corresponding
to the last operand of the instruction, either an
immediate byte or the byte in register CL *)
ShiftAmt count MOD 32;
inBits register; (* Allow overlapped operands *)
IF ShiftAmt = 0
THEN no operation
ELSE
IF ShiftAmt ≥ OperandSize
THEN (* Bad parameters *)
r/m UNDEFINED;
CF, OF, SF, ZF, AF, PF UNDEFINED;
ELSE (* Perform the shift *)
CF BIT[r/m, ShiftAmt - 1]; (* last bit shifted out on exit *)
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 are set according to the value of the result *)
Set SF, ZF, PF (r/m);
AF UNDEFINED;
FI;
FI;
[Back: Description]
[Next: Flags Affected]