Article de reference

Opcode

En informatique , un code opération ( opcode ) est une valeur énumérée qui spécifie l'opération à effectuer. Les codes opérations sont utilisés dans les dispositifs matériels te...

informatique , un code opération ( opcode ) est une valeur énumérée qui spécifie l'opération à effectuer. Les codes opérations sont utilisés dans les dispositifs matériels tels que les unités arithmétiques et logiques (UAL), les unités centrales de traitement (CPU) et les jeux d'instructions logiciels. Dans les UAL, le code opération est directement appliqué aux circuits via un bus de signaux d'entrée. En revanche, dans les CPU, le code opération est la partie d'une instruction en langage machine qui spécifie l'opération à effectuer.

machines de calcul abstraites . Dans les CPU, un opcode peut être appelé code machine d'instruction , code d'instruction , syllabe d'instruction , paquet d'instruction ou chaîne d'opérations . Pour un processeur donné (qu'il s'agisse d'un CPU général ou d'une unité de traitement plus spécialisée), les opcodes sont définis par l' architecture du jeu d'instructions (ISA) du processeur . Ils peuvent être décrits à l'aide d'une table d'opcodes . Les types d'opérations peuvent inclure des opérations arithmétiques , la copie de données, des opérations logiques , le contrôle de programme et des instructions spéciales (par exemple, CPUID ) .

Outre le code opération, de nombreuses instructions spécifient les données (appelées opérandes ) sur lesquelles l'opération agira, bien que certaines instructions puissent avoir des opérandes implicites ou aucun opérande. Certains jeux d'instructions possèdent des champs quasi uniformes pour les spécificateurs de code opération et d'opérandes, tandis que d'autres (par exemple, l'architecture x86 ) ont une structure moins uniforme et de longueur variable. Les jeux d'instructions peuvent être étendus par des préfixes de code opération , qui ajoutent un sous-ensemble de nouvelles instructions composées de codes opération existants suivant des séquences d'octets réservées.

Exemple de tableau d'opcodes

Ce tableau présente les codes d'opération d'un microprocesseur simple à 8 bits, l' Intel 8008 de 1972.

Chaque code opération est codé sur 8 bits . Il est affiché sous forme de séquence binaire de 1 et de 0 dans la colonne « Code opération » . Jusqu'à deux champs supplémentaires peuvent être intégrés au code opération. Certains champs de 3 bits sont nommés DDD, SSS, CC et ALU. Les champs SSS (source) et DDD (destination) spécifient l'un des huit registres ou la mémoire 8008 possibles : A, B, C, D, E, H, L ou M. Le champ CC spécifie l'une des huit conditions de résultat qui activeront certaines instructions JMP, CAL et RET. Le champ ALU spécifie l'une des huit fonctions arithmétiques et logiques à exécuter lors de l'instruction : addition, addition avec retenue, soustraction, soustraction avec emprunt, ET logique, OU exclusif logique, OU logique et comparaison. Le « X » dans certains champs signifie qu'un 1 ou un 0 peut être inséré sans effet .

Les bits fixes (0 et 1) sont combinés aux champs de paramètres pour former le code opération 8 bits. L'instruction complète peut également nécessiter un ou deux octets supplémentaires d' opérandes . Ces derniers sont indiqués dans la deuxième colonne principale du tableau, intitulée « Opérandes » . Si aucun opérande n'est requis, la colonne est remplie d'un tiret ( ).

Comme les 0 et les 1 sont difficiles à mémoriser, la colonne Mnémonique affiche un code de lettre court et facile à retenir qu'un programmeur en langage assembleur peut utiliser pour invoquer le code d'opération requis.

La colonne Description indique la fonction exécutée par le microprocesseur lorsqu'il rencontre un code d'opération spécifique.

OpcodeOpérandesMnémoniqueDescription
76543210b2b3
0000000XHLTArrêt
00DDD000INRDDD ← DDD + 1 (sauf A et M)
00DDD001DCrDDD ← DDD - 1 (sauf A et M)
00000010RLCA 1-7 ← A 0-6 ; A 0 ← Cy ← A 7
00CC011Rcc (RET conditionnel)Si cc est vrai, P ← (pile)
00ALU100donnéesADI ACI SUI SBI NDI XRI ORI Données IPCDonnées A ← A [opération ALU]
00N101RST n(pile) ← P, P ← N x 8
00DDD110donnéesDonnées LrI (Charger r avec les données immédiates)DDD ← données
00XXX111RETP ← (pile)
00001010RRCA 0-6 ← A 1-7 ; A 7 ← Cy ← A 0
00010010RALA 1-7 ← A 0-6 ; Cy ← A 7 ; A 0 ← Cy
00011010RARA 0-6 ← A 1-7 ; Cy ← A 0 ; A 7 ← Cy
01CC000addloaddhiJcc ajouter (JMP conditionnel)Si cc est vrai, P ← ajouter
0100port1Port INPA ← Port (ports 0 à 7 uniquement)
01port1Port de sortiePort ← A (ports 8 à 31 uniquement)
01CC010addloaddhiCcc ajouter (CAL conditionnel)Si cc est vrai, (pile) ← P, P ← ajouter
01XXX100addloaddhiJMP ajouterP ← ajouter
01XXX110addloaddhiCAL ajouter(pile) ← P, P ← ajouter
10ALUSSSADr ACr SUr SBr NDr XRr ORr CPrA ← A [Opération ALU] SSS
11DDDSSSLds (Charger d avec s)DDD ← SSS
11111111HLTArrêt
76543210b2b3MnémoniqueDescription
SSS DDD210CCALU
UN000FC, C fauxADr ADI (A ← A + arg)
B001FZ, Z fauxACr ACI (A ← A + arg + Cy)
C010FS, S fauxSUr SUI (A ← A - arg)
D011FP, P impairSBr SBI (A ← A - arg - Cy)
E100TC, C vraiNDr NDI (A ← A ∧ arg)
H101TZ, Z vraiXRr XRI (A ← A ⊻ arg)
L110TS, S vraiORr ORI (A ← A ∨ arg)
M111TP, P mêmeCPr IPC (A - arg)
SSS DDD210CCALU

le bytecode et d'autres représentations destinées à être exécutées par des interpréteurs logiciels. Ces représentations utilisent souvent des types de données et des opérations de niveau légèrement supérieur à ceux des opcodes matériels, mais leur construction reste néanmoins similaire. On peut citer comme exemples le bytecode des fichiers de classe Java , interprétés par les machines virtuelles Java , le bytecode utilisé dans GNU Emacs pour le code Lisp compilé , et le langage intermédiaire commun .NET (CIL) .