Cours d’Architecture des Ordinateurs Andrei Doncescu · (Pascal, C, VB, Java, etc.). ! Les...

40
+ Cours d’Architecture des Ordinateurs Andrei Doncescu

Transcript of Cours d’Architecture des Ordinateurs Andrei Doncescu · (Pascal, C, VB, Java, etc.). ! Les...

+

Cours d’Architecture des Ordinateurs Andrei Doncescu

+Généralités

n  Langage successeur du langage B dans les années 60, premières normes en 1978 puis norme ANSI en 1989 et ISO en 1990.

n  Langage de base sous UNIX

n  Langage généraliste de syntaxe « simple »

n  Langage compilé (et non interprété)

n  Usage des pointeurs, récursivité

+ Programmation Informatique

n  Un programme est un ensemble d’instructions exécutées dans un ordre bien déterminé.

n  Un programme est exécuté par un processeur ( machine ).

n  Un programme est généralement écrit dans un langage évolué (Pascal, C, VB, Java, etc.).

n  Les instructions qui constituent un programme peuvent être classifiées en 4 catégories : n  Les Instructions d’affectations : permet de faire le transfert

des données n  Les instructions arithmétiques et logiques. n  Les Instructions de branchement ( conditionnelle et

inconditionnelle ) n  Les Instructions d’entrées sorties.

+

4

Exécution d’un Programme

n  Pour exécuter un programme par une machine, on passe par les étapes suivantes :

1.  Édition : on utilise généralement un éditeur de texte pour écrire un programme et le sauvegarder dans un fichier.

2.  Compilation : un compilateur est un programme qui convertit le code source ( programme écrit dans un langage donné ) en un programme écrit dans un langage machine ( binaire ). Une instruction en langage évolué peut être traduite en plusieurs instructions machine.

3.  Chargement : charger le programme en langage machine dans mémoire afin de l’exécuter .

+Comment créer un programme « exécutable » ?

prog_principal.c sous_prog1.c sous_prog2.c

prog_principal.o sous_prog1.o sous_prog2.o

prog_executable

1) Compilation

2) Edition des liens

0) Ecriture des fichiers sources *.c 1) Compilation : cc -c prog_principal.c (idem pour les sous programmes) 2) Liens : cc prog_principal.o sous_prog1.o sous_prog2.o -o prog_executable 3) Reste à lancer prog_executable … La procédure de compilation est souvent automatisée à l ’aide d ’un fichier nommé Makefile

(fichiers sources)

(fichiers objets)

+Structure d’un programme

n Un programme est composé de plusieurs fonctions qui échangent et modifient des variables

n Chaque fonction, y compris la fonction main, comprend les éléments suivants : n Directives du préprocesseur n Déclaration d ’objets externes (variables,

fonctions) n Interface de la fonction n Bloc d’instructions

+

Système à base 10 à Système Décimal [72069.45]10 = 72069.45 = 7x104 + 2x103 + 0x102 + 6x101 + 9x100 + 4x10-1 + 5x10-2

Système à base 16 à Système HexaDécimal

[7A6C9D.F5]16=[7x165 + Ax164 + 6x163 + Cx162 + 9x161 + Dx160 + Fx16-1 + 5x16-2 ]10=[?]10

Système à base 8 à Système Octal

[726041.53]8 = [7x85 + 2x84 + 6x83 + 0x82 + 4x81 + 1x80 + 5x8-1 + 3x8-2]10 =[?] 10

Système à base 2 à Système Binaire

[1001010.01]2 = [1x26 + 0x25 + 0x24 + 1x23 + 0x22 + 1x21 + 0x20 + 0x2-1 + 1x2-2 ]10=[?]10

EXEMPLES

=[?]10 è 2x à …, 0.125, 0.25, 0.5, 1, 2, 4, 8, 16, 32, 32, 64, 128, 256, 512, 1024, 2048, … Note 1: 210 = 1K (kilo), 220 = 1M (Mega), 230 = 1G (Giga), 240 = 1T (Tira), Note 2: 16x=24x et 8x=23x à d’ou l’importance des systèmes : Octal et Hexadécimale en microélectronique. [10 110 001 101 011 . 111 100 110] 2 = [26153.746] 8 = [26153.746] 8 = [2C6B.F3]16

X=0

+

Règle: [Ne.Nf]10 = [?]R Ne / R : Quotient à Ne0, et Reste0 à d0 Ne0 / R : Quotient à Ne1, et Reste1 à d1 Ne1 / R : Quotient à Ne2, et Reste1 à d2 …, etc. Nf X R : (Résultat1 - P_Ent1) à Nf1, et P_Ent1 àd-1 Nf1 X R : (Résultat2 - P_Ent2) à Nf2, et P_Ent2 àd-2 Nf3 X R : (Résultat2 - P_Ent2) à Nf3, et P_Ent2 àd-2 …, etc.

CONVERTION DECIMALE à R (2, 8, 16)

Conversion Décimale à RADIX (2, 8, 16)

+

•  Le complément à ‘1 ’ d’un nombre binaire consiste simplement à inverser ses bits.

• 

Complément à ‘2’ et Complément à ‘1’

Le complément à ‘2 ’ d’un nombre binaire consiste à ajouter 1 à son complément à 1

C’2 de 010110 à 101010

C’1 de 010110 à 101001 Exemple

+

n  Octet Signé à

n  Mot Signé à

n 

D7 D6 D0

Magnitude Signe

. . . . . +127 0111 1111

+126 0111 1110

… …

+2 0000 0010

+1 0000 0001

0 0000 0000

-1 1111 1111

-2 1111 1110

… …

-127 1000 0001

-128 1000 0000

Nombres négatifs à ‘C’2’ des magnitudes de leurs équivalents positifs - n = NOT (+ n) + 1

Exemple: -32 à NOT (+32d = 00100000b) + 1 à 11011111 + 1 à 11100000b

Nombres positifs

Magnitude

D7 D6 D0

Signe

. . . . . D15 D14 D8 +32767 0111 1111 1111 1111

+1 0000 0000 0000 0001

0 0000 0000 0000 0000

-1 1111 1111 1111 1111

-32768 1000 0000 0000 0000

[ - 32768 à + 32767 ]

[ - 128 à + 127 ]

L’ORDINATEUR représente les nombres en nombre limité de bits: 8, 16, 32, 64 bits

+

Code ASCII

+Types de variables manipulées en C

n  Toutes les variables doivent être explicitement typées (pas de déclaration implicite comme en fortran)

n  Il y a globalement trois (quatre?) types de variables : n  Les entiers : int, short int, long int n  Les réels : float, double, long double n  Les caractères : char n  Rien … : void

n  exemples : short int mon_salaire; double cheese; char avoile;

n  NB : la présence d ’une ou plusieurs étoiles devant le nom de la variables indique un pointeur, dans nos applications il s ’agira en général de tableaux. ex : double **mat permet de définir une matrice

+

N = [dmdm-1 ... d1d0 . d-1d-2 ... d-n ]R

avec m et n étant entiers

R = Radix (2, 8, 10, 16, etc.) di entier = [0, 1,2, …, R-1]

Soit:

N = dm.Rm + dm-1.Rm-1 + … +d1.R + d0 + d-1.R-1 +… d-n.R-n

En général un nombre dans un système à base R (Radix) est noté comme suit: Partie Entière Partie Fractionnaire

Representation d’un nombre BINAIRE

+Le programme principal

•  La fonction « main » contient le programme principal

•  Le programme exécutable binaire commence par exécuter les instructions de ce programme principal

•  Sans fonction main, il est impossible de générer un programme exécutable

+ Directives du préprocesseur

n #include <math.h> : insère les interfaces des fonctions mathématiques comme par exemple fabs() qui évalue la valeur absolue d ’un réel

n #include <stdio.h> : entrées sorties standard

n #define chaine1 chaine2 : remplacement littéral de la chaîne de caractères chaine1 par chaine2

+ Les opérateurs arithmétiques Addition +

a = 3;

c = a + 2; // c = 5

Soustraction - a = 3;

c = a - 2; // c = 1

Multiplication * a = 3;

b = 11;

c = a + b; // c = 33

Division / a = 75;

b = 3;

c = a / b; // c = 25

Modulo % Reste de la division

a = 75; diz = a / 10; // diz = 7

unite = a % 10 // unite = 5 c ’est à dire le reste

+Qu’est-ce qu’un bloc d ’instructions ?

n Un bloc débute par une accolade ouvrante et se termine par une accolade fermante

n Il contient des déclarations de variables internes au bloc et des instructions

n Les instructions peuvent être elles aussi des blocs ou des commandes du langage C.

n Les lignes d ’instructions se terminent par des points virgules.

+Les entrées sorties : printf, scanf

n Le prototype de ces fonctions est dans <stdio.h>

n printf permet d ’afficher du texte à l ’écran n scanf permet d ’entrer du texte au clavier n fprintf et fscanf permettent de lire et d ’écrire

dans des fichiers Le programme de résolution de l’équation d’advection linéaire scalaire donne de nombreux exemples d’usage de ces fonctions

+printf, scanf (suite)

n  Ces fonctions utilisent des formats qui permettent de lire/écrire des variables de différents types : %e , %f : réels %le, %lf : réels de type double %d : entiers %ld : entiers long int %s : chaîne de caractères %c : un caractère

+printf, scanf (suite)

n  Le caractère « \ » (backslash) permet d ’utiliser certains caractères « non imprimables » , les plus utilisés sont les suivants : \n : fin de ligne \t : tabulation horizontale \a : sonnerie

+ printf, scanf : exemples

#include<stdio.h> int i; printf(" i = %d \n",i); /* Imprime i = valeur de i et va à la ligne */ fscanf(infile, "%d ",&i); /* lit dans le fichier infile la valeur de i, on passe à fscanf l ’adresse de i c ’est à dire &i */ nb: Comme fscanf doit modifier la variable i, le paramètre passé à la fonction est l ’adresse de la variable i.

+

n La boucle for : for (initialisation ; test ; instruction) { instructions };

n Exemple : for (i = 0 ; i <= 50 ; i++) { printf(« i = %d\n »,i);

} « Commencer à i =0, tant que i <= 50 , exécuter l ’instruction printf et incrémenter i »

+ Les tests

n Syntaxes : n if (expression_test)

bloc d ’instructions 1 Si expression_test est vraie on exécute le bloc d ’instructions 1, sinon on passe à la suite.

n if (expression_test) bloc d ’instructions 1

else bloc d ’instructions 2

Si expression_test est vraie on exécute le bloc d ’instructions 1 sinon on exécute le bloc 2.

+Instruction conditionnelle IF…. ELSE

Condition ?

Action 1 Action 2

Vrai

Fausse

if( condition ) action1;

else action2;

if( a > b ) c = c - a;

else c = c- b;

if( a > b )

{ c = c - a;

d = c - a;

}

else { c = c - b;

d = c - b;

}

if( a > b )

{ c = c - a;

d = c - a;

}

if( (a > b) && ( b > 0) ) c = c - a;

else c = c- b;

Si la condition est vrai

• faire l ’action 1

• sinon faire action 2

+Tests (suite)

•  Enchaînement de if : if (expression_test1)

bloc_d_instructions_1 else if (expression_test2)

bloc_d_instructions_2 else if (expression_test3)

bloc_d_instructions_3 ... else bloc_d_instructions_final

+Expressions évaluées dans les tests

•  if (a = b) : erreur fréquente, expression toujours vraie !

•  if (a == b) : a égal à b

•  if (a != b) : a différent de b

•  if (a > b) : a supérieur à b

•  if ((a >=b)&&(a>0)) : a supérieur ou égal à b et a positif

•  if ((a<=b)||(a>0)) : a inférieur ou égal à b ou a positif

•  ...

+ Instruction conditionnelle SWITCH … CASE

Remplace une suite de IF .. ELSE

• expression doit être un entier ou un caractère.

• Switch compare cette expression aux valeurs des différents case.

• L ’instruction break permet de sortir d ’un bloc. Ici cela permet de ne pas tester les case suivants.

• Default est effectué si aucun des case n ’est effectué.

switch ( expression )

{

case valeur1 : instruction(s) 1; break;

case valeur2 : instruction(s) 2; break;

case valeur3 : instruction(s) 3; break;

default : instruction(s) par défaut;

}

switch ( valeur )

{

case 1 : led1 = 1; led2 = 0; led3 = 0; break;

case 2 : led1 = 0; led2 = 1; led3 = 0; break;

case 7 : led3 = 1;

case 3 : led1 = 1; led2 = 1; break;

default : led1 = 0; led2 = 0; led3 = 0;

}

Valeur led1 led2 led3

0

1

2

3

4

5

6

7

0 0 0

1 0 0

0 1 0

1 1 x

0 0 0

0 0 0

0 0 0

1 1 1

Répondre par •  0 •  1 •  x si pas de modification

+ Boucles et branchements

n La boucle while : while(test) { instructions;}

n exemple … int i;

i = 0; while (i < 10) {

printf(« i = %d \n »,i); i++; }

… « Tant que i est inférieur à 10, écrire i à l ’écran, incrémenter i »

+

n  La boucle do … while : do { instructions; } while (test);

n  permet d ’exécuter au moins une fois les instructions avant d ’évaluer le test

+

Boucle WHILE

while (condition)

{

action;

… ;

}

x = 0;

while ( x < 5 )

{

action;

x++;

}

x = 10;

while ( x < 5 )

{

action;

x++;

}

Cette boucle est identique à une boucle FOR

while ( bouton == 0 )

{

action;

}

Tant que condition vraie faire...

while ( 1 )

{

action;

… … ;

}

Condition ?

Action

Sortie de la boucle

+

Nombre d ’exécutions de la boucle : A la sortie de la boucle total =

5 10

Boucle DO … WHILE

Faire... tant que condition vraie

do

{

action;

… ;

}

while (condition);

Action est toujours exécutée au moins une fois

que condition soit vraie ou fausse.

x = 0;

total = 0;

do

{

total = total + x;

x++;

}

while ( x < 5 );

Condition ?

Action

Sortie de la boucle

+ Exemple de fonction

/*Directives du preprocesseur*/ #include <math.h> #include <stdio.h> #define MAX(a,b) ((a) > (b) ? (a) : (b))

/* Variables externes, globales, déclarées dans le programme principal */ extern double a; extern long int imax; extern double * rho; extern double * fphy; extern double * fnum; void flux_numerique (void) /* Interface de la fonction */ { /* Debut de bloc d ’instructions */ long int i; /* Variable locale */ /* Schema decentre */ for (i = 0 ; i <= imax-1 ; i++) { fnum[i] = 0.5*(fphy[i] + fphy[i+1]) - 0.5*fabs(a)*(rho[i+1]-rho[i]); } } /* Fin de bloc */

+

35

La mémoire centrale

n  La mémoire centrale (MC) représente l’espace de travail

de l’ordinateur .

n  C’est l’organe principal de rangement des informations utilisées par le processeur.

n  Dans un ordinateur pour exécuter un programme il faut le charger ( copier ) dans la mémoire centrale .

n  Le temps d’accès à la mémoire centrale et sa capacité sont deux éléments qui influent sur le temps d’exécution d’un programme ( performances d’une machine ).

+

36

0001100 0011100

0111100

0001100

0001100

0000

0001

0002

…….

……. ……..

FFFF

Une adresse

Contenu d’une case (un mot)mémoire

• La mémoire centrale peut être vu comme un large vecteur ( tableau ) de mots ou octets. • Un mot mémoire stocke une information sur n bits.

• Chaque mot possède sa propre adresse. • La mémoire peut contenir des programmes et les données utilisées par les programmes.

+Structure d’un programme en MC

Partie données ( variables )

Partie instructions …………. ……….

} 11100001 11100001 11000001 11100001 11000001 11110000

1111111 1000000

0000000

Addition Soustraction

+

38

L’Unité Centrale ( UC)

n  L’unité centrale (appelée aussi processeur , microprocesseur) à pour rôle d’exécuter les programmes.

n  L’UC est composée d’une unité arithmétique et logique (UAL) et d’une unité de contrôle. - L’unité arithmétique et logique réalise les opérations élémentaires

(addition, soustraction, multiplication, . . .) . - L’unité de commande contrôle les opérations sur la mémoire

(lecture/écriture) et les opérations à réaliser par l’UAL selon l’instruction en cours d’exécution.

+Architecture matérielle d’une machine Von Neumann

UC

+

40

L’UAL

n  L’unité arithmétique et logique réalise une opération élémentaire (addition, ,soustraction, multiplication, . . .).

n  L’UAL regroupe les circuits qui assurent les fonctions logiques et arithmétiques de bases ( ET,OU,ADD,SUS,…..).

n  L’UAL comporte un registre accumulateur ( ACC ) : c’est un registre de travail qui sert a stocker un opérande (données )au début d’une opération et le résultat à la fin.

+

41

Unité de contrôle

n  Le rôle de l'unité de contrôle (ou unité de commande ) est de : n  coordonner le travail de toutes les autres unités ( UAL , mémoire,…. )

n  et d'assurer la synchronisation de l'ensemble.

n  Elle assure : n  la recherche ( lecture ) de l’instruction et des données à partir de la

mémoire, n  le décodage de l’instruction et l’exécution de l’instruction en cours n  et prépare l’instruction suivante.

+

42

Schéma d’une UC