L'instruction qui ne fait rien
L'opération NOP n'effectue strictement rien. Cette instruction et de par son inutilité totalement primordiale.
N'impacte aucun flag.
En résumé :
Usage : NOP
Exemple : NOP
Résultat : Aucun
Etape 4 : Encodage des instructions
Une fois le jeu d'instruction définit de façon fonctionnelle, il faut associer à chaque instruction un code et définir comment et où
seront codés les différents paramètres et opérandes.
Cette codification s'effectue d'abord à partir du nombre de bits nécessaire aux opérandes : les opérations telles que les sauts absolus
et appel de sous fonction absolus doivent utiliser une codification très courte. Elles seront donc traitées en priorité : il faut réserver
30 bits pour l'adresse absolue de sorte à ce que, comme les adresses des sauts sont forcément alignées sur 32 bits, il soit possible
d'adresser la totalité de la mémoire. De fait ces instructions doivent être codées sur 2 bits : le premier permettra d'indiquer qu'il s'agit
d'une instruction de saut, le second de distinguer le saut (JMP) de l'appel de procédure. Ces instructions auront donc leur bit de poids le
plus fort à 0. Toutes les autres instructions commenceront donc forcément par un 1.
Parmi les instructions restantes, l'instruction JB doit permettre un saut à une adresse relative, il sera donc utile d'optimiser sa codification
pour permettre de couvrir une zone mémoire la plus large possible lors de ce saut. Ainsi, cette instruction pourra être codée sur 3 bits en
commençant par 0.
Il reste ensuite l'instruction ADDd, qui ajoute une valeur direct au contenu d'un registre. Cette valeur directe doit aussi être la plus
large possible et cette instruction, comme JB devra être codé sur 3 bits.
Les autres instructions du jeu ne demandent pas de traitement spécifique et leur codage pourra s'effectuer sur 8 bits, l'usage de ces bits devra
permettre l'identification simple des famille d'instruction pour aider au décodage rapide des instructions et donc des signaux de contrôle de l'ALU.
La plupart des instructions utilisent 3 registres : 1 de destination et 2 opérandes, ceux-ci devront être encodés sur les mêmes bits dans toutes les instructions de sorte à simplifier leur décodage, optimiser la logique de l'ALU. De même les modes devront se situer grosso-modo sur les mêmes bits.
Choix de l'encodage des instructions
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 | Instruction code | Instruction |
0 | 0 | 0x0 | JMP | ||||||||||||||||||||||||||||||
0 | 1 | 0x1 | CALL | ||||||||||||||||||||||||||||||
1 | 1 | 0 | 0x6 | JB | |||||||||||||||||||||||||||||
1 | 0 | 1 | 0x5 | ADDd | |||||||||||||||||||||||||||||
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0x80 | ADDr | ||||||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0xF1 | AND | ||||||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0xF2 | OR | ||||||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0xF3 | XOR | ||||||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0xF4 | ROT | ||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0xF8 | MUL | ||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0xF9 | DIV | ||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0xFC | LOADd | ||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0xFD | LOADm | ||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0xFE | LOADr | ||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0xFF | NOP | ||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0xEC | STORE | ||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0xE0 | CPYB | ||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0xE4 | PUSH | ||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0xE5 | POP | ||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0xE8 | JMPr | ||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0xE9 | CALLr |
Incorporation des zones d'opérandes fixes
Les champs d'opérande de destination (Rdd) et d'opérandes sources 1 et 2 (Rnn et Rmm) occupent une place fixe dans les instructions pour permettre un décodage simple des instructions.
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 | Instruction |
Code instruction | Destination | Opérande 1 | Opérande 2 | |||||||||||||||||||||||||||||
0 | 0 | JMP | ||||||||||||||||||||||||||||||
0 | 1 | CALL | ||||||||||||||||||||||||||||||
1 | 1 | 0 | Rnn | JB | ||||||||||||||||||||||||||||
1 | 0 | 1 | Rdd | Rnn | ADDd | |||||||||||||||||||||||||||
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Rdd | Rnn | Rmm | ADDr | |||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | Rdd | Rnn | Rmm | AND | |||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | Rdd | Rnn | Rmm | OR | |||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | Rdd | Rnn | Rmm | XOR | |||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | Rdd | Rnn | ROT | ||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | Rdd | Rnn | Rmm | MUL | |||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | Rdd | Rnn | Rmm | DIV | |||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | Rdd | LOADd | |||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | Rdd | Rmm | LOADm | ||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | Rdd | Rnn | LOADr | ||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | NOP | ||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | Rnn | Rmm | STORE | ||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | Rdd | Rnn | CPYB | ||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | Rnn | PUSH | |||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | Rdd | POP | |||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | Rnn | JMPr | |||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | Rnn | CALLr |
Ajout des autres zones
Comme nous l'avons vu, chaque instruction intègre des zones supplémentaires telles que le mode ou des valeurs directes, il nous faut donc maintenant les placer parmi l'espace non encore occupé.
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 | Instruction |
Code instruction | Destination | Opérande 1 | Opérande 2 | |||||||||||||||||||||||||||||
0 | 0 | Adresse absolue | JMP | |||||||||||||||||||||||||||||
0 | 1 | Adresse absolue | CALL | |||||||||||||||||||||||||||||
1 | 1 | 0 | mode | v | bit | Rnn | Adresse relative | JB | ||||||||||||||||||||||||
1 | 0 | 1 | value | Rdd | Rnn | value | ADDd | |||||||||||||||||||||||||
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | Rdd | Rnn | Rmm | mode | ADDr | ||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | Rdd | Rnn | Rmm | AND | |||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | Rdd | Rnn | Rmm | OR | |||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | Rdd | Rnn | Rmm | XOR | |||||||||||||||||||||
1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | Rdd | Rnn | step | dir | mode | ROT | |||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | Rdd | Rnn | Rmm | mode | MUL | ||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | Rdd | Rnn | Rmm | mode | type | DIV | |||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | Rdd | valeur directe | mode | LOADd | |||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | Rdd | Rnn | mode | LOADm | |||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | Rdd | Rnn | mode | LOADr | |||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | NOP | ||||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | Rnn | Rmm | mode | STORE | |||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | Rdd | Rnn | dest bit | mode | src bit | CPYB | |||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | Rnn | PUSH | |||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | Rdd | POP | |||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | Rnn | JMPr | |||||||||||||||||||||||
1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | Rnn | CALLr |
Les zones non affectées ne sont pas utilisées, elles seront par défaut mise à zéro. Elles pourront aussi être utilisées par la suite pour optimiser le décodage des signaux de l'ALU en complément du mode. Nous verrons celà lors de la phase d'implémentation. L'association entre les modes et leur valeur n'est pas décrite ici mais vous la trouverez dans le document décrivant le jeu d'instruction.