L'instruction NOP et encodage du jeu d'instruction
Les instructions d'appel des procédure et de gestion de la pile

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

31302928272625242322 21201918171615141312 11109876543210 Instruction codeInstruction
000x0JMP
010x1CALL
1100x6JB
1010x5ADDd
100000000x80ADDr
111100010xF1AND
111100100xF2OR
111100110xF3XOR
111101000xF4ROT
111110000xF8MUL
111110010xF9DIV
111111000xFCLOADd
111111010xFDLOADm
111111100xFELOADr
111111110xFFNOP
111011000xECSTORE
111000000xE0CPYB
111001000xE4PUSH
111001010xE5POP
111010000xE8JMPr
111010010xE9CALLr

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.

31302928272625242322 21201918171615141312 11109876543210 Instruction
Code instructionDestination Opérande 1Opérande 2
00JMP
01CALL
110RnnJB
101RddRnnADDd
10000000RddRnnRmmADDr
11110001RddRnnRmmAND
11110010RddRnnRmmOR
11110011RddRnnRmmXOR
11110100RddRnnROT
11111000RddRnnRmmMUL
11111001RddRnnRmmDIV
11111100RddLOADd
11111101RddRmmLOADm
11111110RddRnnLOADr
11111111NOP
11101100RnnRmmSTORE
11100000RddRnnCPYB
11100100RnnPUSH
11100101RddPOP
11101000RnnJMPr
11101001RnnCALLr

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é.

31302928272625242322 21201918171615141312 11109876543210 Instruction
Code instructionDestination Opérande 1Opérande 2
00Adresse absolueJMP
01Adresse absolueCALL
110modevbitRnnAdresse relativeJB
101valueRddRnnvalueADDd
10000000RddRnnRmmmodeADDr
11110001RddRnnRmmAND
11110010RddRnnRmmOR
11110011RddRnnRmmXOR
11110100RddRnnstepdirmodeROT
11111000RddRnnRmmmodeMUL
11111001RddRnnRmmmodetypeDIV
11111100Rddvaleur directemodeLOADd
11111101RddRnnmodeLOADm
11111110RddRnnmodeLOADr
11111111NOP
11101100RnnRmmmodeSTORE
11100000RddRnndest bitmodesrc bitCPYB
11100100RnnPUSH
11100101RddPOP
11101000RnnJMPr
11101001RnnCALLr

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.

Extension du jeu d'instruction
Simple-Cpu The Simple CPU project The Simple CPU project
Un projet de disk91
Small CPU project