instruction
Une définition du Jargon Français.
| |
nom→ féminin→. [programmation]. Ordre (consigne) élémentaire que le processeur peut exécuter.
L'opcode est le code numérique d'une instruction, c'est la seule version que le processeur peut comprendre. Le langage machine emploie uniquement des opcodes.
Le mnémonique est le nom de l'instruction pour les humains, plus facile à mémoriser que l'opcode et employé lorsque l'on programme en langage d'assemblage. Un compilateur spécifique, appelé assembleur, les traduit en langage machine.
Par extension le terme instruction désigne également un « ordre » élémentaire de n'importe quel langage de programmation, utilisable dans un code source.
Il en existe 5 types : arithmétique, branchement, entrées/sorties, logique et transfert.
Instruction n'est théoriquement pas synonyme de commande, car cette dernière est utilisable que de façon isolée donc hors d'un code source (par exemple sur une ligne de commande).
| | Couramment confondu avec une ligne de code, mais la plupart des langages permettent de placer plusieurs instructions sur une seule ligne de code source.
Voir aussi bloc. |
[modifier] Langage de haut niveau, langage d'assemblage et langage machine
Voici un code source en langage C, réputé d'assez haut niveeau :
/* Ceci est un commentaire ! */ /* Voici de la ''cuisine interne'' */ #include <stdio.h> /* Voici la principale fonction du programme */ int main() { /* La fonction ''puts'' (''put string'') place son argument sur la sortie standard, puis y passe à la ligne suivante */ puts("Coucou JargonF.org!"); }
Demandons à un compilateur C (il s'agit de gcc, ici utilisé sous Linux), de produire un code en langage d'assemblage correspondant : gcc -S coucou.c
Cela produit le code source en langage d'assemblage suivant :
.file "coucou.c" .section .rodata .LC0: .string "Coucou JargonF.org!" .text .globl main .type main, @function main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $4, %esp movl $.LC0, (%esp) call puts movl $0, %eax addl $4, %esp popl %ecx popl %ebp leal -4(%ecx), %esp ret .size main, .-main .ident "GCC: (GNU) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)" .section .note.GNU-stack,"",@progbits
Produisons un exécutable : gcc -Wall coucou.c -o coucou
Désassemblons-le sommairement grâce à objdump.
Cela produit un code binaire en langage machine dont voici le début d'une version simplifiée et flanquée d'une colonne reprenant le code en langage d'assemblage, dont ceux qui travaillent en langage machine ne profitent pas ! (La syntaxe est celle d'as, non celle d'Intel) :
| Langage machine | Langage d'assemblage | Commentaire |
|---|---|---|
| 8d 4c 24 04 | leal 4(%esp), %ecx | Load Effective Address, place une adresse dans le registre nommé ECX, qui devient un pointeur |
| 83 e4 f0 | andl $-16, %esp | et binaire |
| ff 71 fc | pushl -4(%ecx) | push de la valeur placée 4 mots avant l'adresse pointée par le registre ECS |
| 55 | pushl %ebp | push ce que contient le registre EBP |
| 89 e5 | movl %esp,%ebp | Copie dans le registre EBP la valeur abritée dans le registre ESP |
| 51 | pushl %ecx | push ce que contient le registre ECX |
| 83 ec 04 | subl $0x4,%esp | Soustraction |
| c7 04 24 88 84 04 08 | movl $0x8048488,(%esp) | Place une valeur dans l'adresse pointée par ESP |
| e8 0b ff ff ff | call 804827c <puts@plt> | Appel de la fonction puts |
| b8 00 00 00 00 | movl $0x0,%eax | Place 0 dans le registre EAX |
| 83 c4 04 | addl $0x4,%esp | Addition |
| 59 | popl %ecx | pop |
| 5d | popl %ebp | pop |
| 8d 61 fc | leal 0xfffffffc(%ecx),%esp | |
| c3 | ret | return |
| 90 | nop | nop |

