Revenir au plan du site


Instructions de rotations et décalages de bits


Il existe deux catégories d'instructions de décalage, la plus courante est celle des décalages simples, plus rapides, plus variés. Les décalages complexes sont des opérations conçus pour faciliter le traitement des nombres BCD, leur usage est beaucoup plus limité.

De façon générale, toutes ces instructions modifient les flags de la façon suivante :
Voici un tableau récapitulatif et visuel des décalages et rotations les plus simples, ça vaut mieux qu'un long discours. Chacune de ces instructions réalise l'opération sur une opérande qui est soit un registre 8 bits (A,B,C,D,E,H,L), soit une valeur 8 bits pointée par HL ou IX+d ou IY+d (avec d étant un déplacement de -128 à 127).


Pour une présentation détaillée de chaque, utilisez les liens rapides suivants :
[ SRL ], [ SRA ], [ RR et RRA ], [ RRC et RRCA ], [ SLL ], [ SLA ], [ RL et RLA ], [ RLC et RLCA ].

Pour toutes ces instructions 'simples' (sauf celles uniquement dédiées au registre A), il existe un mode d'exécution avec les registres d'index (IX et IY) qui duplique le résultat dans un registre 8 bits.
Note: Le registre destination contiendra la valeur du décalage même si l'adresse pointée par IX ou IY est en ROM. Dans ce cas de figure, la valeur est lue dans la ROM, le décalage est effectué dans un registre interne du Z80, puis il est copié dans le registre destination. Enfin, la valeur est écrite à l'adresse pointée par IX ou IY +dep8. Si l'adresse pointe sur une ROM active, alors la valeur sera écrite dans la mémoire située en arrière-plan de la ROM.

Liste des décalages possibles avec duplication de résultat :
RL (IX+d),A | RL (IX+d),B | RL (IX+d),C | RL (IX+d),D | RL (IX+d),E | RL (IX+d),H | RL (IX+d),L
RR (IX+d),A | RR (IX+d),B | RR (IX+d),C | RR (IX+d),D | RR (IX+d),E | RR (IX+d),H | RR (IX+d),L
RLC (IX+d),A | RLC (IX+d),B | RLC (IX+d),C | RLC (IX+d),D | RLC (IX+d),E | RLC (IX+d),H | RLC (IX+d),L
RRC (IX+d),A | RRC (IX+d),B | RRC (IX+d),C | RRC (IX+d),D | RRC (IX+d),E | RRC (IX+d),H | RRC (IX+d),L
SLL (IX+d),A | SLL (IX+d),B | SLL (IX+d),C | SLL (IX+d),D | SLL (IX+d),E | SLL (IX+d),H | SLL (IX+d),L
SLA (IX+d),A | SLA (IX+d),B | SLA (IX+d),C | SLA (IX+d),D | SLA (IX+d),E | SLA (IX+d),H | SLA (IX+d),L
SRL (IX+d),A | SRL (IX+d),B | SRL (IX+d),C | SRL (IX+d),D | SRL (IX+d),E | SRL (IX+d),H | SRL (IX+d),L
SRA (IX+d),A | SRA (IX+d),B | SRA (IX+d),C | SRA (IX+d),D | SRA (IX+d),E | SRA (IX+d),H | SRA (IX+d),L




SRL (Shift Right Logical)
L'instruction SRL décale les bits de l'opérande vers la droite (division par deux). Le bit le moins significatif est mis dans la carry. Le bit le plus significatif est mis à zéro.

SRA (Shift Right Arithmetic)
L'instruction SRA décale les bits de l'opérande vers la droite (division par deux). Le bit le moins significatif est mis dans la carry. Le bit le plus significatif est conservé.

RR (Rotation Right) et RRA (Rotation Right spécial registre A
L'instruction RR décale les bits de l'opérande vers la droite (division par deux). La carry est injectée dans le bit le plus significatif. Enfin, le bit le moins significatif est mis dans la carry.

RRA réalise la même opération que RR A. C'est un opcode plus compact (et par conséquent plus rapide).

RRC (Rotation Right Carry) et RRCA (Rotation Right Carry spécial registre A
L'instruction RRC décale les bits de l'opérande vers la droite (division par deux). Le bit le moins significatif est mis dans la carry ET est aussi mis dans le bit le plus significatif.

RRCA réalise la même opération que RRC A. C'est un opcode plus compact (et par conséquent plus rapide).

SLL (Shift Left Logical) ou SL1
Cette instruction n'était pas supportée dans les années 80/90 aussi on peut la trouver sous différentes syntaxes : SLL ou SL1
L'instruction SLL décale les bits de l'opérande vers la gauche (multiplication par deux). Le bit le moins significatif est mis à 1. Le bit le plus significatif est mis dans la carry.

Note :Cette été documentée plus tard par Zilog, c'est pourquoi peu d'assembleurs la supporte à part Rasm, Sjasm et Orgams.
SLA (Shift Left Arithmetic)
L'instruction SLA décale les bits de l'opérande vers la gauche (multiplication par deux). Le bit le moins significatif est mis à zéro. Le bit le plus significatif est mis dans la carry.

RL (Rotation Left) et RLA (Rotation Left spécial registre A
L'instruction RL décale les bits de l'opérande vers la gauche (multiplication par deux). La carry est injectée dans le bit le moins significatif. Enfin, le bit le plus significatif est mis dans la carry.

RLA réalise la même opération que RL A. C'est un opcode plus compact (et par conséquent plus rapide).

RLC (Rotation Left Carry) et RLCA (Rotation Left Carry spécial registre A
L'instruction RLC décale les bits de l'opérande vers la gauche (multiplication par deux). Le bit le plus significatif est mis dans la carry ET est aussi mis dans le bit le moins significatif.

RLCA réalise la même opération que RLC A. C'est un opcode plus compact (et par conséquent plus rapide).
  • Cette instruction fait partie des instructions qui ont été documentée plus tard par Zilog, c'est pourquoi peu d'assembleurs les supportent à part Rasm, Sjasm et Orgams.
  • Cette instruction possède un mode d'exécution qui copie le résultat dans un autre registre. La syntaxe a alors besoin de deux opérandes. Là encore, seuls Rasm et Sjasm les supportent.

  • RLD
    Ce décalage très particulier impacte le registre A ainsi que l'adresse pointée par HL.

    Il effectue une rotation de 4 bits vers la gauche sur le nombre 12 bits composé des 4 bits de poids faible de A et de (HL).
    ; exemple 'visuel'
    LD A,#12
    LD (HL),#34
    RLD
    ; A=#13
    ; (HL)=#42

    Les 4 bits supérieurs du registre A sont inchangés, il peut être nécessaire d'initialiser à zéro le registre avant usage.

    Usage: Cette instruction trouve ses origines dans l'arithmétique BCD et permet par exemple de multiplier par 10 très facilement un nombre BCD de n'importe quelle taille. Comme elle modifie l'octet pointé par HL, il faut faire attention à son usage dans le cadre unique de la lecture.

    Effet sur les flags :

    RRD
    RRD est le pendant de l'instruction RLD. Il impacte le registre A ainsi que l'adresse pointée par HL.

    Il effectue une rotation de 4 bits vers la droite sur le nombre 12 bits composé des 4 bits de poids faible de A et de (HL).
    ; exemple 'visuel'
    LD A,#12
    LD (HL),#34
    RRD
    ; A=#14
    ; (HL)=#23

    Effet sur les flags :

    Décalages 16 bits
    Il est possible de réaliser des décalages 16 bits vers la gauche de façon native en utilisant l'addition.
    ADD HL,HL ; copie le bit 15 dans C, décale tous les bits vers la gauche et injecte 0 dans le bit 0
    ADC HL,HL ; copie le bit 15 dans C, décale tous les bits vers la gauche et injecte C dans le bit 0

    Pour faire un décalage équivalent à SLL il est nécessaire de décomposer
    SCF ; force la carry à 1
    ADC HL,HL ; copie le bit 15 dans C, décale tous les bits vers la gauche et injecte 1 dans le bit 0

    Ou bien
    ADD HL,HL
    SET 0,L ; forcer le bit 0 de HL

    On peut réaliser tous les types de décalages sur les registres 16 bits en décomposant en logique 8 bits.
    SRL BC s'écrit SRL B : RR C
    SRL DE s'écrit SRL D : RR E
    SRL HL s'écrit SRL H : RR L

    SRA BC s'écrit SRA B : RR C
    SRA DE s'écrit SRA D : RR E
    SRA HL s'écrit SRA H : RR L

    SLL BC s'écrit SLL C : RL B
    SLL DE s'écrit SLL E : RL D
    SLL HL s'écrit SLL L : RL H

    SLA BC s'écrit SLA C : RL B
    SLA DE s'écrit SLA E : RL D
    SLA HL s'écrit SLA L : RL H

    RR BC s'écrit RR B : RR C
    RR DE s'écrit RR D : RR E
    RR HL s'écrit RR H : RR L

    RL BC s'écrit RR C : RR B
    RL DE s'écrit RR E : RR D
    RL HL s'écrit RR L : RR H

    RLC BC s'écrit SLA B : RL C : RR B : RLC B
    RLC DE s'écrit SLA D : RL E : RR D : RLC D
    RLC HL s'écrit SLA H : RL L : RR H : RLC H

    RRC BC s'écrit SRL B : RR C : RL B : RRC B
    RRC DE s'écrit SRL D : RR E : RL D : RRC D
    RRC HL s'écrit SRL H : RR L : RL H : RRC H