yasep/docs/instructions_fr.html version 2009-08-29
Retour à la page d'accueil
Manquent les instructions conditionnelles et les auto-updates des pointeurs
version anglaise :

 

La structure des instructions dans l'architecture YASEP

Les instructions de YASEP ont un format fixe sur 16 bits avec un champ optionnel, immédiat ou étendu de 16 bits. Ce format est identique pour YASEP16 et YASEP32.

Chaque instruction peut contenir :

Ces champs et flags ne sont pas tous utilisés en même temps. Certaines combinaisons sont impossibles par construction, d'autres n'ont aucun sens, le reste peut être transformé par l'assembleur. Cependant, une grande variété d'instructions (un opcode suivi de noms de regitres, de données immédiates et d'autres flags) peut être écrite par un programmeur. Cette page explique quelles "formes d'instructions" sont disponibles, comment elles sont structurées et quand on les utilise.

 

Résumé

Une "forme d'instruction" est nommée selon son écriture en langage assembleur. C'est une séquence de lettres, désignant chacune un champ :

La structure du YASEP ne permet qu'un nombre limité de formes. Les deux bits de poids faible d'une instruction du YASEP déterminent comment interpréter les champs suivants, ce qui peut donner 4 combinaisons:

La forme étendue dispose d'un flag supplémentaire qui permet d'utiliser une des adresses de registre comme immédiat sur 4 bits. Cela porte à 5 le nombre de formes physiquement possibles. L'assembleur permet d'écrire d'autres formes, par exemple en exploitant les combinaisons de champs inutilisés.

 

Où sont écrits les résultats ?

Le YASEP écrit le résultat des opérations (si il y a lieu) dans un registre dont l'adresse est donnée par les champs si4, snd ou dst3, en fonction de la forme de chaque instruction :

 

Les "formes courtes"

Commençons par les formes d'instructions les plus simples. Les instructions courtes ont leur bit de poids faible égal à zéro, ce qui indique une longueur de 16 bits. Il reste juste assez de place pour un autre flag, un opcode de 6 bits et 2 champs de 4 bits.

Note : avant, ces deux champs s'appelaient src1 et src2, et on les confondait tout le temps, donc il sont renommés depuis 20090730

 

"forme courte à registres" : deux adresses de registre

ADD R2, R1 ; R1 <= R1 + R2
1514131211 109876 543210
si4 snd opcode Reg court
R2 R1 ADD 0 0
 

"forme courte immédiate" : une adresse de registre et une valeur immédiate

ADD -3, R1 ; R1 <= R1 + -3
1514131211 109876 543210
si4 snd opcode Imm4 court
-3 R1 ADD 1 0

En pratique, ces deux combinaisons peuvent être utilisées de 5 façons en langage assembleur, puisque chacun de ces champs peut être plus ou moins utile en fonction du type d'opération désirée :

Forme "RR" : De Registre à Registre

 ADD R1 R2   ; R2 <- R1+R2
C'est l'une des formes les plus courantes. si4 et snd donnent les adresses des deux registres contenant les opérandes. snd est aussi la destination du résultat.

 

Forme "iR" : immédiat court vers Registre

 ADD 2 R3   ; R3 <- 2+R3
Une autre forme courante. si4 donne une valeur immédiate, donc snd sert d'adresse de registre pour l'autre opérande source ainsi que la destination.

 

Forme "R" : Registre

 NEG R1   ; en interne : R1 = -R1
C'est aussi une façon courte d'écrire que les deux champs sont le même registre. L'assembleur va correctement remplir les champs si4 et snd si cette forme est acceptable pour l'opcode désiré.

 

Forme "i" : immédiat court

 CRIT 3   ; désactive les interruptions pour les 3 instructions suivantes
Rarement utilisé mais parfois nécessaire. si4 contient la valeur immédiate et snd est ignoré.

 

Forme "ALONE" : pas d'opérande

 NOP   ; pas d'opération, tout les champs sont ignorés.
C'est un cas extrême où aucune opérande n'est nécessaire. si4 et snd sont ignorés.

 

 

Les "formes longues"

YASEP interprète les instructions comme ayant une longueur de 32 bits quand leur bit de poids faible est à 1. Les 16 bits de poids faible sont exactement les mêmes que dans les formes courtes. Le second bit de poids faible indique comment interpréter le demi-mot de poids fort :

 

"Forme longue immédiate" : Deux adresses de registre et une valeur immédiate longue

ADD 1234, R2, R1 ; R1 <= 1234 + R2
31302928 27262524 23222120 19181716 1514131211 109876 543210
Imm16 si4 snd opcode imm16 long
1234h R2 R1 ADD 0 1
 

Forme "IRR" : Immédiat long et Registre vers Registre

 ADD 1234h R2 R1   ; R1 <- 1234h + R2
Cette forme est assez courante. En plus de l'opérande immédiate sur 16 bits, snd fournit l'adresse du registre qui sert de deuxième opérande. si4 donne la destination du résultat.

 

Forme "IR" : Immédiat long vers Registre

 GET 1234h R1   ; R1 <- SR[1234h]
Cette forme est utilisée pour les instructions GET ou MOV. Le champ si4 est ignoré parce que seul snd a un sens pour l'opération. L'assembleur détecte aussi si la valeur immédiate tient dans 4 bits pour utiliser une forme courte (FORM_iR) ou longue.

C'est aussi utilisé par les instructions booléennes (ROP2) et l'ASU (ADD et SUB) pour simuler FORM_iR mais avec une valeur immédiate sur 16 bits. Lorsqu'il trouve le flag ALIAS_IRR, l'assembleur va utiliser FORM_IRR et mettre la même adresse de registre dans les deux champs si4 et snd.

 

Forme "RI" : Registre vers Immédiat long

 PUT R1 1234h   ; SR[1234h] <- R1
Cette forme est uniquement utilisée pour l'instruction PUT. Elle est identique à FORM_IR mais l'ordre des opérandes est inversé par l'assembleur pour obéir à la règle n°1 selon laquelle "La destination est écrite à la fin de l'instruction".

 

 

Les formes étendues

Les formes dites "étendues" réutilisent la structure des formes courtes et rajoutent 16 bits pour fournir d'autres fonctionnalités :

Ces champs sont situés dans l'instruction à des positions qui facilitent au maximum le décodage des opérandes.

"Forme Etendue à Registres" : trois adresses de registres

ADD R1, R2, R3 ; R3 <= R1 + R2
31302928 27262524 23222120 19181716 1514131211 109876 543210
dst3 Reg si4 snd opcode Ext long
R3 0 R2 R1 ADD 1 1
 

Forme "RRR" : Registre et Registre vers Registre

 ADD R1 R2 R3 ; R3 <- R1+R2
si4 (R1) et snd (R2) sont tous les deux des registres sources, le résultat est écrit dans dst3 (R3).

 

"Forme Etendue Immediate" : deux adresses de registres et un champ immédiat de 4 bits

ADD 5, R1, R3 ; R3 <= R1 + 5
31302928 27262524 23222120 19181716 1514131211 109876 543210
dst3 Reg si4 snd opcode Ext long
R3 1 5 R1 ADD 1 1
 

Form "iRR" : imm4 et Registre vers Registre

 ADD 5 R1 R3 ; R3 <- R1+5
La valeur immédiate sur 4 bits de si4 (5) et la valeur du registre indiqué par snd (R1) sont les opérandes de l'addition, dont le résultat est écrit dans dst3 (R3).