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 : |
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.
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:
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 :
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.
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
si4 | snd | opcode | Reg | court | |||||||||||
R2 | R1 | ADD | 0 | 0 |
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
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+R2C'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+R3Une 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 = -R1C'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 suivantesRarement 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.
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 :
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
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 + R2Cette 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] <- R1Cette 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 dites "étendues" réutilisent la structure des formes courtes et rajoutent 16 bits pour fournir d'autres fonctionnalités :
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
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+R2si4 (R1) et snd (R2) sont tous les deux des registres sources, le résultat est écrit dans dst3 (R3).
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
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+5La 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).