Bonsoir,

J'étudie actuellement les contextes d'exécution en langage C. Pour cela, nous avons parfois à introduire du code assembleur modifiant les registres esp et ebp.

Voici un petit programme que j'ai créé pour essayer de comprendre le fonctionnement de la pile d'exécution.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
#include <stdio.h>
 
int esp, ebp;
 
/* Cette fonction replace les registres esp et ebp aux valeurs sauvegardées précedemement dans le main */
void f() {
  asm("movl %0, %%esp\n"
      :
      :"r"(esp));
  asm("movl %0, %%ebp\n"
      :
      :"r"(ebp));
}
 
int main(void) {
  asm("movl %%esp, %0\n"
      : "=r"(esp));
  asm("movl %%ebp, %0\n"
      : "=r"(ebp));
  printf("esp = %x\n",esp);
  printf("ebp = %x\n",ebp);
  f();  
  return 0;
}
Je compile ce code en 32 bits (gcc -m32) mais l'exécution m'indique une erreur de segmentation et j'aimerais comprendre d'où vient cette eurreur.

Merci d'avance pour votre aide.