Document:un programme, plusieurs sources
Un programme, plusieurs codes sources aux sens équivalents
Voici un même programme exprimé en langage de haut niveau, puis de moins haut niveau, en un langage d'assemblage et enfin en un langage machine.
Lisp
Voici un code source en langage Lisp, développé par un humain:
(write-line "Coucou Jargonf.org!")
C
Voici un équivalent (simplifié) en langage C, que l'on peut obtenir grâce à un compilateur traduisant du Lisp en C :
/* 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!"); return(0); }
Stockons-le dans un module (sens 4) que nous appelons « coucou.c ».
Demandons à un compilateur C (ici gcc) de produire un exécutable correspondant :
gcc coucou.c -o coucou
Cela produit un fichier nommé « coucou » recelant du code binaire exprimé dans le langage machine du processeur de ma machine (un Core i5 de type AMD64), organisé selon un format dépendant du système d'exploitation (ici: de l'ELF).
Nous pouvons l'invoquer: ./coucou
Langage d'assemblage
Demandons à un compilateur C (ici: gcc) de produire un code en langage d'assemblage correspondant à notre code source en C :
gcc -S coucou.c
Cela produit ici, dans un fichier « coucou.s », 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: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 movq %rsp, %rbp .cfi_offset 6, -16 .cfi_def_cfa_register 6 movl $.LC0, %edi call puts movl $0, %eax leave ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Debian 4.4.5-8) 4.4.5" .section .note.GNU-stack,"",@progbits
Code exécutable
Demandons à objdump de désassembler l'exécutable afin d'en produire une version en langage d'assemblage exprimée selon les conventions Intel:
objdump --disassemble --disassembler-options=intel coucou
... ainsi que selon celles d'as:
objdump --disassemble coucou
Voici un extrait simplifié et commenté:
Langage machine | Langage d'assemblage (syntaxe Intel) |
Langage d'assemblage (syntaxe d'as) |
Commentaire |
---|---|---|---|
55 | push rbp | push %rbp | push |
48 89 e5 | mov rbp,rsp | mov %rsp,%rbp | mov. Les syntaxes diffèrent, ici les arguments sont permutés (Intel: la cible se trouve à gauche). rbp et rsp sont des noms de registres |
bf ec 05 40 00 | mov edi,0x4005ec | mov $0x4005ec,%edi | mov |
e8 ee fe ff ff | call 4003e0 <puts@plt> | callq 4003e0 <puts@plt> | L'instruction « call » appele une fonction |
b8 00 00 00 00 | mov eax,0x0 | mov $0x0,%eax | mov |
c9 | leave | leaveq | Place l'adresse de retour au sommet de la pile |
c3 | ret | retq | return |