Microcontrôleurs I IESE3
Fiche technique : encodage de certaines instructions ARM
Les instructions sont rangées en mémoire suivant l'encodage little-endian
par blocs de 16 bits. On reconnaît les instructions 32 bits à leurs bits
de poids fort : 0b11101, 0b11111 ou 0b11110.
Longueur d'instruction Bits de poids fort Codage hexa En mémoire
Instruction 32 bits 11101 ou 11111 ou 11110 aabb ccdd bb aa dd cc
Instruction 16 bits autres combinaisons aabb bb aa
On ne donne ici que le codage de certaines instructions 32 bits : suffixe
« .w ». Les instructions dont le code contient le bit 's' mettent à jour
les indicateurs xPSR lorsque le bit s est à 1 (ex : variante movs.w).
1- Chargement des constantes :
Syntaxe mov(s).w rd,#x Chargement d'une constante 8 bits
Codage binaire 11110000 010s1111 0000dddd xxxxxxxx
Effet r[dddd] ← 00000000 00000000 00000000 xxxxxxxx
Syntaxe mvn(s).w rd,#x Complément à 1 d'une constante 8 bits
Codage binaire 11110000 011s1111 0000dddd xxxxxxxx
Effet r[dddd] ← 11111111 11111111 11111111 xxxxxxxx
Syntaxe movw rd,#x Chargement d'une constante 16 bits
Codage binaire 11110w10 0100zzzz 0yyydddd xxxxxxxx
Effet r[dddd] ← 00000000 00000000 zzzzwyyy xxxxxxxx
Syntaxe movt rd,#x Chargement (demi-mot de poids fort)
Codage binaire 11110w10 1100zzzz 0yyydddd xxxxxxxx
Effet r[dddd]<31:16> ← zzzzwyyy xxxxxxxx
r[dddd]<15:00> inchangé
2- Transferts de registres
Syntaxe mov(s).w rd,rm Transfert (copie) de registre
Codage binaire 11101010 010s1111 0000dddd 0000mmmm
Effet r[dddd] ← r[mmmm]
Syntaxe mvn(s).w rd,rm Complément à 1 de registre
Codage binaire 11101010 011s1111 0000dddd 0000mmmm
Effet r[dddd] ← ~ r[mmmm]
Fiche codage des instructions page 1/3
Microcontrôleurs I IESE3
3- Opérations arithmétiques et logiques :
Syntaxe op(s).w rd,rn,rm Opération binaire avec deux registres
Codage binaire 1110101o ooosnnnn 0000dddd 0000mmmm
Effet r[dddd] ← op(r[nnnn],r[mmmm])
Syntaxe op(s).w rd,rn,#x Opération binaire registre et constante
Codage binaire 1111000o ooosnnnn 0000dddd xxxxxxxx
Effet r[dddd] ← op(r[nnnn],00000000 00000000 00000000 xxxxxxxx)
Attention aux cas particuliers si l'un des opérandes est r15 (pc).
Codages des opérations : (Op2 désigne le second opérande rm ou #x)
Mnémonique Codage Description Signification
(op) (oooo)
and(s).w 0000 ET logique bit à bit rd ← rn & Op2
bic(s).w 0001 BIt Clear (ET NON) rd ← rn & (~ Op2)
orr(s).w 0010 OU logique bit à bit rd ← rn | Op2
orn(s).w 0011 OR Not (OU NON) rd ← rn | (~ Op2)
eor(s).w 0100 Exclusive OR (Ou exclusif) rd ← rn ^ Op2
add(s).w 1000 Somme (modulo 232) rd ← (rn + Op2) mod 232
adc(s).w 1010 Somme avec retenue (Carry) rd ← (rn + Op2 + C) mod 232
sbc(s).w 1011 Soustraction avec retenue rd ← (rn – Op2 – C) mod 232
sub(s).w 1101 Soustraction (modulo 232) rd ← (rn – Op2) mod 232
rsb(s).w 1110 Soustraction inversée rd ← (Op2 – rn) mod 232
4- Multiplication (pas de modification des indicateurs)
La multiplication modulo 232 est indépendante du codage signé/non-signé.
Syntaxe mul rd,rn,rm Multiplication (32 * 32 bits → 32 bits)
Codage binaire 11111011 0000nnnn 1111dddd 0000mmmm
Effet r[dddd] ← (r[nnnn] * r[mmmm]) mod 232
Fiche codage des instructions page 2/3
Microcontrôleurs I IESE3
5- Test de bits et comparaison :
Syntaxe op.w rn,rm Opération binaire avec deux registres
Codage binaire 1110101o ooo1nnnn 00001111 0000mmmm
Effet APSR ← op(r[nnnn],r[mmmm])
Syntaxe op.w rn,#x Opération binaire registre et constante
Codage binaire 1111000o ooo1nnnn 00001111 xxxxxxxx
Effet APSR ← op(r[nnnn],00000000 00000000 00000000 xxxxxxxx)
Codages des opérations : (Op2 désigne le second opérande rm ou #x)
Mnémonique (oooo) Description
tst.w 0000 Calcul du ET logique (rn & Op2)
Mise à jour des indicateurs, le résultat est ignoré.
cmp.w 1101 Calcul de la soustraction ((rn – Op2) mod 232)
Mise à jour des indicateurs, le résultat est ignoré.
6- Décalages et rotations :
Syntaxe op.w rd,rn,rm Décalage/Rotation avec offset registre
Codage binaire 11111010 0ppsnnnn 1111dddd 0000mmmm
Effet r[dddd] ← op(r[nnnn],r[mmmm])
Syntaxe op.w rd,rm,#k Décalage/Rotation avec offset constant
Codage binaire 11101010 010s1111 0xxxdddd yyppmmmm
Effet r[dddd] ← op(r[mmmm],#xxxyy)
Codages des opérations : (Op2 désigne le second opérande rm ou #xxxyy)
Mnémonique Codage Description: rd ← op(rn,rm) ou rd ← op(rm,#k)
(op) (pp) (k=xxxyy sauf exceptions)
lsl(s).w 00 Décalage logique à gauche (k=0..31)
(si k==0 le mnémonique mov(s).w sera utilisé)
lsr(s).w 01 Décalage logique à droite (k=1..32, 32 si xxxyy=00000)
asr(s).w 10 Décalage arithm. à droite (k=1..32, 32 si xxxyy=00000)
ror(s).w 11 Rotation à droite (k=1..31)
rrx(s).w 11 Rotation à droite de un bit, étendue à la retenue.
rd,rm (k=0) (constante seulement, xxxyy=00000, pas de #k)
Fiche codage des instructions page 3/3