82 lines
3.9 KiB
HTML
82 lines
3.9 KiB
HTML
<html><!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
|
|
<html>
|
|
|
|
<head>
|
|
<title>80386 Programmer's Reference Manual -- Opcode SHRD</title>
|
|
</head>
|
|
|
|
<body>
|
|
<b>up:</b> <a href="C17.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/C17.HTM">Chapter 17 -- 80386 Instruction Set</a><br>
|
|
<b>prev:</b><a href="SHLD.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/SHLD.HTM"> SHLD Double Precision Shift Left</a><br>
|
|
<b>next:</b><a href="SLDT.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/SLDT.HTM"> SLDT Store Local Descriptor Table Register</a>
|
|
<p>
|
|
<hr>
|
|
<p>
|
|
<h1>SHRD -- Double Precision Shift Right</h1>
|
|
<pre>
|
|
|
|
|
|
|
|
Opcode Instruction Clocks Description
|
|
|
|
0F AC SHRD r/m16,r16,imm8 3/7 r/m16 gets SHR of r/m16 concatenated
|
|
with r16
|
|
0F AC SHRD r/m32,r32,imm8 3/7 r/m32 gets SHR of r/m32 concatenated
|
|
with r32
|
|
0F AD SHRD r/m16,r16,CL 3/7 r/m16 gets SHR of r/m16 concatenated
|
|
with r16
|
|
0F AD SHRD r/m32,r32,CL 3/7 r/m32 gets SHR of r/m32 concatenated
|
|
with r32
|
|
</pre>
|
|
<h2>Operation</h2>
|
|
<pre>
|
|
|
|
|
|
|
|
(* 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;
|
|
Set SF, ZF, PF (r/m);
|
|
(* SF, ZF, PF are set according to the value of the result *)
|
|
Set SF, ZF, PF (r/m);
|
|
AF := UNDEFINED;
|
|
FI;
|
|
FI;
|
|
</pre>
|
|
<h2>Description</h2>
|
|
SHRD shifts the first operand provided by the r/m field to the right as many bits as specified by the count operand. The second operand (r16 or r32) provides the bits to shift in from the left (starting with bit 31). The result is stored back into the r/m operand. The register remains unaltered.
|
|
<p>The count operand is provided by either an immediate byte or the contents of the CL register. These operands are taken MODULO 32 to provide a number between 0 and 31 by which to shift. Because the bits to shift are provided by the specified register, the operation is useful for multi-precision shifts (64 bits or more). The SF, ZF and PF flags are set according to the value of the result. CS is set to the value of the last bit shifted out. OF and AF are left undefined.
|
|
<h2>Flags Affected</h2>
|
|
OF, SF, ZF, PF, and CF as described above; AF and OF are undefined
|
|
<h2>Protected Mode Exceptions</h2>
|
|
#GP(0) if the result is in a nonwritable segment; #GP(0) for an illegal memory operand effective address in the CS, DS, ES, FS, or GS segments; #SS(0) for an illegal address in the SS segment; #PF(fault-code) for a page fault
|
|
<h2>Real Address Mode Exceptions</h2>
|
|
Interrupt 13 if any part of the operand would lie outside of the effective address space from 0 to 0FFFFH
|
|
<h2>Virtual 8086 Mode Exceptions</h2>
|
|
Same exceptions as in Real Address Mode; #PF(fault-code) for a page fault
|
|
<p>
|
|
<hr>
|
|
<p><b>up:</b> <a href="C17.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/C17.HTM">Chapter 17 -- 80386 Instruction Set</a><br>
|
|
<b>prev:</b><a href="SHLD.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/SHLD.HTM"> SHLD Double Precision Shift Left</a><br>
|
|
<b>next:</b><a href="SLDT.HTM" tppabs="http://webster.cs.ucr.edu/Page_TechDocs/Doc386/SLDT.HTM"> SLDT Store Local Descriptor Table Register</a>
|
|
</body>
|
|
|