Assembleur 80x86 | SHR |
---|---|
INTEL 8088+ | Shift Right |
Syntaxe
SHR opérandecible,1 | 8088+ |
SHR opérandecible,CL | 8088+ |
SHR opérandecible,nombredebits | 80286+ |
Paramètres
Nom | Description |
---|---|
opérandecible | Ce paramètre permet d'indiquer une expression de type entier subissant le «décalage de bits vers la droite» |
nombredebits | Ce paramètre permet d'indiquer le décalage de bit vers la droite à effectuer |
CL | Ce paramètre permet d'indiquer la partie basse du registre de compteur utilisé pour spécifié le nombre de décalage à appliquer à l'opérande cible. |
Description
Cette instruction permet d'effectuer une rotation des bits vers la droite en réinsérant le bit dans l'indicateur de retenue (CF).
Remarque
- Optimisation : Il est préférable d'utiliser l'instruction SHR plutôt que DIV si vous effectuer des divisions par 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536,... de nombre naturel.
Algorithme
temp ← compteur ∩ 001Fh BOUCLE FAIRE TANT temp ≠ 0 x ← highorder ( destination ) CF ← destination ∩ 1 destination ← destination décalage à droite de 1 highorder ( destination ) ← x temp ← temp - 1 BOUCLE FIN DE FAIRE SI compteur = 1 ALORS OF ← 0 SINON OF ← ? FIN SI |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
SHR reg/mem8, 1 | D0h /5 | Cette instruction effectue un décalage d'un seul bit vers la droite d'un opérande registre ou mémoire 8 bits. |
SHR reg/mem8, CL | D2h /5 | Cette instruction effectue un décalage du nombre de bits spécifié par le registre CL vers la gauche d'un opérande registre ou mémoire 8 bits. |
SHR reg/mem8, imm8 | C0h /5 ib | Cette instruction effectue un décalage du nombre de bits spécifié par la valeur immédiate vers la gauche de 8 bits d'un opérande registre ou mémoire 8 bits. |
SHR reg/mem16, 1 | D1h /5 | Cette instruction effectue un décalage d'un seul bit vers la droite d'un opérande registre ou mémoire 16 bits. |
SHR reg/mem16, CL | D3h /5 | Cette instruction effectue un décalage du nombre de bits spécifié par le registre CL vers la gauche d'un opérande registre ou mémoire 16 bits. |
SHR reg/mem16, imm8 | C1h /5 ib | Cette instruction effectue un décalage du nombre de bits spécifié par la valeur immédiate vers la gauche de 8 bits d'un opérande registre ou mémoire 16 bits. |
SHR reg/mem32, 1 | D1h /5 | Cette instruction effectue un décalage d'un seul bit vers la droite d'un opérande registre ou mémoire 32 bits. |
SHR reg/mem32, CL | D3h /5 | Cette instruction effectue un décalage du nombre de bits spécifié par le registre CL vers la gauche d'un opérande registre ou mémoire 32 bits. |
SHR reg/mem32, imm8 | C1h /5 ib | Cette instruction effectue un décalage du nombre de bits spécifié par la valeur immédiate vers la gauche de 8 bits d'un opérande registre ou mémoire 32 bits. |
SHR reg/mem64, 1 | D1h /5 | Cette instruction effectue un décalage d'un seul bit vers la droite d'un opérande registre ou mémoire 64 bits. |
SHR reg/mem64, CL | D3h /5 | Cette instruction effectue un décalage du nombre de bits spécifié par le registre CL vers la gauche d'un opérande registre ou mémoire 64 bits. |
SHR reg/mem64, imm8 | C1h /5 ib | Cette instruction effectue un décalage du nombre de bits spécifié par la valeur immédiate vers la gauche de 8 bits d'un opérande registre ou mémoire 64 bits. |
Cycles d'horloge
Opérande | Cycle d'horloge | Taille en octets | |||
---|---|---|---|---|---|
8086 | 80286 | 80386 | 80486 | ||
reg,1 | 2 | 2 | 3 | 3 | 2 |
mem,1 | 15+EA | 7 | 7 | 4 | 2 à 4 |
reg,CL | 8+4n | 5+n | 3 | 3 | 2 |
mem,CL | 20+EA+4n | 8+n | 7 | 4 | 2 à 4 |
reg,immed8 | - | 5+n | 3 | 2 | 3 |
mem,immed8 | - | 8+n | 7 | 4 | 3 à 5 |
Exceptions
Message | Mode réel | Virtuel 8086 | Mode protégé | Description |
---|---|---|---|---|
#SS(Pile) | X | X | X | Une adresse mémoire dépasse la limite du segment de pile ou n'est pas canonique |
#GP(Protection général) | X | X | X | Une adresse mémoire dépasse la limite du segment de données ou n'est pas canonique |
X | L'opérande de destination n'est pas dans un segment non écrivable | |||
X | Un segment de données nulle est utilisé comme référence mémoire | |||
#PF(Faute de page) | X | X | Une faute de page résultat de l'exécution de l'instruction | |
#AC(Vérifie l'alignement) | X | X | Un désalignement de la référence mémoire est effectué quand une vérification d'alignement est activé |
Exemples
L'exemple suivant permet d'effectuer une décalage logique du registre ECX de 10 places vers la droite :
- SHR ECX,10
L'exemple suivant permet d'effectuer une décalage logique du registre ECX du nombre de places vers la droite spécifié par le registre CL :
- SHR ECX,CL
L'exemple suivant permet d'effectuer une décalage logique du contenu d'un octet du segment de données spécifié par le registre BX vers la droite de 10 :
- SHR BYTE PTR[BX],10
Voici un exemple en Turbo Pascal montrant l'utilisation de cette instruction :
- Program ShrSamples;
-
- Function _Shr(Value:Integer;_Shift:Byte):Integer;Assembler;ASM
- MOV AX,Value
- MOV CL,_Shift
- SHR AX,CL
- END;
-
- BEGIN
- WriteLn('16 SHR 0 = ',_Shr(16,0));
- WriteLn('16 SHR 1 = ',_Shr(16,1));
- WriteLn('16 SHR 2 = ',_Shr(16,2));
- WriteLn('16 SHR 3 = ',_Shr(16,3));
- WriteLn('16 SHR 4 = ',_Shr(16,4));
- WriteLn('16 SHR 0 = ',_Shr(32,0));
- WriteLn('32 SHR 1 = ',_Shr(32,1));
- WriteLn('32 SHR 2 = ',_Shr(32,2));
- WriteLn('32 SHR 3 = ',_Shr(32,3));
- WriteLn('32 SHR 4 = ',_Shr(32,4));
- WriteLn('32 SHR 4 = ',_Shr(32,4));
- END.
on obtiendra le résultat suivant :
16 SHR 0 = 1616 SHR 1 = 8
16 SHR 2 = 4
16 SHR 3 = 2
16 SHR 4 = 1
16 SHR 0 = 32
32 SHR 1 = 16
32 SHR 2 = 8
32 SHR 3 = 4
32 SHR 4 = 2
32 SHR 4 = 2
Voir également
Instruction assembleur 80x86 - Instruction SHL
Instruction assembleur 80x86 - Instruction SAL
Instruction assembleur 80x86 - Instruction SAR
Instruction assembleur 80x86 - Instruction SHLD
Instruction assembleur 80x86 - Instruction SHRD
Références
Le livre d'Or PC, Martin Althaus, 1992, ISBN: 2-7361-0934-1, page 836
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 417
AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions, Edition Advanced Micro Devices, Revision 3.14, September 2007, Publication No. 24594, page 231.
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z, Edition Intel, Mars 2010, Publication No. 253667-034US, page 400 à 408.