Description de la machine microPIUP
Le processeur microPIUP a été défini par Alexandre PARODI, Professeur à l'UHP. La description ci-dessous est un résumé des trois documents de présentation qu'il a rédigés :
Machine RISC pédagogique
Description des modes d'adressage
Spécification des exceptions pour la machine RISC pédagogique
La machine est à peu de choses près une machine RISC "load/store".
Le processeur comporte :
un compteur ordinal de 16 bits noté PC (program counter).
16 registres notés R0, R1, ... , R15 de 16 bits chacun. Le registre R15, utilisé comme pointeur de pile, est aussi noté SP.
1 registre d'état SR comportant 6 indicateurs notés WF IF ZF VF CF NF de 1 bit chacun. Les quatre derniers indicateurs sont positionnés lors de l'exécution de la plupart des instructions.
Le registre SR a le format suivant :
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
WF |
IF |
ZF |
VF |
CF |
NF |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Les indicateurs ont la signification suivante :
L'indicateur WF (Wait Flag) est à 1 si et seulement si le processeur est arrêté et attend une interruption matérielle ou sa réinitialisation pour démarrer.
L'indicateur IF (Interrupt Flag) est à 1 si et seulement si les interruptions matérielles et les exceptions non programmées sont autorisées.
L'indicateur ZF (Zero Flag) vaut 1 si et seulement si le résultat de la dernière instruction est nul.
L'indicateur VF (oVerflow Flag) vaut 1 si et seulement si la dernière opération a débordé.
L'indicateur CF (Carry Flag) contient la dernière retenue générée lors de l'exécution de la dernière instruction.
L'indicateur NF (Negative Flag) est le report du bit de poids fort du résultat de la dernière instruction. Lorsqu'il s'agit d'une instruction arithmétique, ce bit est à 1 en cas de résultat négatif, d'où le nom de l'indicateur.
Remarque : Si WF=1 et IF=0 le processeur est dans l'état abandon et seule une initialisation (bouton reset) peut l'en faire sortir.
Il y a deux espaces d'adressage : l'espace d'adressage normal, utilisé par la plupart des instructions et l'espace d'adressage d'entrées-sorties utilisé par les instructions IN et OUT.
Les adresses sont codées sur 16 bits et ce sont des adresses d'octets. La capacité d'adressage est donc de 216 octets c'est-à-dire 64 K octets. On considèrera que la taille de la mémoire utilisée ne peut être inférieure à la capacité d'adressage.
Un mot est constitué de deux octets consécutifs, le premier octet est l'octet de poids fort et doit être situé à une adresse paire.
Si cette contrainte n'est pas respectée lors de l'exécution d'une instruction utilisant un opérande de type mot, la machine lève une exception de type accès illégal (désalignement d'opérande en mémoire).
octet de poids fort |
octet de poids faible |
||||||||||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
adresse N (paire) |
adresse N+1 |
Les 1024 premiers octets de la mémoire (adresses 0x0 à 0x3FF) sont utilisés pour la table des 256 vecteurs d'interruption de 4 octets chacun.
Cet espace est constitué de 256 octets adressés de 0x0 à 0xFF.
Les instructions du processeur permettent la manipulation d'adresses, d'octets et de mots.
Certaines instructions ne font intervenir que les registres du processeur. D'autres en revanche peuvent nécessiter un calcul d'adresse. Dans ce cas le codage de l'instruction comporte un champ spécifiant le mode d'adressage utilisé. Le format de codage des instructions étant régulier, un même mode d'adressage est toujours codé de la même façon quelle que soit l'instruction concernée.
Un mode d'adressage sert à déterminer une adresse. Le calcul de cette adresse, appelée adresse effective, ne dépend pas de l'instruction (il peut toutefois dépendre de la taille de la donnée traitée par l'instruction) : à un mode d'adressage donné correspond toujours le même processus de calcul de l'adresse effective correspondante. La description du fonctionnement des instructions concernées fera référence à l'adresse effective spécifiée par le mode d'adressage utilisé.
Les instructions se codent sur un ou deux mots. Dans ce dernier cas le deuxième mot de l'instruction est appelé le mot d'extension.
Nom du mode d'adressage |
Codage (mode base) |
Processus de calcul de l'adresse effective (ae) |
000 0000 |
ae = adresse du mot d'extension |
|
001 nnnn |
pas d'adresse à proprement parler, c'est le registre dont le numéro est codé sur les 4 bits nnnn qui est désigné. |
|
010 nnnn |
ae = contenu du registre spécifié sur les 4 bits nnnn |
|
011 nnnn |
ae = contenu du registre spécifié sur les 4 bits nnnn APRES calcul de ae, ce registre est incrémenté de 1 ou 2 selon la taille des opérandes de l'instruction. |
|
100 nnnn |
le registre spécifié sur les 4 bits nnnn est décrémenté de 1 ou 2 selon la taille des opérandes de l'instruction. PUIS ae = contenu du registre spécifié |
|
101 0000 |
ae = contenu du mot d'extension |
|
110 nnnn |
ae = somme du contenu du mot d'extension et du contenu du registre spécifié sur les 4 bits nnnn |
|
111 nnnn |
ae = contenu du mot dont l'adresse est la somme du contenu du mot d'extension et du contenu du registre spécifié sur les 4 bits nnnn |
Une instruction est codée sur un ou deux mots et doit donc débuter à une adresse paire.
Lorsque le processeur ne parvient pas à décoder le premier mot d'instruction, il lève une exception instruction illégale.
Une instruction utilisant un opérande de type octet placé dans un registre utilise l'octet de poids faible de ce registre (conventionnellement considéré comme l'octet de droite du registre).
Dans les descriptions du fonctionnement des instructions, les notations suivantes sont utilisées pour spécifier le fonctionnement :
xF <- expression : positionnement de l'indicateur xF avec la valeur (booléenne) de expression
Rxk : kième bit du registre Rx
Rx: Valeur contenue dans le registre Rx
Groupe des instructions arithmétiques et logiques à trois registres. Trois champs de 4 bits chacun servent à coder les numéros des registres utilisés. Les opérandes sont les contenus des registres s1 et s2, le résultat est rangé dans le registre d.
1 |
opération |
registre s1 |
registre s2 |
registre d |
|||||||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
champ opération |
mnémonique |
spécification |
0 0 0 |
Range dans le registre d la valeur de l'expression Rs1 + Rs2 + valeur de CF Les indicateurs CF, ZF, NF, et VF sont positionnés conformément au résultat de l'addition. |
|
0 0 1 |
Range dans le registre d la valeur de l'expression Rs1 xor Rs2 (ou exclusif bit à bit : Rs10 xor Rs20, Rs11 xor Rs21 , .Rs12 xor Rs22 , ) VF <- 0 CF <- 0 ZF <- Rd == 0 NF <- Rd15 |
|
0 1 0 |
Range dans le registre d la valeur de l'expression Rs1 / Rs2 (quotient) Range dans le registre s1 la valeur de l'expression Rs1 % Rs2 (reste) VF <- 0 CF <- 0 ZF <- Rd == 0 NF <- Rd15 |
|
0 1 1 |
Range dans le registre d la valeur de l'expression Rs1 * Rs2 VF <- 0 CF <- 0 ZF <- Rd == 0 NF <- Rd15 |
|
1 0 0 |
Range dans le registre d la valeur de l'expression Rs1 and Rs2 (et bit à bit : Rs10 and Rs20 , Rs11 and Rs21 , .Rs12 and Rs22 , ) VF <- 0 CF <- 0 ZF <- Rd == 0 NF <- Rd15 |
|
1 0 1 |
Range dans le registre d la valeur de l'expression Rs1 or Rs2 (ou bit à bit : Rs10 or Rs20 , Rs11 or Rs21 , .Rs12 or Rs22 , ) VF <- 0 CF <- 0 ZF <- Rd == 0 NF <- Rd15 |
|
1 1 0 |
Range dans le registre d la valeur de l'expression Rs1 + Rs2 Les indicateurs CF, ZF, NF, et VF sont positionnés conformément au résultat de l'addition. |
|
1 1 1 |
Range dans le registre d la valeur de l'expression Rs1 - Rs2 Les indicateurs CF, ZF, NF, et VF sont positionnés conformément au résultat de la soustraction. |
Groupe des instructions arithmétiques et logiques à deux registres. Deux champs de 4 bits chacun servent à coder les numéros des registres utilisés. L'opérande est le contenu du registre s, le résultat est rangé dans le registre d.
0 |
1 |
0 |
0 |
opération |
registre s |
registre d |
|||||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
champ opération |
mnémonique |
spécification |
0 0 0 0 |
Copie dans les 15 bits de poids forts du registre d les 15 bits de poids faibles du registre s et copie l'indicateur CF dans le bit 0 du registre d. Le bit 15 de s est ensuite copié dans l'indicateur CF. VF <- 0 CF <- Rs 15 ZF <- Rd == 0 NF <- Rd15 |
|
0 0 0 1 |
Copie dans les 15 bits de poids faibles du registre d les 15 bits de poids forts du registre s et copie l'indicateur CF dans le bit 15 du registre d. Le bit 0 de s est ensuite copié dans l'indicateur CF. VF <- 0 CF <- Rs 0 ZF <- Rd == 0 NF <- Rd15 |
|
0 0 1 0 |
Copie dans les 15 bits de poids faibles du registre d les 15 bits de poids forts du registre s et copie 0 dans le bit 15 du registre d. Le bit 0 de s est ensuite copié dans l'indicateur CF. VF <- 0 CF <- Rs 0 ZF <- Rd == 0 NF <- 0 |
|
0 0 1 1 |
Copie dans les 15 bits de poids faibles du registre d les 15 bits de poids forts du registre s et copie le bit de poids fort du registre s dans le bit 15 du registre d. Le bit 0 de s est ensuite copié dans l'indicateur CF. VF <- 0 CF <- Rs 0 ZF <- Rd == 0 NF <- Rd15 |
|
0 1 0 0 |
Range dans le registre d la valeur de l'expression not Rs (négation bit à bit) VF <- 0 CF <- 0 ZF <- Rd == 0 NF <- Rd15 |
|
0 1 0 1 |
Range dans le registre d la valeur de l'expression Rs - valeur de CF Les indicateurs CF, ZF, NF, et VF sont positionnés conformément au résultat de la soustraction. |
|
0 1 1 0 |
Copie dans les 15 bits de poids forts du registre d les 15 bits de poids faibles du registre s et copie 0 dans le bit 0 du registre d. Le bit 15 de s est ensuite copié dans l'indicateur CF. VF <- 0 CF <- Rs 15 ZF <- Rd == 0 NF <- Rd15 |
|
0 1 1 1 |
Range dans le registre d la valeur de l'expression 0 - Rs Les indicateurs CF, ZF, NF, et VF sont positionnés conformément au résultat de la soustraction. |
|
1 0 0 0 |
Copie dans l'octet de droite du registre d le contenu de l'octet d'adresse Rs (i.e. contenu du registre s) dans la mémoire d'entrées-sorties. VF <- 0 CF <- 0 ZF <- Rd == 0 NF <- Rd15 |
|
1 0 0 1 |
Copie dans la mémoire d'entrées-sorties à l'adresse Rd (i.e. contenu du registre d) l'octet de droite du registre s. VF <- 0 CF <- 0 ZF <- Rs == 0 NF <- Rs15 |
|
1 0 1 0 |
Copie dans l'octet de droite du registre d l'octet de gauche du registre s et dans l'octet de gauche du registre d l'octet de droite du registre s. VF <- 0 CF <- 0 ZF <- Rd == 0 NF <- Rd15 |
|
1 0 1 1 |
inutilisé |
provoque une exception instruction illégale |
1 1 0 0 |
Cette instruction se code sur 2 mots (le deuxième mot est le mot d'extension). Range dans le registre d la valeur de l'expression Rs and contenu du mot d'extension (et bit à bit) VF <- 0 CF <- 0 ZF <- Rd == 0 NF <- Rd15 |
|
1 1 0 1 |
inutilisé |
provoque une exception instruction illégale |
1 1 1 0 |
Cette instruction se code sur 2 mots (le deuxième mot est le mot d'extension). Range dans le registre d la valeur de Rs + contenu du mot d'extension Les indicateurs CF, ZF, NF, et VF sont positionnés conformément au résultat de l'addition. |
|
1 1 1 1 |
Le seul effet de cette instruction est de positionner les indicateurs du registre SR. Calcule la valeur de Rs - Rd (négation bit à bit) Les indicateurs CF, ZF, NF, et VF sont positionnés conformément au résultat de la soustraction. |
Groupe des instructions de transfert (copie serait plus approprié) de mémoire à registre, de registre à mémoire ou de registre à registre. Un champ de 4 bits sert à coder le numéro du registre utilisé comme source ou destination et un champ de 7 bits (3 bits de mode, 4 bits de base) code le mode d'adressage de l'autre opérande. Dans tous les cas, le contenu de la source est copié dans la destination.
0 |
1 |
type |
registre r |
D |
mode |
base |
|||||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
mot d'extension (avec certains modes d'adressage) |
|||||||||||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Le champ type code le type, octet ou mot, de l'opérande copié, le champ D le sens du transfert. Selon le mode d'adressage, l'instruction se code ou non avec un mot d'extension.
champ type |
champ D |
mnémonique |
spécification |
0 1 |
0 |
copie l'octet de poids faible du registre r spécifié par les bits 11 à 8 à l'adresse effective destination spécifée par le mode d'adressage. Si la destination est un registre, le bit de poids fort de cet octet est recopié dans tous les bits de l'octet de poids fort du registre destination (extension de signe). Le mode d'adressage Immédiat est interdit avec cette instruction. VF <- 0 CF <- 0 ZF <- Rr == 0 NF <- Rr15 |
|
0 1 |
1 |
copie le contenu de l'octet d'adresse effective source dans l'octet de poids faible du registre r spécifié par les bits 11 à 8 à l'adresse. Le bit de poids fort de cet octet est recopié dans tous les bits de l'octet de poids fort du registre r (extension de signe). VF <- 0 CF <- 0 ZF <- Rr == 0 NF <- Rr15 |
|
1 0 |
0 |
copie le contenu du registre r spécifié par les bits 11 à 8 à l'adresse effective destination spécifée par le mode d'adressage. Le mode d'adressage Immédiat est interdit avec cette instruction. VF <- 0 CF <- 0 ZF <- Rr == 0 NF <- Rr15 |
|
1 0 |
1 |
copie le contenu du mot d'adresse effective source dans le registre r spécifié par les bits 8 à 11. VF <- 0 CF <- 0 ZF <- Rr == 0 NF <- Rr15 |
Remarque :
Lorsque le mode d'adressage utilisé est le mode registre, il est abusif de parler d'adresse effective (un registre n'est pas situé en mémoire et n'a donc pas d'adresse). Cependant, pour simplifier les descriptions, on appelle dans ce cas adresse effective source ou adresse effective destination, le registre spécifié par le mode d'adressage (celui dont le numéro est codé par le champ base du mode d'adressage).
Groupe des instructions de branchements conditionnels relatifs, i.e. des instructions permettant de tester une configuration des indicateurs du registre d'état SR et de copier une adresse dans le compteur ordinal (registre PC du processeur). Cette instruction se code sur deux mots : il s'agit en fait d'une instruction utilisant un mode d'adressage nommé "relatif au compteur ordinal" sur certains processeurs. Dans ce cas, l'adresse effective est calculée en ajoutant un déplacement au contenu du compteur ordinal. Le déplacement est ici codé en complément à 2 dans le mot d'extension.
0 |
0 |
0 |
0 |
CC |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
déplacement |
|||||||||||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Spécification : La condition codée sur les bits 11 à 8 de l'instruction est évaluée. Si elle est vraie, le contenu du mot d'extension est ajouté au compteur ordinal. Attention : le compteur ordinal a déjà été incrémenté de 2 lorsque l'addition est effectuée.
Les différentes configurations du champ CC sont :
CC |
mnémonique |
signification |
condition évaluée |
0 0 0 1 |
saut |
1 |
|
0 0 1 0 |
EQual |
ZF |
|
0 0 1 1 |
Not Equal |
! ZF |
|
0 1 0 0 |
Greater or Equal (entiers signés) |
! (NF xor VF) |
|
0 1 0 1 |
Lower or Equal (entiers signés) |
(NF xor VF) or ZF |
|
0 1 1 0 |
GreaTer (entiers signés) |
!(NF xor VF) and !ZF |
|
0 1 1 1 |
LoWer (entiers signés) |
NF xor VF |
|
1 0 0 0 |
Above or Equal Carry Cleared (valeurs non signées) |
! CF |
|
1 0 0 1 |
Below or Equal (valeurs non signées) |
CF or ZF |
|
1 0 1 0 |
(J)AB |
ABove (valeurs non signées) |
!CF and !ZF |
1 0 1 1 |
BeLow Carry Set (valeurs non signées) |
CF |
|
1 1 0 0 |
oVerflow Set |
VF |
|
1 1 0 1 |
oVerflow Cleared |
!VF |
N.B. La même codification et les mêmes mnémoniques de conditions sont utilisés pour les instructions Bcc, c'est pour cela que le caractère J figure entre parenthèses dans le tableau ci-dessus.
Groupe des instructions à un opérande.
0 |
0 |
0 |
0 |
1 |
opération |
0 |
mode |
base |
|||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
mot d'extension (avec certains modes d'adressage) |
|||||||||||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
champ opération |
mnémonique |
spécification |
0 0 0 |
Copie dans le registre PC le contenu du mot d'adresse effective en cas d'adressage immédiat ou le contenu du registre base en cas d'adressage de registre. Les indicateurs CF, ZF, NF, et VF ne sont pas modifiés. Seuls les modes d'adressage Immédiat et Registre sont autorisés. |
|
0 0 1 |
Copie l'adresse effective dans le registre PC. Les indicateurs CF, ZF, NF, et VF ne sont pas modifiés. Les modes d'adressage Immédiat et Registre sont interdits. |
|
0 1 0 |
Empile le contenu du registre PC (après incrémentation de 2 ou 4 selon le mode d'adressage utilisé), plus précisément : - le registre SP (R15) est décrémenté de 2 (taille du registre PC en nombre d'octets) - le contenu du registre PC est copié en mémoire à l'adresse contenue dans SP puis l'adresse effective est copiée dans le registre PC. Les indicateurs CF, ZF, NF, et VF ne sont pas modifiés. Les modes d'adressage Immédiat et Registre sont interdits. |
|
0 1 1 |
(exception programmée ou trappe logicielle) |
Empile le contenu du registre SR, puis le contenu du registre PC (après incrémentation de 2 ou 4 selon le mode d'adressage utilisé ), plus précisément : - le registre SP (R15) est décrémenté de 2 (taille du registre SR en nombre d'octets) - le contenu du registre SR est copié en mémoire à l'adresse contenue dans SP - le registre SP est décrémenté de 2 (taille du registre PC en nombre d'octets) - le contenu du registre PC est copié en mémoire à l'adresse contenue dans SP puis copie dans le registre PC le contenu du mot d'adresse 4 * (contenu de l'octet de droite du mot d'adresse effective and FFFE) Les indicateurs CF, ZF, NF, et VF ne sont pas modifiés. N.B. Si le mode d'adressage est Registre, c'est l'octet de droite du registre base qui est utilisé. Il n'y a pas extension de signe, l'octet utilisé représente un entier dans l'intervalle [1 .. 255]. Si l'octet est nul, il y a déclenchement d'une exception CPU non programmée de type « Instruction Illégale ». |
1 0 0 |
VF <- 0 CF <- 0 ZF <- contenu du mot d'adresse effective == 0 NF <- bit 15 du mot d'adresse effective N.B. Si le mode d'adressage est Registre, c'est le contenu du registre base qui est utilisé. |
|
1 0 1 |
positionne les indicateurs : VF <- 0 CF <- 0 ZF <- contenu du mot d'adresse effective == 0 NF <- bit 15 du mot d'adresse effective puis met à 0 le mot d'adresse effective. N.B. Si le mode d'adressage est Registre, c'est le registre base qui est utilisé. Le mode d'adressage immédiat est interdit pour cette instruction. |
|
1 1 0 |
Copie le registre SR dans le mot d'adresse effective. Les indicateurs CF, ZF, NF, et VF ne sont pas modifiés. N.B. Si le mode d'adressage est Registre, c'est le registre base qui est utilisé comme destination. Le mode d'adressage immédiat est interdit pour cette instruction. |
|
1 1 1 |
Copie le registre PC dans le mot d'adresse effective. Les indicateurs CF, ZF, NF, et VF ne sont pas modifiés. N.B. Si le mode d'adressage est Registre, c'est le registre base qui est utilisé comme destination. Le mode d'adressage immédiat est interdit pour cette instruction. |
Groupe des instructions sans opérande.
0 |
0 |
0 |
0 |
0 |
opération |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
champ opération |
mnémonique |
spécification |
0 0 0 |
Aucune action, seul le registre PC est modifié. |
|
0 0 1 |
WF <- 1 Les autres indicateurs ne sont pas modifiés. |
|
0 1 0 |
Dépile le sommet de pile dans le registre PC, plus précisément : - le contenu du mot dont l'adresse est dans SP est copié dans le registre PC - le registre SP est incrémenté de 2 (taille du registre PC en nombre d'octets) Les indicateurs CF, ZF, NF, et VF ne sont pas modifiés. |
|
0 1 1 |
Dépile le sommet de pile dans le registre PC, puis dépile le sommet de pile dans le registre SR plus précisément : - le contenu du mot dont l'adresse est dans SP est copié dans le registre PC - le registre SP est incrémenté de 2 (taille du registre PC en nombre d'octets) - le contenu du mot dont l'adresse est dans SP est copié dans le registre SR - le registre SP est incrémenté de 2 (taille du registre SR en nombre d'octets) |
|
1 0 0 |
CF <- 0 Les autres indicateurs ne sont pas modifiés. |
|
1 0 1 |
CF <- 1 Les autres indicateurs ne sont pas modifiés. |
|
1 1 0 |
IF <- 0 Les autres indicateurs ne sont pas modifiés. |
|
1 1 1 |
IF <- 1 Les autres indicateurs ne sont pas modifiés. |
Groupe d'instructions n'utilisant qu'un registre et une valeur codée sur un octet du mot d'instruction.
0 |
0 |
1 |
op |
registre d |
valeur |
||||||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
champ op |
mnémonique |
spécification |
0 |
Copie le champ valeur dans l'octet de poids faible du registre d, le bit 7 du champ valeur est copié dans tous les bits de l'octet de poids fort du registre d. VF <- 0 CF <- 0 ZF <- Rd == 0 NF <- Rd15 |
|
1 |
Ajoute au contenu du registre d l'entier relatif codé dans le champ valeur (auparavant il y a extension de signe) Les indicateurs CF, ZF, NF, et VF sont positionnés conformément au résultat de l'addition. |
Instructions de branchements conditionnels courtes
0 |
0 |
0 |
1 |
CC |
déplacement |
||||||||||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Spécification : La condition codée sur les bits 11 à 8 de l'instruction est évaluée. Si elle est vraie, le contenu du champ déplacement est ajouté au compteur ordinal après extension de signe. Attention : le compteur ordinal a déjà été incrémenté de 2 lorsque l'addition est effectuée.
Les configurations et les interprétations du champ CC sont les mêmes que pour les instructions du groupe 4. Les mnémoniques de ces instructions Bcc sont constitués par la concaténation à B du mnénonique du code condition.
Une exception est un fonctionnement exceptionnel momentané du processeur suite à une requète extérieure :
ou intérieure au processeur causée par :
l'exécution de l'instruction TRP (trappe logicielle1)
une anomalie de fonctionnement du matériel (exception CPU non programmée) provoquant une trappe, une faute ou une erreur2.
Les interruptions matérielles numérotées de 0 à 31 et les exceptions CPU non programmées, elles aussi numérotées de 0 à 31 sont prises en compte par un contrôleur d'exceptions non programmées (noté XCU, eXception Control Unit) qui mémorise les requètes dans un registre de 64 bits noté ERF (Exception Request Flag) :
les bits 0 à 31 du registre ERF correspondent au exceptions CPU non programmées de mêmes rangs, ERF[k] est mis à 1 lors d'une requète d'exception non programmée numéro k (0<= K <= 31)
les bits 32 à 63 de ERF correspondent aux interruptions matérielles, ERF[k+32] est mis à 1 lors d'une interruption matérielle numéro k (0<= K <= 31).
Bien entendu si le bit correspondant est déjà à 1 lors d'une requète, il reste à 1 et cette occurrence de la requète sera ignorée.
Le début du cycle d'exécution des instructions par le processeur est le suivant :
Si l'indicateur IF est à 1 et si il y a un bit à 1 dans ERF alors
le numéro k de l'exception la plus prioritaire est déterminé en parcourant ERF : la priorité d'une exception décroit quand son numéro croit, l'exception CPU n° 0 est la plus prioritaire, l'interruption matérielle n° 31, i.e. l'exception n° 63, est la moins prioritaire,
l'indicateur de l'exception n° k dans le registre ERF est mis à zéro : ERF[k] <- 0
si l'exception est une erreur, la valeur 0x0020 est empilée sinon le registre d'état SR est empilé,
si l'exception est une faute, l'adresse de l'instruction fautive3 est empilée sinon le contenu de PC est empilé,
les exceptions non programmées sont inhibées et le processeur est « réveillé » : IF <- 0 WF <- 0
l'adresse ast de la séquence de traitement de l'exception4 est calculée : ast = contenu_du_mot_d_adresse(4 * k) et 0xFFFE
l'adresse ast est copiée dans le PC : PC <- ast
Ensuite, qu'il y ait eu ou non traitement d'une exception, si l'indicateur WF est à zéro, l'exécution se poursuit normalement (sinon le processeur est en attente d'une interruption matérielle ou d'une réinitialisation).
Pour empiler un mot, le registre SP (R15) est décrémenté de 2 et le mot est copié en mémoire à l'adresse contenue dans SP. Si une exception survient lors de l'accès à la pile le processeur passe dans l'état abandon (IF <- 0 et WF <- 1).
Les 4*256 premiers octets de la mémoire sont destinés à mémoriser la table des vecteurs d'interruptions. Cette zone de la mémoire doit avoir été initialisée avec les adresses des séquences de traitement d'exceptions pour que le mécanisme ait un sens. Quatre octets sont réservés pour chaque adresse de façon à permettre une extension à 32 bits du processeur. Les adresses des handlers sont nécessairement paires (bit de poids faible à zéro). Le masquage du dernier bit du vecteur d'interruption effectué avant chargement dans le PC permettra d'utiliser ce bit, à des fin de protection par exemple, dans une version ultérieure.
L'algorithme ci-dessus montre qu'en cas d'erreur le registre d'état empilé a l'indicateur WF à 1 et l'indicateur IF à 0. Une fois le « handler » de traitement d'erreur exécuté, affichage d'un message d'erreur sur la console par exemple, l'exécution de l'instruction RTI5 provoquera donc le passage du processeur dans l'état abandon. Il devra être réinitialisé avec le bouton reset.
En cas de faute c'est l'adresse de l'instruction fautive qui est empilée et non l'adresse de l'instruction suivante. Au retour du traitement d'exception l'instruction fautive sera donc réexécutée, le traitement de faute doit donc supprimer la cause de l'erreur. En revanche dans les autres cas, une fois le traitement d'exception effectué le programme interrompu se poursuit normalement.
Les étapes 3, 4, 6 et 7 de l'algorithme ci-dessus sont comparables au déroulement de l'instruction TRP. Cette instruction permet de déclencher des exceptions par programme, d'où le nom d'exception programmée. Cependant dans ce cas le contrôleur d'exception n'intervient pas et il n'est pas possible d'inhiber l'exception. De plus il est impossible avec cette instruction de déclencher une exception de numéro 0, cela provoque une trappe 1 (instruction illégale).
Le tableau ci-dessous indique le type et la cause des exceptions CPU non programmées. Certaines exceptions sont réservées pour permettre une évolution ultérieure du processeur.
Numéro |
Type |
Nom |
Cause |
0 |
faute |
Faute de bus |
Il n'y a pas de mémoire à l'adresse indiquée. Cette exception est utilisée pour la gestion de la mémoire virtuelle. |
1 |
trappe |
Instruction illégale |
Le code de l'instruction n'est pas valide. |
2 |
trappe |
Accès illégal |
Tentative d'accès à un mot avec une adresse impaire. |
3 |
? |
Réservé : faute de protection |
Réservé pour la gestion des droits d'accès dans une version ultérieure. |
4 |
trappe |
Division par zéro |
L'instruction DIV a été utilisée avec un diviseur nul. |
5 à 31 |
trappe, faute ou erreur |
réservé |
Réservé pour des exceptions non programmées du processeur. |
L'initialisation du processeur (signal RESET) a pour effet d'initialiser le registre SR avec 0x0000 (les interruptions sont invalidées) et le registre PC avec 0xFFFA. Le contenu des registres R0 à R15 est indéterminé.
1On dit aussi exception programmée.
2La version actuelle du processeur ne comporte pas d'exception de type erreur.
3L'instruction fautive est celle qui s'exécutait lorsque la faute a été détectée.
4Une telle séquence de traitement d'exception est nommée handler en Anglais.
5Tout handler correctement programmé se termine par RTI.