Cours Architecture materielle des ordinateurs

Cours Architecture materielle des ordinateurs
...
Rappels d’architecture
Un ordinateur se compose principalement d’un processeur de memoire. ´
On y attache ensuite des periph ériques, mais ils sont optionnels.
donnees ´ : disque dur, etc
entree utilisateur : clavier, souris sortie utilisateur : ecran, imprimante processeur supplementaire : GPU ´
Le processeur
Le processeur lit et ecrit des informations en ´ mémoire
Il peut de plus effectuer des opérations arithmetiques et logiques ´
Chaque action qu’il peut effectuer est appelee´ instruction
Les instructions effectuees par le processeur sont stock ées dans ´ la memoire. ´
Il dispose d’un petit nombre d’emplacements memoire d’acc és plus rapide, les registres.
Un registre special nomm é pc (program counter) (ou ip (instruction counter)) contient l’adresse de la prochaine instruction a ex ` ecuter ´
De façon repétée le processeur : ´
1 lit l’instruction stockee´ a l’adresse contenue dans pc `
2 l’interprete ce qui peut modifier certains registres (dont pc) et la memoire ´
CISC / RISC
C’est principalement le jeu d’instruction qui distingue les processeurs
Les processeurs CISC (Complex Instruction Set Computer)
Nombre d’instruction elev é´
Les instructions realisent souvent les transferts vers et depuis la memoire peu de registres
Exemples : Intel 8068, Motorola 68000
Les processeurs RISC (Reduced Instruction Set Computer)
Peu d’instructions
Les instructions operent sur des registres `
Registres nombreux
Exemples :Alpha, Sparc, MIPS, PowerPC
X86
X86 est un jeu d’instruction commun a plusieurs processeurs `
Le nom X86 provient des processeurs Intel utilisant ce jeu d’instructions (8086, 80186, 80286, 80386, 80486) jeu d’instruction des processeurs equipant les ordinateurs personnels
Registres
Les processeurs X86 (a partir du 386) ont huit registres de quatre octets chacun
eax ax ah al
ebx bx bh bl
ecx cx ch cl
edx dx dh dl
esi
edi
esp
ebp les registres eax, ebx, ecx et edx peuvent etre d ˆ ecoup és en registres plus petits
eax peut etre d ˆ ecoup é en trois registres : un registre de deux octets : ax et deux registres d’un octet : ah et al.
esp pointe sur le sommet de la pile
ebp pointe sur l’adresse de base de l’espace global
Segmentation de la memoire ´
La memoire est divis ée en segments ind épendants. ´
L’adresse de debut de chaque segment est stock ée dans un registre.
Chaque segment contient un type particulier de donnees. ´
On s’interessera plus particuli érement ` a trois segments : le segment de données ou sont stock ` es les variables globales et les constantes. La taille de ce segment n’evolue pas au cours de l’execution du programme (il est statique). ´
le segment de code ou sont stock ` ees les instructions qui composent ´
le programme
la pile ou sont stock ` es les variables locales, param étres de fonctions et certains resultats interm édiares de calcul ´
L’organisation de la memoire en segments est conventionnelle ´
En theorie tous les segments sont accessibles de la m éme mani ˆ ere `
Registres lies aux segments ´
Segment de code
cs (Code Segment) adresse de debut du segment de code ´
eip (Instruction Pointer) adresse relative de la prochaine instruction a effectuer `
cs + eip est l’adresse absolue de la prochaine instruction a effectuer `
Segment de donnees ´
ds (Data Segment) adresse de debut du segment de donn ées ´
Pile
ss (Stack Segment) adresse de la base de la pile esp (Stack Pointer) adresse relative du sommet de pile
ss + esp est l’adresse absolue du sommet de pile
ebp (Base Pointer) registre utilise pour le calcul d’adresses de variables locales et de parametres
Segmentation de la memoire ´
stack segment ss → base pointer ebp → parametres de fonctions `
pile et variables locales
stack pointer esp →
espace non alloue´
objets alloues´
tas dynamiquement
variables gobales
donnees ét constantes
data segment ds →
instr. pointer eip → code instructions
code segment cs →
Flags
Les flags sont des variables booleennes (stock ées sur un bit) qui ´ donnent des informations sur le deroulement d’une op ération et sur l’etat du processeur. ´
32 flags sont definis, ils sont stock és dans le registre éflags,
appele registre d’ état. ´
Valeur de quelques flags apres une op ` eration : ´
CF : Carry Flag.
Indique une retenue (CF=1) sur les entiers non signes. ´
PF : Parity Flag.
Indique que le resultat est pair ( ´ PF=1) ou impair (PF=0).
ZF : Zero Flag.
Indique si le resultat est nul ( ´ ZF=1) ou non nul (ZF=0).
SF : Sign Flag.
Indique si le resultat est positif ( ´ SF=0) ou negatif ( ´ SF=1).
OF : Overflow Flag.
Indique un debordement ( ´ OF=1) sur les entiers signes. ´
Langage machine
Une instruction de langage machine correspond a une instruction ` possible du processeur.
Elle contient :
un code correspondant a op ` eration ´ a r ` ealiser, les arguments de l’opération : valeurs directes, num éros de registres, adresses memoire. code op operandes ´
Langage machine
lisible
Si on ouvre un fichier executable avec un éditeur (hexad écimal), on ´ obtient
...
01ebe814063727473747566662e6305f5f43544f525f4c
5f05f5f44544f525f4c4953545f5f05f5f4a43525f4c49
53545f5f05f5f646f5f676c6f62616c5f64746f72735f6
75780636f6d706c657465642e36353331064746f725f69
...
C’est une suite d’instructions comme 01ebe814, que l’on peut traduire directement de façon plus lisible :
mov eax, ebx
C’est ce qu’on appelle l’assembleur.
L’assembleur est donc une représentation du langage machine.
Il y a autant d’assembleurs que de type de processeurs differents. ´
Langage machine lisible
Si on ouvre un fichier executable avec un éditeur (hexad écimal), on ´ obtient
...
01ebe814063727473747566662e6305f5f43544f525f4c
5f05f5f44544f525f4c4953545f5f05f5f4a43525f4c49
53545f5f05f5f646f5f676c6f62616c5f64746f72735f6
75780636f6d706c657465642e36353331064746f725f69
...
C’est une suite d’instructions comme 01ebe814, que l’on peut traduire directement de façon plus lisible :
mov eax, ebx
C’est ce qu’on appelle l’assembleur.
L’assembleur est donc une représentation du langage machine.
Il y a autant d’assembleurs que de type de processeurs differents. ´
NASM : Netwide Assembler
Langage assembleur pour processeurs 80x86 et x86-64
conçu pour la portabilite et la modularit é´
permet de genérer de nombreux formats ex écutables (Linux, ´
BSD, ELF . . . )
syntaxe intel (instr dest,source) simplifiee´
systeme de macros et pr ` e compilateur ´
NASM : exemple
section .data
const dw 123
section .bss
var resw 1
section .text
global _start
_start:
call main
mov eax, 1
int 0x80
main:
push ebp
mov ebp, esp
mov word [var], const
pop ebp
ret
Sections
Un programme NASM est compose de trois sections : ´
.data
Declaration de constantes (leur valeur ne changera pas durant ´
l’execution)
.bss
Declaration de variables ´
.text
Instructions qui composent le programme
La section data
La section data permet de definir des constantes ´
Elle commence par section .data
Elle est constituee de lignes de la forme ´
etiquette pseudo-instruction valeur
Les pseudo instructions sont les suivantes :
db define byte declare un octet ´
dw define word declare deux octets ´
dd define doubleword declare quatre octets ´
dq define quadword declare huit octets ´
dt define tenbytes declare dix octets ´
Exemples :
const db 1
const dw 123
les variables declar ées en s équence sont dispos ées les unes ´ a c ` otˆ e´
des autres en memoire ´
La section bss
La section bss permet de definir des variables ´
Elle commence par section .bss
Elle est constituee de lignes de la forme ´
etiquette pseudo-instruction nb
Les pseudo instructions sont les suivantes :
resb reserve byte declare un octet ´
resw reserve word declare deux octets ´
resd reserve doubleword declare quatre octets ´
resq reserve quadword declare huit octets ´
rest reserve tenbytes declare dix octets ´
nb represente le nombre d’octets (pour resb) de mots (pour resw) ´
. . . a r ` eserver ´

Exemples :
buffer resb 64 ; reserve 64 octets
wordvar resw 1 ; reserve un mot (deux octets)
realarray resq 10 ; reserve 10 * 8 octets
La section text
La section text contient les instructions correspondant au programme
Elle commence par section .text
Elle est constituee de lignes de la forme ´
[étiquette] nom d instruction [opérandes]
les parties entre crochets sont optionnelles
une etiquette correspond ´ a une adresse (l’adresse dans laquelle est stockee l’instruction) ´
une operande peut étre : ˆ
un registre,
une adresse memoire, ´
une constante
une expression
Acces` a la m ` emoire ´
Si adr est une adresse memoire, alors ´ [adr] represente le contenu de l’adresse adr
C’est comme l’operateur de d éréférencement ´ * du langage C
La taille de l’objet reférenc é peut étre sp ˆ ecifi é si n écessaire byte [adr] un octet
word [adr] deux octets
dword [adr] quatre octets
adr peut etre : ˆ
une constante [123]
une etiquette ´ [var]
un registre [eax]
une expression [2*eax + var + 1]
constantes tt
Instructions
instructions de transfert : registres ↔ memoire ´
Copie : mov
Gestion de la pile : push, pop
instructions de calcul
Arithmetique : ´ add, sub, mul, div
Logique : and, or
Comparaison : cmp
instructions de saut
sauts inconditionnels : jmp
sauts conditionnels : je, jne, jg, jl
appel et retour de procedure : ´ call, ret
appels systeme `
Copie - mov
Syntaxe :
mov destination source
Copie source vers destination
source : un registre, une adresse ou une constante destination : un registre ou une adresse
Les copies registre - registre sont possibles, mais pas les copies
memoire -m émoire ´
Exemples :
mov eax, ebx ; reg reg
mov eax, [var] ; reg mem
mov ebx, 12 ; reg constante
mov [var], eax ; mem reg
mov [var], 1 ; mem constante
Nombre d’octets copies´
Lorsqu’on copie vers un registre ou depuis un registre , c’est la taille du registre qui indique le nombre d’octets copies´ lorsqu’on copie une constante en memoire, il faut pr éciser le ´nombre d’octets a copier, ` a l’aide des mots clefs byte un octet
word deux octets
dword quatre octets
Exemples :
mov eax, ebx ; reg reg
mov eax, [var] ; reg mem
mov ebx, 12 ; reg constante
mov [var], eax ; mem reg
mov word [var], 1 ; mem constante
Empile – push
Syntaxe :
push source
Copie le contenu de source au somme de la pile.
Commence par decr émenter ésp de 4 puis effectue la copie source : adresse, constante ou registre
Exemples
push 1 ; empile la constante 1
push eax ; empile le contenu de eax
push [var] ; empile la valeur se trouvant
; a l’adresse var
Depile – ´ pop
Syntaxe :
pop destination
Copie les 4 octets qui se trouvent au somme de la pile dans destination.
Commence par effectuer la copie puis incremente ésp de 4. destination est une adresse ou un registre
Exemples :
pop eax ; depile dans le registre eax
pop [var] ; depile a l’adresse var
Addition - add
Syntaxe :
add destination source
Effectue destination = destination + source
source : un registre, une adresse ou une constante destination : un registre ou une adresse
modifie eventuellement les flags overflow ( ´ OF) et carry (CF)
Les opérations registre - registre sont possibles, mais pas les ´ opérations m émoire -m émoire ´
Exemples :
add eax, ebx ; reg reg
add eax, [var] ; reg mem
add eax, 12 ; reg const
add [var], eax ; mem reg
add [var], 1 ; mem const
Soustraction - sub
Syntaxe :
sub destination source
Effectue destination = destination – source source : un registre, une adresse ou une constante destination : un registre ou une adresse modifie eventuellement les flags overflow ( ´ OF) et carry (CF)
Les opérations registre - registre sont possibles, mais pas les opérations m émoire -m émoire ´
Exemples :
sub eax, ebx ; reg reg
sub eax, [var] ; reg mem
sub eax, 12 ; reg const
sub [var], eax ; mem reg
sub [var], 1 ; mem const
Multliplication – mul
Syntaxe :
mul source
Effectue : eax = eax * source
La multiplication de deux entiers codes sur 32 bits peut necessiter 64 bits. ´
les quatre octets de poids de plus faible sont mis dans eax et les quatre octets de poids le plus fort dans edx (edx :eax).
source : adresse, constante ou registre
Exemples :
mul ebx ; eax = eax * ebx
mul [var] ; eax = eax * var
mul 12 ; eax = eax * 12
Division – div
Syntaxe :
div source
Effectue la division entiere : ` edx:eax / source
Le quotient est mis dans eax
Le reste est mis dans edx source : adresse, constante ou registre
Opérations logiques and destination source or destination source
xor destination source not destination
Effectue les opérations logiques correspondantes bit ´ a bit `
Le resultat se trouve dans ´ destination
operandes : source peut etre : une adresse, un registre ou une constante destination peut etre : une adresse ou un registre ˆ
Comparaisons – cmp
Syntaxe :
cmp destination, source
Effectue l’opération ´ destination - source
le resultat n’est pas stock é´ destination : registre ou adresse source : constante, registre ou adresse les valeurs des flags ZF (zero flag), SF (sign flag) et PF (parity flag) sont affectes´
si destination = source, ZF vaut 1
si destination > source, SF vaut 1,
Saut inconditionnel – jmp
Syntaxe :
jmp adr
va a l’adresse ` adr
Saut conditionnel – je
Syntaxe :
je adr
je veut dire jump equal
Si ZF vaut 1 va a l’adresse ` adr
Autres sauts conditionnels – jne, jg, jl
Instruction Description Flags testes´
jne jump not equal ZF
jg jump greater OF, SF, ZF
jl jump less OF, SF
Appel de procedure - ´ call
Syntaxe :
call adr
empile eip (instruction pointer)
va a l’adresse ` adr utilise dans les appel de proc édure : va ´ a l’adresse o ` u se trouve les instructions de la procedure et sauvegarde la prochaine ´ instruction a effectuer au retour de l’appel. `
Retour de procedure - ´ret
Syntaxe :
ret
depile éip utilise en fin de proc édure a utiliser avec ` call
Appels systeme `
Syntaxe :
int 0x80
NASM permet de communiquer avec le système de façon simple ` par la commande int 0x80.
La fonction realisée est d éterminée par la valeur de éax eax Name ebx ecx edx
1 sys exit int
3 sys read unsigned int char * size t
4 sys write unsigned int const char * size t
Compilation directe
L’assembleur est une version “lisible” du langage machine, mais on pourrait en ecrire directement. ´
add $t7, $t3, $sp
Le registre $t0 est en fait le numero 8, et ´ $sp le numero 29. ´
Le code de l’opération est ici coup é en deux : le premier (0) indique c’est une opération arithmétique, le deuxiéme de quelle opération arithmétique pr écis ément. ´
op1 $t7 $t3 $sp (inutilisé) op2
000000 01111 01011 11101 00000 010100
Soit, en hexadécimal, ´ 01ebe814.
On pourrait donc compiler directement un exécutable MIPS. ´
Compilation directe
L’assembleur est une version “lisible” du langage machine, mais on pourrait en ecrire directement. ´
add $t7, $t3, $sp
Le registre $t0 est en fait le numero 8, et ´ $sp le numero 29. ´
Le code de l’opération est ici coup é en deux : le premier (0) indique c’est une opération arithmétique, le deuxième de quelle opération arithmétique précisément. ´
op1 $t7 $t3 $sp (inutilisé) op2
000000 01111 01011 11101 00000 010100
Soit, en hexadécimal, ´01ebe814.
On pourrait donc compiler directement un exécutable MIPS. ´