Ecole Polytechnique
2010–2011
– L’examen dure 3 heures.
– Le sujet comporte 6 pages dont 2 pages de rappels sur le LC-2.
– Tous documents autorisés.
– Le barème est donné à titre indicatif, il vous sert surtout à évaluer le poids respectif des exercices ; la somme des points est 30.
– Il est impératif de commenter vos programmes ou séquence de contrôle ; la plupart des lignes/instructions doivent être suivies d’un commentaire permettant de comprendre leur rôle.
– Il est impératif de justifier toutes vos réponses.
FIG. 1 – Accélérateur pour réseau de neurones.
On veut ajouter un circuit implémentant un réseau de neurones au LC2 ; ce circuit est destiné à être utilisé comme un accélérateur matériel pour certaines tâches. On s’intéresse à l’implémentation de ce circuit et à sa con- nexion au reste du LC2. Aucune connaissance préalable sur les réseaux de neurones n’est nécessaire, le principe de fonctionnement d’un réseau de neurones est décrit ci-dessous.
Les entrées d’un neurone correspondent à des synapses. Chaque synapse mémorise un poids w ; le poids d’une synapse est multiplié par la sortie d’un neurone de la couche inférieure, et ce produit w×x devient l’entrée du neurone de la couche supérieure. Un neurone connecté à n synapses produit la valeur y suivante : y=f(∑ni=0−1wi× xi), où f(x) =1+e1−x.
Comme en TD, on supposera que le temps de cycle de l’horloge est très grand par rapport au temps de passage à travers tous les opérateurs logiques et la mémoire.
Les différents exercices sont largement indépendants, même s’il est recommandé de lire l’énoncé d’exercices que vous souhaitez éventuellement sauter.
Exercice 1 - Implémentation du réseau de neurones (10 points)
Pour cet exercice, toutes les valeurs utilisées dans l’accélérateur sont représentées sur 4 bits, et sont considérées comme non signées.
1
2
Question 1.1
On veut réaliser un multiplieur combinatoire (n’utilisant que des circuits logiques, aucun élément de stock- age, aucune information de temps), qui sera utilisé pour le produit w×x de chaque synapse. On ne dispose que d’additionneurs complets 1-bit ou de demi-additionneurs 1-bit (un demi-additionneur n’a que deux entrées ; un additionneur complet a trois entrées : les deux chiffres à additionner et la retenue du bit précédent), et des portes logiques élémentaires (AND, OR, NOT). On ne considère que les 4 bits de poids faible du résultat.
Donner le schéma de ce multiplieur, et expliquer sa conception. Disposer le schéma de façcon très lisible, notamment, il est important de pouvoir facilement identifier quels opérateurs produisent quels chiffres du résultat.
Sans devoir être optimale, on souhaite réaliser une conception raisonnablement efficace du circuit.
Réponse
FIG. 2 – Multiplieur à saturation.
Voir Figure 2. Il est inutile d’implémenter les opérateurs correspondant au calcul des autres bits.
Question 1.2
On veut modifier ce multiplieur pour qu’il soit “à saturation”, c’est à dire que si le résultat est supérieur à 1111, la sortie du multiplieur sera 1111. Modifier le schéma précédent. Expliquer la modification.
Réponse
Si l’une des retenues des additionneurs de poids fort est non nulle, ou si un quelconque des produits des bits de poids fort est non nul, alors le résultat dépasse 4 bits. Pour obtenir la saturation on fait un OU entre chaque bit du résultat et un signal qui vaut 1 si le résultat dépasse 4 bits. Voir Figure 2.
Question 1.3
FIG. 3 – Approximation de la fonction non-linéaire de sortie du neurone.
On veut ensuite implémenter la fonction f(x) =1+e−x. Comme un opérateur de calcul flottant serait beaucoup trop coûteux, on va utiliser un circuit fournissant une valeur approchée de la fonction. Pour ce faire, on effectue une approximation linéaire de la fonction suivant le schéma de la Figure 3.
On suppose qu’on dispose d’une petite mémoire SRAM contenant les 4 coefficients ai,bi, représentés chacun sur 4 bits, et nécessaires à cette approximation linéaire. Indiquer les différentes caractéristiques de cette SRAM (nombre de bits d’adresses, nombre de bits de sortie, nombre d’entrées). En utilisant des opérateurs arithmétiques (à préciser), en plus de cette SRAM, donner le circuit dont l’entrée est x (sur 4 bits) et la sortie est y=f(x)(sur 4 bits). On nommera x3x2x1x0les 4 bits de x, et y3y2y1y0les 4 bits de y.
Réponse
La SRAM contient 4 entrées, donc deux bits d’adresse qui seront les bits x3x2. Chaque entrée correspond à 2×4bits.
FIG. 4 – Circuit d’approximation linéaire.
Voir Figure 4.
Exercice 2 - Connexion du réseau de neurones au LC2 (10 points)
La Figure 1 décrit l’implémentation matérielle du réseau de neurones : il contient trois neurones, le neurone de la couche supérieure est connecté aux deux neurones de la couche inférieure (par le biais de synapses) ; ces deux neurones sont eux-mêmes connectés à deux registres d’entrée RN0,RN1, et le neurone de la couche supérieure est connecté à un registre de sortie RN2. Chaque synapse est également stockée dans un registre (RN3 à RN8) mais ceux-ci ne sont pas représentés sur la figure. L’entrée des registres RN0,RN1 est connectée au bus. La sortie du registre RN2 est également connectée au bus.
Le processeur ne dispose pas d’instructions spécifiques pour lire/écrire dans ces registres. Il utilise pour cela des adresses mémoire particulières, chaque adresse étant associée à l’un des registres (memory-mapped I/O). Un circuit combinatoire appelé Contrôleur RN et relié au registre MAR du processeur, voir Figure 1, permet de détecter si l’adresse transitant sur le bus correspond à l’un des registres du réseau de neurones.1
On veut implémenter ce contrôleur d’adresses. On suppose que les 9 registres RN0 à RN8 correspondent aux adresses 0x1000 à 0x1008.
Question 2.1
Donner le bout de programme assembleur permettant d’écrire le contenu du registre R0 dans le registre d’en- trée/sortie RN0. On ne se préoccupera pas d’appel de fonctions, pile, sauvegarde de registres, etc, on ne demande que le(s) instruction(s) assembleur nécessaire(s).
Réponse
LD R1, RN0 STR R0, R1, 0 RN0 .FILL 0x1000
Question 2.2
Donner toutes les étapes de contrôle de l’instruction ST .
Réponse
Le principal point est de se souvenir que la donnée, e.g., le contenu de R0, est d’abord écrite dans MDR, en passant par l’ALU, puis que l’adresse est écrite en MAR. Comme on utilise deux fois le bus, il faut nécessairement deux cycles pour ces deux étapes.
1A titre d’information, ce contrôleur fonctionne de façon similaire au contrôleur d’adresses du LC2, mais il n’est pas attendu que le fonctionnement du contrôleur d’adresses du LC2 soit connu.
4
Question 2.3
Donner le bout de programme permettant d’écrire le contenu de l’adresse 0x2000 dans RN0, celui de 0x2001 dans RN1, puis de stocker le résultat du réseau de neurones à l’adresse 0x2B00.
Réponse
LD R0, INPUT ;
LDR R1, R0, 0 ; chargement du contenu de 0x2000 dans R1 LD R0, RN0 ;
STR R1, R0, 0
LDR R1, R0, 1 ; R1 = contenu de 0x2001 LD R0, RN1 ;
STR R1, R0, 0 ; LD R1, RN2 ; LDR R1, R1, 0 ; LD R0, OUTPUT ; STR R1, R0, 0 ; INPUT .FILL 0x2000 OUTPUT .FILL 0x2B00 RN0 .FILL 0x1000 RN1 .FILL 0x1001 RN2 .FILL 0x1002
Question 2.4
Typiquement, on veut appliquer le réseau de neurones à une grande quantité de données d’entrée. On suppose qu’on a 128 paires de données d’entrée, stockées à partir de l’adresse 0x2000 (la première donnée correspond à RN0, la seconde à RN1, la troisième à RN2, etc). On stocke les résultats, dans l’ordre des entrées, à partir de l’adresse 0x2B00. Donner le bout de programme permettant d’appliquer le réseau de neurones à toutes ces entrées et de récupérer les résultats à l’adresse désirée.
Réponse
AND R3, R3, 0 ; R3 = 0 (compteur) LD R2, NB ; R2 = borne de boucle NOT R2, R2 ;
ADD R2, R2, 1 ; R2 = - NB LD R5, INPUT ;
LD R6, OUTPUT ; LOOP :
ADD R4, R3, R3 ; R4 = R3 * 2
ADD R0, R5, R3 ; R0 = INPUT + compteur LDR R1, R0, 0 ;
LD R7, RN0 ;
STR R1, R7, 0 ; opérande RN0 LDR R1, R0, 1 ;
LD R7, RN1 ;
STR R1, R7, 0 ; opérande RN1
ADD R0, R6, R3 ; R0 = OUTPUT + compteur LD R1, RN2
LDR R1, R1, 0 ;
STR R1, R0, 0 ; écriture résultat (RN2) ADD R3, R3, 1 ; R3 += 1
ADD R7, R3, R2 ; compteur < NB ? BRn LOOP ; fin ?
INPUT .FILL 0x2000 OUTPUT .FILL 0x2B00 RN0 .FILL 0x1000 RN1 .FILL 0x1001 RN2 .FILL 0x1002 NB .FILL 0x0080
Question 2.5
On appelle b15...b0les 16 bits du registre MAR. Donner l’expression d’un signal GateNN, reliant RN2 au bus, et qui vaut 1 si b correspond à l’adresse associée à RN2.
Réponse
GateNN=b15. . .b13.b12.b11. . .b3.b3.b2.b1.b0
Question 2.6
Donner l’expression d’un signal LD.NN qui vaut 1 si b correspond à l’un des registres du réseau que l’on peut accéder en écriture (RN0 à RN8, sauf RN2). Expliquer votre raisonnement.
Réponse
Le seul registre qui ne peut être écrit est RN2, tous les autres ne sont accessibles qu’en écriture.
On veut donc une expression logique pour laquelle b15...b4est égal à 0x100, b3b2b1b0est inférieur ou égal à 8 et b3b2b1b0
est différent de 0010.
Le circuit qui vaut 1 si b68est b3+b2.b1.b0.
Le circuit qui vaut 1 si les bits de poids fort de b valent 0x200 est b15. . .b13.b12.b11. . .b4. Le circuit qui vaut 1 si les bits b3b2b1b0sont différents de 0010 est b3+b2+b1+b0. LD.NN=b15. . .b13.b12.b11. . .b4.(b3+b2.b1.b0).(b3+b2+b1+b0).
Question 2.7
MEM.EN est un signal qui vaut 1 si l’on veut faire un accès à la mémoire en lecture ou en écriture. Pour quelles instructions assembleur, le circuit de contrôle doit-il mettre le signal MEM.EN à 1 ?
Réponse
ST, STR, LD, LDR
Question 2.8
On appelle MEM.ENLC2l’expression de MEM.EN pour le LC2 non modifié. Donner la nouvelle expression de MEM.EN avec l’accélérateur de réseau de neurones.
Réponse
La question était ambigüe. On pouvait soit l’interpréter comme les accès aux RNs engendrent des accès à la mémoire, et donc la solution est MEM.EN=MEM.ENLC2+LD.NN+GateNN. Soit les accès aux RNs ne sont pas, eux-mêmes, des accès à la mémoire et donc MEM.EN=MEM.ENLC2.LD.NN+GateNN. Les deux réponses ont été comptées comme justes en raison de l’ambiguité.
Exercice 3 - Connexion directe (DMA) du réseau de neurones à la mémoire (10 points)
On veut maintenant réaliser automatiquement les transferts des données d’entrée et de sortie, sans solliciter le processeur pour chaque donnée, en utilisant un principe similaire au DMA (Direct Memory Access). On va implé- menter un nouveau Contrôleur RN pour réaliser ce transfert automatiquement, en se substituant au processeur.
Pour ce faire, on ajoute 4 registres au contrôleur du réseau de neurones : FirstInputAddress, FirstOutputAd- dress, NbInputs, Go qui indiquent respectivement, l’adresse de la première donnée à charger (les données sont encore stockées suivant l’ordre RN0,RN1,RN0, . . .), l’adresse où doit être stocké le premier résultat, le nombre de paires d’entrées, et un signal qui vaut 1 lorsque les transferts doivent commencer, 0 sinon. Ces registres corre- spondent respectivement à RN9,RN10,RN11,RN12 et aux adresses 0x1009,0x100A,0x100B,0x100C.
Question 3.1
Ecrire le bout de programme permettant de déclencher le même transfert qu’à la question 2.4.
Réponse
LD R1, INPUT LD R0, RN9 STR R1, R0, 0 LD R1, OUTPUT LD R0, RN10 STR R1, R0, 0 LD R1, NB LD R0, RN11 STR R1, R0, 0 AND R0, R0, 0 ADD R0, R0, 1
ST R0, RN12 ; début transfert INPUT .FILL 0x2000
OUTPUT .FILL 0x2B00
6 RN9 .FILL 0x1009
RN10 .FILL 0x100A RN11 .FILL 0x100B RN12 .FILL 0x100C NB .FILL 0x0100
Question 3.2
Réaliser un circuit dont la sortie vaut 1 si deux bits a et b sont égaux, 0 sinon. En déduire un circuit dont la sortie vaut 1 si deux nombres de 7 bits a6...a0et b6...b0sont égaux, 0 sinon.
Réponse
X OR(a,b).
AND(X OR(a6,b6)...X OR(a0,b0)).
Question 3.3
On s’intéresse maintenant à la partie du Contrôleur RN permettant de réaliser le transfert de toutes les données de/vers le réseau de neurones, et en particulier à la génération des adresses. On suppose que le nombre maximum de données d’entrée est 128, et que la première donnée à lire et la première donnée à écrire sont placées à des adresses alignées modulo 256, c’est à dire dont les 8 bits de poids faible sont 00000000.
Le circuit générant les adresses fournit les trois entrées d’un multiplexeur contrôlé par deux bits c1c0. Ces trois entrées correspondent respectivement à l’adresse de la donnée destinée à RN0 (c1c0=00), l’adresse de la donnée destinée à RN1 (c1c0=01), et l’adresse à laquelle on doit écrire le contenu de RN2 (c1c0=10). Le circuit fournit également un signal fin pour indiquer que tout le transfert a été effectué. Lorsque le signal fin est activé, tout transfert est bloqué. Ce circuit est raccordé au bus par le biais d’un tri-state dont le signal est GateDMANN.
A l’aide des registres RN9 à RN12, de registres 1-bit contenant des valeurs fixes, de quelques registres supplé- mentaires, éventuellement disposant d’un signal reset (le registre est mis à 0 au début du cycle suivant l’activation du signal), d’un additionneur 7-bits, et de quelques portes logiques, proposer une implémentation de ce circuit.
Pour le moment on ne s’intéresse pas à la génération des différents signaux de contrôle (c1,c0,GateDMANN, les signaux de contrôle write et reset des registres ajoutés, les signaux de contrôle des registres LD.RNi et GateNN), cela sera abordé à la question suivante.
Réponse
FIG. 5 – Calcul d’adresse pour le transfert DMA.
Question 3.4
On veut maintenant créer le circuit de contrôle permettant de contrôler les signaux du Contrôleur RN suivants :
c1,c0,GateDMANN, les signaux de contrôle write et reset des registres ajoutés, LD.RN0,LD.RN1,LD.RN2 et GateNN, ainsi que les signaux appropriés du LC2.
On suppose que RN12 reste à 1 pendant toute la durée du transfert, mais qu’il est mis à 0 quand le signal fin est activé par le biais d’un signal reset.RN12. On suppose que le processeur est inactif pendant le transfert, donc le bus et la mémoire sont disponibles. Donner d’abord l’algorithme de ce circuit de contrôle, sous forme d’organigramme. Indiquer clairement quelles actions ont lieu dans le même cycle.
Réponse
L’algorithme débute quand RN12 passe à 1. Les actions ayant lieu dans le même cycle sont séparées par des virgules.
Initialisation reset.Compteur=1 Test fin :
si fin=0, reset.RN12=1 ; fin du transfert et de l’algorithme
; sinon, continuer Lecture RN0 :
c1c0=00, GateMDANN=1, LD.MAR=1, R.W=0, MEM.EN=1 ; transfert de l’adresse de la donnée destinée à RN0 vers MAR
LD.MDR=1, MIO.EN=1 ; lecture depuis la mémoire et stockage dans MDR GateMDR=1, LD.RN0=1 ; écriture de la donnée dans RN0
Lecture RN1 :
c1c0=01, GateMDANN=1, LD.MAR=1, R.W=0, MEM.EN=1 ; transfert de l’adresse de la donnée destinée à RN1 vers MAR
LD.MDR=1, MIO.EN=1 ; lecture depuis la mémoire et stockage dans MDR GateMDR=1, LD.RN1=1 ; écriture de la donnée dans RN1
Ecriture RN2 en mémoire :
LD.RN2, c1c0=10, GateMDANN=1, LD.MAR=1 ; écriture du résultat dans RN2, écriture de l’adresse de destination dans MAR
GateNN=1, LD.MDR=1, MIO.EN=0 ; transfert de la donnée de RN2 vers MDR R.W=1, MEM.EN=1 ; écriture de la donnée en mémoire
Incrémentation :
write.Compteur=1 ; le compteur est incrémenté goto ’Test fin’
Question 3.5
En utilisant le nombre de bascules D 1-bit de votre choix, donner une implémentation de ce circuit de contrôle.
Réponse
Pour l’implémentation du circuit, on utilise le principe de traduction d’un organigramme en circuit séquentiel vu en cours.
Question 3.6
On suppose dorénavant que le processeur peut être actif pendant le fonctionnement du réseau de neurones.
Pour éviter les conflits entre le réseau de neurones et le processeur, le circuit de contrôle du processeur fournit deux signaux d’état : MemFree et BusFree pour indiquer que respectivement la mémoire et le bus sont disponibles à ce cycle ; quand MemFree est activé, ni la mémoire, ni MAR, ni MDR ne sont utilisés. Le Contrôleur RN émet lui-même un signal MemBusy lorsqu’il a commencé à utiliser MAR ou MDR pour un transfert mémoire, et BusBusy lorsqu’il utilise le bus. Donner le nouvel organigramme de votre circuit de contrôle. On ne demandera pas son implémentation sous forme de circuit.
Réponse
Initialisation reset.Compteur=1 Test fin :
si fin=0, reset.RN2=0 ; fin du transfert et de l’algorithme
; sinon, continuer Lecture RN0 :
si BusFree=0 et MemFree=0, alors BusBusy=1 et MemBusy=1 ; bloquer le bus et la mémoire
sinon, goto Lecture RN0 ; boucle d’attente
c1c0=00, GateMDANN=1, LD.MAR=1, R.W=0 ; transfert de l’adresse de la donnée destinée à RN0 vers MAR
LD.MDR=1, MIO.EN=1 ; lecture depuis la mémoire et stockage dans MDR GateMDR=1, LD.RN0=1 ; écriture de la donnée dans RN0
8 BusBusy=0, MemBusy=0 ; libérer bus et mémoire
Lecture RN1 :
si BusFree=0 et MemFree=0, alors BusBusy=1 et MemBusy=1 ; bloquer le bus et la mémoire
sinon, goto Lecture RN1 ; boucle d’attente
c1c0=01, GateMDANN=1, LD.MAR=1, R.W=0 ; transfert de l’adresse de la donnée destinée à RN1 vers MAR
LD.MDR=1, MIO.EN=1 ; lecture depuis la mémoire et stockage dans MDR GateMDR=1, LD.RN1=1 ; écriture de la donnée dans RN1
BusBusy=0, MemBusy=0 ; libérer bus et mémoire Ecriture RN2 en mémoire :
si BusFree=0 et MemFree=0, alors BusBusy=1 et MemBusy=1 ; bloquer le bus et la mémoire
sinon, goto Ecriture RN2 ; boucle d’attente
LD.RN2, c1c0=10, GateMDANN=1, LD.MAR=1 ; écriture du résultat dans RN2, écriture de l’adresse de destination dans MAR
GateNN=1, LD.MDR=1, MIO.EN=0 ; transfert de la donnée de RN2 vers MDR R.W=1 ; écriture de la donnée en mémoire
BusBusy=0, MemBusy=0 ; libérer bus et mémoire Incrémentation :
write.Compteur=1 ; le compteur est incrémenté goto ’Test fin’
Rappels sur le LC-2
Dans cette section, on rappelle le jeu d’instructions du LC-2, voir Figure 7, et l’architecture du LC-2, voir Figure 6.
+1 2
IR LD.IR
R PCMX LD.PC
MARMX 2
+ ZEXT
ZEXT
@
MDR MAR
R.W
KBDR KBSR
CRTDR CRTSR 2 INMUX
LD.MAR
MIO.EN GateMDR
MEM.EN LD.MDR
Input Output
MIO.EN
GatePC
R7 R0
ALU OUT
SR2
OUT SR1
2 ALUK
GateALU SR1
SR2
SEXT
LD.REG DR
SR1MX DRMX
2
2
des
bus 16 bits
contrôle adresses mémoire
adressable sur 16 bits
N Z P LD.CC combinatoire combinatoire
BEN LD.BEN SR2MX contrôle microprogrammé BEN
GateMARMX
PC
CarryOut CarryIn
16 [8 :0]
16 [15 :9]
[5 :0]
[7 :0]
16 16
16 16
3
3 3
16 16
[4 :0]
[5]
[8 :6]
[11 :9]
[11 :9]
[15 :11]
[0 :2]
FIG. 6 – Schéma du LC-2 Note : les circuitsPC,IR,MAR,MDR,BEN,N,ZetPsont des registres.
Le rôle des signaux de contrôle de la figure 6 est explicité dans la liste suivante.
– LD.MAR/1, LD.MDR/1, LD.IR/1, LD.REG/1, LD.CC/1et LD.PC/1commandent l’écriture dans les divers registres du LC-2.
– LD.BEN/1commande l’écriture dans le registre BEN (branch enable) ; ce registre vaut 1 lorsque le branche- ment doit être pris (si l’instruction courante est un branchement conditionnel).
– GatePC/1, GateMDR/1, GateALU/1et GateMARMX/1commandent les accès en écriture sur le bus.
– MIO.EN/1doit être mis à 1 lorsque l’on souhaite accéder à la mémoire ou aux I/O, en lecture ou en écriture.
– R.W/1est mis à 0 pour une lecture et 1 pour une écriture en mémoire.
– ALUK/2: 00 pourADD, 01 pourAND, 10 pourNOT, 11 pour faire « traverser » l’entrée 1 sans calcul.
– PCMX/2sélectionne l’une des quatre entrées du multiplexeur : de droite à gauche, 00, 01, 10 et 11.
– MARMX/2 sélectionne l’une des trois entrées du multiplexeur : de gauche à droite, 00, 01 et 10 (11 est inutilisé).
10 – SR1MX/2sélectionne l’une des quatre entrées du multiplexeur : de haut en bas, 00 et 01 (10 et 11 ne sont
pas utilisés).
– DRMX/2sélectionne le registre destination (signal DR) : IR[11 : 9]pour 00, IR[8 : 6]pour 01 (10 et 11 ne sont pas utilisés).
– SR2MX/1est à part : ce signal détermine si la deuxième opérande vient du banc des registres ou du champ immédiat, il est par construction égal au bit 5 du registre d’instruction IR et n’intervient pas dans la micro- programmation.
PC→PC+1,LD.PC=1,GatePC=1,LD.MAR=1 chargement instruction MIO.EN=1,LD.MDR=1 instruction dans MDR
GateMDR=1,LD.IR=1 instruction dans IR PCMX=11,LD.PC=1 @→PC
TAB. 1 – Exemple de séquence de contrôle pour l’instruction JMP.
On rappelle également la liste des instructions du LC-2 (dans sa version simplifiée) en Figure 7.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ADD DR, SR1, SR2
(DR ← SR1 + SR2) 0 0 0 1 DR SR1 0 0 0 SR2
ADD DR, SR1, imm5
(DR ← SR1 + SEXT(imm5)) 0 0 0 1 DR SR1 1 imm5 : immédiat 5-bits signé AND DR, SR1, SR2
(DR ← AND(SR1, SR2)) 0 1 0 1 DR SR1 0 0 0 SR2
AND DR, SR1, imm5
(DR ← AND(SR1, SEXT(imm5))) 0 1 0 1 DR SR1 1 imm5 : immédiat 5-bits signé NOT DR, SR
(DR ← NOT(SR)) 1 0 0 1 DR SR 1 1 1 1 1 1
BRnzp label (PC = PC[15:9]@offset9
ifn.N+z.Z+p.P) 0 0 0 0 n z p offset 9-bits non signé dans la page courante JMP label
(PC = PC[15:9]@offset9) 0 1 0 0 0 0 0 offset 9-bits non signé dans la page courante JSR label
(R7 ← PCand
PC = PC[15:9]@offset9) 0 1 0 0 1 0 0 offset 9-bits non signé dans la page courante JMPR indexed address
(PC = BaseR + ZEXT(offset6)) 1 1 0 0 0 0 0 BaseR index 6-bits non signé JSR indexed address
(R7 ← PCand
PC = BaseR + ZEXT(offset6)) 1 1 0 0 1 0 0 BaseR index 6-bits non signé LEA DR, label
(DR ← PC[15:9]@offset9) 1 1 1 0 DR offset 9-bits non signé dans la page courante LD DR, label
(DR ← MEM(PC[15:9]@offset9)) 0 0 1 0 DR offset 9-bits non signé dans la page courante LDR DR, indexed address
(DR ← MEM(BaseR + ZEXT(offset6))) 0 1 1 0 DR BaseR index 6-bits non signé ST SR, label
(SR → MEM(PC[15:9]@offset9)) 0 0 1 1 SR offset 9-bits non signé dans la page courante STR SR, indexed address
(SR → MEM(BaseR + ZEXT(offset6))) 0 1 1 1 SR BaseR index 6-bits non signé
(PC ← RETR7) 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
FIG. 7 – Format des instructions du LC-2