Document:un programme, plusieurs sources

Une définition du Jargon Français.
Aller à : Navigation, rechercher

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

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 arguments sont permutés entre syntaxes (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