Académique Documents
Professionnel Documents
Culture Documents
Cours 2
Code binaire, mémoire, pointeurs
Bus adresses
Unité de Pile
commande
Registres
Tas
Données
Unité
arithmétique Programme
et logique
Unité de controle Unité mémoire
Bus données
≈ micro processeur
La mémoire
valeur booléenne (vrai ou faux)
Deux interprétations :
valeur numérique (0 ou 1 (ou ̸= 0))
8 9 10 11 12 13 14 15
IOOO IOOI IOIO IOII IIOO IIOI IIIO IIII
Information binaire
Tableau comprenant la représentation de plusieurs nombres selon le
type char (sur un octet).
Crédits : https://zestedesavoir.com/tutoriels/755/le-langage-c-1/
notions-avancees/la-representation-des-types/
Calcul binaire
Organisation de la mémoire
▶ octet : paquet de 8 bits
OOIOIOIO
▶ mot mémoire : paquets de 4 ou 8 1 octets
OOIOIOIO OOIOIOIO OOIOIOIO OOIOIOIO
▶ séquence de mots mémoire
OOOOOOOO OOOOOOOO OOOOOOOO OOIOIOIO
OOIIOIOO OOIIOOIO OOOOOOOO OOOOOOOO
OOIOIOIO OOIOIOIO OOIOIOIO OOIOIOIO
OOIOIOIO OOIOIOIO OOIOIOIO OOOOOOOO
...
Et les float ?
Interprétation en 3 parties : signe, mantisse, exposant.
Crédits : https://zestedesavoir.com/tutoriels/755/le-langage-c-1/
notions-avancees/la-representation-des-types/
Types et données en mémoire
Et les float ?
Interprétation en 3 parties : signe, mantisse, exposant.
Crédits : https://zestedesavoir.com/tutoriels/755/le-langage-c-1/
notions-avancees/la-representation-des-types/
Types et données en mémoire
Attention :
Les octets OOOOOOOO OOOOOOOO OOOOOOOO OOIOIOIO
n’ont pas le même sens suivant qu’ils sont de type int ou
float .
<CF><FA><ED><FE>^G^@^@^A^C^@^@^@^B^@^@^@^P^@^@^@
X^E^@^@<85>^@ ^@^@^@^@^@^Y^@^@^@H^@^@^@__PAGEZERO
^@^@^@^@^@^@^@^@^@^@^@
...
01ebe814063727473747566662e6305f5f43544f525f4c
5f05f5f44544f525f4c4953545f5f05f5f4a43525f4c49
53545f5f05f5f646f5f676c6f62616c5f64746f72735f6
75780636f6d706c657465642e36353331064746f725f69
...
Et les programmes ?
01ebe814063727473747566662e6305f5f43544f52
5f05f5f44544f525f4c4953545f5f05f5f4a43525f
53545f5f05f5f646f5f676c6f62616c5f64746f727
75780636f6d706c657465642e36353331064746f72
...
Chaque octet a une adresse
0x7ffee345b300 11110011010100011101100101010101
0x7ffee345b304 11010001010100011100110101011101
0x7ffee345b308 11010001010100011101100101010101
0x7ffee345b30c 11010001010100011101100111010101
0x7ffee345b310 10010001010100011101100101010001
0x7ffee345b314 11010001010100011101101101010111
Organisation de la mémoire
Les programmes et les données
Paramètres,
Pile Variable locales
sp
Stack pointer
Crédits :
http://pageperso.lif.univ-mrs.fr/~alexis.nasr/Ens/Compilation/mips.pdf
Variables : déclarations et adresses
Localisations :
▶ globales : dans la zone des données
▶ locales et paramètres : dans la zone de la pile
https://app.wooclap.com/OIJNQR
Dynamique de la pile
1 #i n c l u d e < s t d i o . h>
2 #i n c l u d e < s t d l i b . h>
3
4 int f ( int x) {
5 r e t u r n x +1; // ( 2 )
6 }
7 i n t main ( ) {
8 i n t x =0; // ( 1 )
9 x=f ( 4 1 ) ;
10 p r i n t f ( ”%d\n” , x ) ; // ( 3 )
11 return 0;
12 } main x 0
pile (1)
Dynamique de la pile
1 #i n c l u d e < s t d i o . h>
2 #i n c l u d e < s t d l i b . h>
3
4 int f ( int x) {
5 r e t u r n x +1; // ( 2 )
6 }
7 i n t main ( ) {
8 i n t x =0; // ( 1 )
9 x=f ( 4 1 ) ; fonction f x 41
10 p r i n t f ( ”%d\n” , x ) ; // ( 3 )
11 return 0;
12 } main 0
pile (2)
Dynamique de la pile
1 #i n c l u d e < s t d i o . h>
2 #i n c l u d e < s t d l i b . h>
3
4 int f ( int x) {
5 r e t u r n x +1; // ( 2 )
6 }
7 i n t main ( ) {
8 i n t x =0; // ( 1 )
9 x=f ( 4 1 ) ;
10 p r i n t f ( ”%d\n” , x ) ; // ( 3 )
11 return 0;
12 } main x 42
pile (3)
La pile : variable, portée
Variables déclarées dans un bloc ne sont valables que
dans ce bloc 3 .
Elles sont :
1. empilées à l’entrée du bloc
2. dépilées en sortie de bloc
Exemple : que se passe-t-il avec ce code (Ex bloc2.c) ?
4 int f ( int x) {
5 i f ( x == 0 ) { https://app.wooclap.com/OIJNQR
6 int y = 0;
7 } else {
8 y = 1;
9 }
10 return y ;
11 }
12 i n t main ( ) {
13 i n t a=f ( 4 ) ;
14 p r i n t f ( ”%d\n” , a ) ;
15 return 0;
16 }
1 #i n c l u d e < s t d i o . h>
2 #i n c l u d e < s t d l i b . h>
3
4 int f ( int x) {
5 r e t u r n x +1; // ( 2 )
6 }
7 i n t main ( ) {
8 i n t x =0; // ( 1 )
9 x=f ( 4 1 ) ; (0x7ffee345b307)
(0x7ffee345b306)
10 p r i n t f ( ”%d\n” , x ) ; // (0x7ffee345b305)
(3) 0x7ffee345b304
11 return 0; main x 0
12 }
pile (1)
Variable : adresse et valeur
1 #i n c l u d e < s t d i o . h>
2 #i n c l u d e < s t d l i b . h>
3
4 int f ( int x) {
5 r e t u r n x +1; // ( 2 )
6 }
7 i n t main ( ) {
8 i n t x =0; // ( 1 )
9 x=f ( 4 1 ) ; fonction f x 41 0x7ffee345b308
10 p r i n t f ( ”%d\n” , x ) ; //
(3)
11 return 0; main 0 0x7ffee345b304
12 }
pile (2)
Variable : adresse et valeur
1 #i n c l u d e < s t d i o . h>
2 #i n c l u d e < s t d l i b . h>
3
4 int f ( int x) {
5 r e t u r n x +1; // ( 2 )
6 }
7 i n t main ( ) {
8 i n t x =0; // ( 1 )
9 x=f ( 4 1 ) ;
10 p r i n t f ( ”%d\n” , x ) ; //
(3)
11 return 0; main x 42 0x7ffee345b304
12 }
pile (3)
Variable et adresse en C
1 #i n c l u d e <s t d i o . h>
2 #i n c l u d e <s t d l i b . h>
3
4 i n t main ( ) {
5 int x = 0 ;
6 i n t ∗p ;
7 p=&x ;
8 p r i n t f ( ”%d %p\n” , x , p ) ;
9 return 0;
p 0x7ffee345b304 0x7ffee345b308
10 }
main x 0 0x7ffee345b304
pile
Variable : adresse et valeur (bis)
Affectation : x = x+1
▶ le x à gauche désigne l’adresse
▶ le x à droite désigne la valeur à cette adresse
Affectation avec un pointeur : *p = *p+1
▶ le *p à gauche désigne l’adresse contenue dans a (ici, adresse
de a)
▶ le *p à droite désigne l’entier contenu à l’adresse contenue
dans p (ici, la valeur de x)
⇒ ≪ effet de bord ≫ : après *p = *p + 1, x vaut 1
Pointeurs dans les paramètres de fonction
Fonction d’échange
1 void swap ( int x , int y ) {
2 int t ;
3 t = x;
4 x = y;
5 y = t;
6 }