Unité A7 : La pile. Unité A7 : La pile

Documents pareils
Programmation assembleur : aperçu

Logiciel de base. Première année ENSIMAG

Architecture des ordinateurs

Structure d un programme

Architecture des ordinateurs : Programmation des processeurs avec l'environnement «y86» (INF155)

Architecture des ordinateurs

4. Initiation à l'assembleur

Assembleur. Faculté I&C, André Maurer, Claude Petitpierre

Assembleur i8086. Philippe Preux IUT Informatique du Littoral. Année universitaire 95 96

Département informatique de l université d Angers

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Déprotection semi-automatique de binaire

Rappels d architecture

Compilation (INF 564)

Résumé Génération de code Le code intermédiaire

Rappels Entrées -Sorties

DU BINAIRE AU MICROPROCESSEUR - D ANGELIS CIRCUITS CONFIGURABLES NOTION DE PROGRAMMATION

Réalisation d un OS 32 bits pour PC(x86)

Introduction au langage C


GlobalScape Secure FTP Server Buffer Overflow

SSTIC Désobfuscation automatique de binaires. Alexandre Gazet. Yoann Guillot. Et autres idyles bucoliques...

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Désobfuscation automatique de binaire - The Barbarian Sublimation

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Le langage C. Séance n 4

Partie 7 : Gestion de la mémoire

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Java Licence Professionnelle CISII,

Conception de circuits numériques et architecture des ordinateurs

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Programmation en langage C

Jeu d instructions NIOS II

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Exécution des instructions machine

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

Playing with ptrace() for fun and profit

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

1 Architecture du cœur ARM Cortex M3. Le cœur ARM Cortex M3 sera présenté en classe à partir des éléments suivants :

Programmation Classique en langage C

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Comprendre telock 0.98 et private versions.

Atelier C TIA Portal CTIA04 : Programmation des automates S7-300 Opérations numériques

Les failles Format String

Les techniques de protection du logiciel

Cours d Algorithmique et de Langage C v 3.0

Initiation à la sécurité

3. Structure des ordinateurs. 3.1 L' Unité Centrale (UC) ou processeur (Central Processing Unit CPU)

Le langage C. Introduction, guide de reference

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Traduction binaire dynamique de l extension SIMD Néon de l ARMv7 dans Qemu

Architecture des ordinateurs. Loïc Cuvillon. 20 novembre 2013

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

CM2 L architecture MIPS32

Programmation impérative

AVERTISSEMENT. D'autre part, toute contrefaçon, plagiat, reproduction encourt une poursuite pénale. LIENS

Algorithmique et Programmation, IMA

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

AMICUS 18 (2ème partie) 4) Présentation du logiciel Amicus IDE

INF 321 : mémento de la syntaxe de Java

Introduction...6. Assembleur, philosophieet atouts...8. Avantages et inconvénients de l assembleur...9. Que programmer en Assembleur?.

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Triton : Framework d exécution concolique et d analyses en runtime

Licence Sciences et Technologies Examen janvier 2010

Introduction à l algorithmique et à la programmation M1102 CM n 3

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Notions fondamentales du langage C# Version 1.0

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Bases de programmation. Cours 5. Structurer les données

UE Programmation Impérative Licence 2ème Année

STAGE IREM 0- Premiers pas en Python

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Cours Informatique Master STEP

TP 1. Prise en main du langage Python

Le Projet BINSEC. Automatiser l analyse de sécurité au niveau binaire. Airbus group, CEA, IRISA, LORIA, Uni. Joseph Fourier. p.

Ordinateurs, Structure et Applications

Claude Delannoy. 3 e édition C++

Les structures. Chapitre 3

SUPPORT DE COURS. Langage C

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Concept de machine virtuelle

Structure fonctionnelle d un SGBD

Algorithmique, Structures de données et langage C

Présentation du langage et premières fonctions

Gestion mémoire et Représentation intermédiaire

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

La programmation des PIC en C. Les fonctions, les interruptions.

Initiation à la programmation en Python

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Plan du cours. Historique du langage Nouveautés de Java 7

Langage Java. Classe de première SI

Les vulnérabilités du noyau. LECORNET Olivier LEGROS Bruno VIGIER Nicolas Promo 2005

Principe de fonctionnement des périphériques des ordinateurs en vue de la programmation. Patrick Cégielski

Architecture des ordinateurs Introduction à l informatique

Programmation C. Apprendre à développer des programmes simples dans le langage C

Transcription:

Objectifs À la fin de cette unité vous saurez comment la pile est utilisée pour passer les paramètres aux sous-programmes, effectuer l'allocation dynamique des variables locales de ces sous-programmes et implanter la récursivité. Pour y arriver, vous devrez atteindre les objectifs suivants : - Comprendre le fonctionnement des instructions push et pop. - Décrire les différents modes de passage des paramètres - Décrire un bloc de pile - Décrire le fonctionnement d'un programme récursif. Pierre Marchand, 21 234 1.1 Empilement et dépilement La plupart des microprocesseurs CISC utilisent abondamment la pile, surtout pour le passage des paramètres aux sous-programmes. Le Pentium ne fait pas exception. Il dispose de deux instructions pour empiler et dépiler les données : L'instruction push décrémente le pointeur de pile ESP de la taille de l opérande, puis écrit l opérande en mémoire à l adresse contenue dans ESP. C'est l'empilement. L'instruction pop lit l opérande à l adresse ESP puis incrémente ESP de la taille de l opérande. C'est le dépilement. Pierre Marchand, 21 235 1

1.1 Empilement et dépilement La syntaxe de l instruction push est la suivante : push push push push push reg16 reg32 mem16 mem32 immed Pierre Marchand, 21 236 1.1 Empilement et dépilement En mode 32 bits, l'instruction push immed a l'effet suivant : Mémoire Mémoire ESP push a ESP 61 Pierre Marchand, 21 237 2

1.1 Empilement et dépilement Le pointeur de pile doit toujours être pair, de sorte qu on doit toujours empiler un registre de 16 bits ou un registre de 32 bits. ESP Mémoire mov eax,x1 push eax ESP Mémoire 1 Pierre Marchand, 21 238 1.1 Empilement et dépilement Il en va de même pour les opérandes mémoire. Ainsi, si x est une donnée de 8 bits, on fera : Mémoire movsx ax, byte ptr x push ax Mémoire ESP ESP 3 Pierre Marchand, 21 239 3

1.1 Empilement et dépilement L'instruction pop a l'effet contraire : ESP Mémoire 78 56 34 12 pop bx bx = x5678 ESP Mémoire 78 56 34 12 pop tient compte de la taille de la destination, mais dépile toujours un nombre pair d octets. pop bl serait illégal. Pierre Marchand, 21 24 1.1 Empilement et dépilement Les instructions pusha et pushad empilent les huit registres généraux dans l ordre A,C,D,B,SP,BP,SI,DI. pusha empile toujours les registres de 16 bits donc 16 octets. pushad empile les registres de 32 bits, donc 32 octets. Les instructions popa et popad restaurent les registre à partir de la pile dans l ordre DI, SI, BP, SP, B, D, C, A. Les instructions pushf et pushfd empilent respectivment le registre FLAGS ou le registre EFLAGS. Les instructions popf et popfd dépilent respectivement le registre FLAGS ou le registre EFLAGS. Pierre Marchand, 21 241 4

1.2 Sous-programmes L'architecture Intel dispose d'instructions pour l'appel de sousprogrammes et pour le retour de sous-programmes. L'instruction call pousse l adresse de l instruction suivante sur la pile et saute à l adresse spécifiée par l opérande. Sa syntaxe est la suivante : call etiquette call eax call dword ptr [ebx+ecx*4] call table[ecx] Pierre Marchand, 21 242 1.2 Sous-programmes L'instruction ret dépile l adresse de retour au sommet de la pile, la place dans EIP et saute à cette adresse. Sa syntaxe est la suivante : ret ret n ; dépile n octets de plus Pierre Marchand, 21 243 5

1.2 Sous-programmes Passage par valeur La valeur numérique du paramètre est passée au sous-programme. Exemple : sqrt (1) Le sous-programme ne peut pas modifier le paramètre en mémoire, car il ne connaît pas son adresse. Les données de 8, 16 et 32 bits (64 bits en virgule flottante) sont passées par valeur. Pierre Marchand, 21 244 1.2 Sous-programmes Passage par référence, par adresse ou par pointeur C est l adresse du paramètre qui est passée au sous-programme. C est le cas pour les structures, les tableaux, les chaînes. Le sous-programme connaît l adresse mémoire du paramètre et peut en principe le modifier. Par exemple, l instruction C : scanf( %d, &num); lit une information au clavier et l inscrit en mémoire à l adresse de la variable num. Pierre Marchand, 21 245 6

1.2 Sous-programmes Passage par registres On dispose des six registres eax, ebx, ecx, edx, edi et esi pour le passage des paramètres. Cette méthode est la plus rapide puisqu elle minimise les accès à la mémoire. Appel : mov ebx, param1 mov ecx, param2 call sous-programme Le sous-programme se termine simplement par ret. Pierre Marchand, 21 246 1.2 Sous-programmes Passage par registres C est la méthode utilisée par les processeurs RISC. Dans ces processeurs, même l adresse de retour d un sous-programme est placée dans un registre pour éviter l utilisation de la pile (accès mémoire). Avec le Pentium, étant donné le petit nombre de registres disponibles, cette technique n est utilisable que si on n a qu un ou deux paramètres. Pierre Marchand, 21 247 7

1.2 Sous-programmes Passage par la pile Lors d'un passage par la pile, le programme appelant empile d'abord les paramètres. Il exécute ensuite l'instruction call, qui empile l'adresse de retour. Au moment d'entrer dans le sousprogramme, la pile a donc l'allure suivante : Pierre Marchand, 21 248 1.2 Sous-programmes Passage par la pile CALL &retour param2 param1 ESP après CALL ESP avant CALL ESP initial Pierre Marchand, 21 249 8

1.2 Sous-programmes Passage par la pile L'ordre d'empilement des paramètres dépend du langage. Le langage C empile les paramètres dans l ordre inverse de leur déclaration, tandis que la Pascal les empile dans l ordre de leur déclaration. En assembleur, on fait comme on veut. D'autre part, il faut décider lequel, du programme principal ou du sous-programme, aura la responsabilité de restaurer la pile à la fin de ce dernier. Ceci aussi dépend du langage. Dans le cas du C, c est le programme appelant qui a la responsabilité de nettoyer la pile. Pierre Marchand, 21 25 1.2 Sous-programmes Passage par la pile Soit le sous-programme Fonction(a, b, c). Ce sous-programme est appelé comme suit : esp dans push c Fonction &retour esp avant call push b a et après ret push a b call Fonction c add esp, 12 Donc le sous-programme remet la pile inchangée, sauf pour l'adresse de retour qui a été dépilée par l'instruction ret, et c'est le programme principal qui ajuste le pointeur de pile à sa valeur initiale d'avant l'empilement des paramètres. Pierre Marchand, 21 251 9

1.2 Sous-programmes Passage par la pile À l'intérieur du sous-programme, on peut accèder aux paramètres en y référant par leur position relativement à esp. Dans l'exemple ci-dessus, on accède à a, b et c avec les instructions : mov eax, [esp+4] ; eax = a mov ebx, [esp+8] ; eax = b mov ecx, [esp+12] ; ecx = c esp dans Fonction &retour a b c esp avant call et après ret Pierre Marchand, 21 252 1.2 Sous-programmes Valeurs retournées Si la valeur retournée est un type simple char, short, long ou ptr alors cette valeur est placée dans e(ax) par le sous-programme. Un quadword est retourné dans edx:eax. Un float ou un double sont retournés dans le registre de virgule flottante situé au sommet de la pile des registres de virgule flottante. Pierre Marchand, 21 253 1

1.3 Blocs de pile La méthode que nous venons de voir consistant à adresser les paramètres par rapport au pointeur de pile esp manque de flexibilité. En effet, le sous-programme doit habituellement empiler les registres qu'il utilise. On doit donc tenir compte des registres enregistrés pour déterminer l'adresse des paramètres. Si, par la suite, on change le nombre de registres empilés, il faut changer tous les offsets. De plus, on souhaite disposer d une façon élégante de faire de l allocation dynamique pour les variables locales. Pierre Marchand, 21 254 1.3 Blocs de pile Pierre Marchand, 21 255 On atteint ces objectifs en créant pour le sous-programme un bloc de pile (stack frame). push ; sauvegarde ancien mov,esp ; copie esp dans push registres ; on empile nreg registres sub esp, n ; n octets pour variables locales corps du sous-programme add esp, n ; ou lea esp, dword ptr [-4*nreg] pop registres ; on dépile les registres pop ; on dépile l'ancien ret 11

1.3 Blocs de pile De cette façon, fournit un point fixe par rapport auquel on peut référer aux paramètres. On réfère aux variables locales par rapport au pointeur de pile esp ou par rapport à après mov, esp n octets pour variables locales registres &retour param2 esp après sub esp,n esp après push registres esp après push esp après call esp avant call param1 esp initial Pierre Marchand, 21 256 1.3 Blocs de pile Accès aux paramètres mov ebx,[+8] ; charge param2 mov cx,[+12] ; charge param1 Stockage dans une variable locale mov mov dword ptr [esp], eax word ptr [esp+4], ax ou encore : mov dword ptr [ - 24] esp n octets pour variables locales registres &retour param2 param1 Pierre Marchand, 21 257 12

1.3 Blocs de pile Accès aux paramètres Notre assembleur permet d appeler les paramètres par leur nom. Ainsi, dans l exemple ci-contre, soit la déclaration de fonction suivante, on peut référer à a et à x comme suit : mafonction proc x:dword, longueur: WORD mov cx, a mov esi, x esp n octets pour variables locales registres &retour x a Pierre Marchand, 21 258 1.3 Blocs de pile Accès aux variables locales Dans le fragment de code suivant, on déclare deux variables locales i et j. La figure indique où elles sont placées et le code indique comment on y accède : sousprogramme proc i LOCAL i: WORD j LOCAL j: DWORD mov word ptr [-6], 3 ; i = 3 mov dword ptr [-4], 4 ; j = 4... sousprogramme endp &ret esp Pierre Marchand, 21 259 13

1.3 Blocs de pile Accès aux variables locales On peut référer à i et j par rapport à esp au lieu de : sousprogramme proc LOCAL i: WORD LOCAL j: DWORD mov word ptr [esp], 3 ; i = 3 mov dword ptr [esp+2], 4 ; j = 4... sousprogramme endp i j &ret esp Pierre Marchand, 21 26 1.3 Blocs de pile Accès aux variables locales On peut référer à i et j par nom. L assembleur effectue la traduction par rapport à ou esp. sousprogramme proc LOCAL i: WORD i LOCAL j: DWORD j mov i, 3 ; i = 3 mov j, 4 ; j = 4 &ret... sousprogramme endp esp Pierre Marchand, 21 261 14

1.3 Blocs de pile Il n est pas toujours nécessaire de créer un bloc de pile. On le fait seulement quand on a besoin de variables locales. On doit généralement empiler tous les registres que le sousprogramme utilise sauf eax. On n a généralement pas besoin d empiler EFLAGS. Ce n est que dans les sous-programmes d interruption qu on doit le faire. Pierre Marchand, 21 262 1.3 Récursivité Un programme récursif est un programme qui s appelle luimême. Un exemple simple est celui de la fonction factorielle, même si ce n est pas une façon très efficace d évaluer cette fonction: unsigned long factorial(unsigned long n) { if (n == 1) return (1); else return (n * factorial(n - 1)); } Pierre Marchand, 21 263 15

1.4 Récursivité factorial proc n:dword mov eax, n ; n = [esp + 4] cmp eax, 1 ; if (n == 1) jne suite mov eax, 1 ; return 1 jmp fin suite: dec eax push eax ; factorial (n - 1) call factorial add esp, 4 ; nettoyer la pile mov ebx, n imul eax, ebx ; n * factorial (n - 1) dans eax fin: ret factorial endp Pierre Marchand, 21 264 1.4 Récursivité Allure de la pile pendant l exécution factorial (n-2) factorial (n-1) factorial (n) &ret n-2 &ret n-1 &ret n esp Pierre Marchand, 21 265 16