Logiciel de Base : examen de première session

Documents pareils
Logiciel de base. Première année ENSIMAG

Architecture des ordinateurs

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

Programmation assembleur : aperçu

Les structures de données. Rajae El Ouazzani

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

Les arbres binaires de recherche

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

Java Licence Professionnelle CISII,

Les techniques de protection du logiciel

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

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Initiation à la sécurité

Structure d un programme

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

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

Conventions d écriture et outils de mise au point

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP


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

TD3: tableaux avancées, première classe et chaînes

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

Introduction au langage C

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

Cours d initiation à la programmation en C++ Johann Cuenin

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)

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

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Traduction des Langages : Le Compilateur Micro Java

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

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Rappels d architecture

Cours de Systèmes d Exploitation

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

Algorithmique, Structures de données et langage C

Premiers Pas en Programmation Objet : les Classes et les Objets

Algorithmique I. Algorithmique I p.1/??

GlobalScape Secure FTP Server Buffer Overflow

Programme Compte bancaire (code)

Compilation (INF 564)

Représentation d un entier en base b

Architecture des ordinateurs

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

Prentice Hall, 2011 (ISBN )

Cours 1 : Qu est-ce que la programmation?

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Programmation en langage C

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

Le prototype de la fonction main()

Logiciel Libre Cours 2 Fondements: Programmation

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Playing with ptrace() for fun and profit

Corrigé des exercices sur les références

Analyse de sécurité de logiciels système par typage statique

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

Licence Sciences et Technologies Examen janvier 2010

ACTIVITÉ DE PROGRAMMATION

1. Structure d'un programme FORTRAN 95

Cours Informatique Master STEP

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Claude Delannoy. 3 e édition C++

Rappels Entrées -Sorties

Algorithmique et Programmation, IMA

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

Programmation système en C/C++

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

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

Programmation impérative

OS Réseaux et Programmation Système - C5

Arbres binaires de recherche

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Programmation C++ (débutant)/instructions for, while et do...while

4. Initiation à l'assembleur

Cours d Algorithmique et de Langage C v 3.0

Génie Logiciel avec Ada. 4 février 2013

Les structures. Chapitre 3

Recherche dans un tableau

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

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

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

Le langage C. Séance n 4

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

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

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Débogage de code* Mardi 13 décembre Romaric DAVID Université de Strasbourg - Direction Informatique Pôle HPC. hpc.unistra.

CM2 L architecture MIPS32

Compression de Données - Algorithme de Huffman Document de Conception

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

STAGE IREM 0- Premiers pas en Python

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

Transcription:

Logiciel de Base : examen de première session ENSIMAG 1A Année scolaire 2009 2010 Ceci n est pas exactement l examen donné en Ensimag 1A en 2010, mais une version adaptée pour la convention de pile utilisée en Ensimag apprentissage 1A en 2010. Consignes générales : Durée : 2h. Tous documents et calculatrices autorisés. Le barème est donné à titre indicatif. Les exercices sont indépendants et peuvent être traités dans le désordre. Merci d indiquer votre numéro de groupe de TD et de rendre votre copie dans le tas correspondant à votre groupe. Consignes relatives à l écriture de code C et assembleur Pentium : Pour chaque question, une partie des points sera affectée à la clarté du code et au respect des consignes ci-dessous. Pour les questions portant sur la traduction d une fonction C en assembleur, on demande d indiquer en commentaire chaque ligne du programme C original avant d écrire les instructions assembleur correspondantes. Pour améliorer la lisibilité du code assembleur, on utilisera systématiquement des constantes (directives.set ou.equ) pour les déplacements relatifs à %ebp (i.e. paramètres des fonctions et variables locales). Par exemple, si une variable locale s appelle var en langage C, on y fera référence avec var(%ebp). Sauf indication contraire dans l énoncé, on demande de traduire le code C en assembleur de façon systématique, sans chercher à faire la moindre optimisation : en particulier, on stockera les variables locales dans la pile (pas dans des registres), comme le fait le compilateur C par défaut. On respectera les conventions de gestions des registres Intel vues en cours, c est à dire : %eax, %ecx et %edx sont des registres scratch ; %ebx, %esi et %edi ne sont pas des registres scratch. 1

Ex. 1 : Exercice préliminaire (6 pts) Il est fortement recommandé de commencer par traiter cet exercice qui porte sur des notions utiles dans la suite de l examen. Soit la fonction C suivante : void echanger(int *a, int *b) { int t = *a; *a = *b; *b = t; Question 1 Traduisez cette fonction en assembleur sans chercher à l optimiser..text // void echanger_asm(int *a, int *b);.globl _echanger_asm _echanger_asm:.set a, 8.set b, 12 enter $4, $0 andl $-16, %esp.set t, -4 // t = *a; movl a(%ebp), %eax movl (%eax), %eax movl %eax, t(%ebp) // *a = *b; movl b(%ebp), %eax movl (%eax), %eax movl a(%ebp), %edx movl %eax, (%edx) // *b = t; movl t(%ebp), %eax movl b(%ebp), %edx movl %eax, (%edx) leave ret On rappelle que l instruction enter $8, $0 est exactement équivalente à la séquence d instructions : pushl %ebp movl %esp, %ebp subl $8, %esp Soit le type de données structuré et la fonction assembleur suivante : 2

1.text 2 /* 3 struct rationnel_t { 4 int n; 5 unsigned d; 6 ; 7 */ 8.set n, 0 9.set d, 4 10 // void afficher_rat_asm(struct rationnel_t q) 11.globl afficher_rat_asm 12 afficher_rat_asm: 13.set q, 8 14 enter $12, $0 15 andl $-16, %esp 16 // 17 cmpl $0, (q + d)(%ebp) 18 jne else 19 // 20 movl $ch_err, 0(%esp) 21 call printf 22 jmp fin 23 else: 24 // 25 movl (q + d)(%ebp), %eax 26 movl %eax, 8(%esp) 27 movl (q + n)(%ebp), %eax 28 movl %eax, 4(%esp) 29 movl $ch_aff, 0(%esp) 30 call printf 31 fin: 32 leave 33 ret 34.data 35 ch_err:.asciz "Erreur!\n" 36 ch_aff:.asciz "q = %d / %u\n" 37 Question 2 Donner le code C correspondant à cette fonction assembleur. Pour vous aider, on a laissé les // dans le code fourni (lignes 15, 18 et 24) qui délimitent la traduction assembleur de chaque ligne de C originale. void afficher_rat(struct rationnel_t q) { if (q.d == 0) { printf("erreur!\n"); else { printf("q = %d / %u\n", q.n, q.d); 3

Soit maintenant la fonction C suivante, qui se base sur le même type de données que précédemment : void afficher_ptr_rat(struct rationnel_t *q) { if (q->d == 0) { printf("erreur!\n"); else { printf("q = %d / %u\n", q->n, q->d); Question 3 Traduire cette fonction en assembleur sans chercher à l optimiser (on demande une traduction littérale du code C donné, vous n avez notamment pas le droit d appeler le code assembleur de la question précédente, mais vous pouvez bien sûr vous en inspirer)..text /* struct rationnel_t { int n; unsigned d; ; */.set n, 0.set d, 4 // void afficher_ptr_rat_asm(struct rationnel_t *q).globl _afficher_ptr_rat_asm _afficher_ptr_rat_asm:.set q, 8 enter $12, $0 andl $-16, %esp // if (q->d == 0) movl q(%ebp), %eax cmpl $0, d(%eax) jne else // printf("erreur!\n"); movl $ch_err, 0(%esp) call printf jmp fin else: // printf("q = %d / %u\n", q->n, q->d); movl q(%ebp), %eax movl d(%eax), %ecx movl %ecx, 8(%esp) movl n(%eax), %ecx movl %ecx, 4(%esp) movl $ch_aff, 0(%esp) call printf fin: leave ret 4

.data ch_err: ch_aff:.asciz "Erreur!\n".asciz "q = %d / %u\n" Ex. 2 : Tableaux et listes chaînées (6 pts) Dans cet exercice, on va travailler sur une fonction void decouper(int tab[], struct cellule_t **liste) qui prend en entrée un tableau d entiers signés et construit en sortie une liste chaînée composée de certains des entiers du tableau initial. Les cellules de la liste chaînée produite en sortie seront du type : struct cellule_t { int val; struct cellule_t *suiv; ; Soit alors une réalisation en assembleur de cette fonction : 1.text 2 /* 3 struct cellule_t { 4 int val; 5 struct cellule_t *suiv; 6 ; 7 */ 8.set val, 0 9.set suiv, 4 10 // void decouper_asm(int tab[], struct cellule_t **liste); 11.globl decouper_asm 12 decouper_asm: 13.set tab, 8 14.set liste, 12 15 enter $(16+4), $0 16 andl $-16, %esp 17.set sent, -8 18.set queue, -12 19.set i, -16 20 // 21 leal sent(%ebp), %eax // equivalent a : movl %ebp, %eax ; addl $sent, %eax 22 movl %eax, queue(%ebp) 23 // 24 movl $0, i(%ebp) 25 for: 26 // 27 movl tab(%ebp), %eax 28 movl i(%ebp), %ecx 29 cmpl $0, (%eax, %ecx, 4) 30 je fin_for 5

31 // 32 movl tab(%ebp), %eax 33 movl i(%ebp), %ecx 34 cmpl $0, (%eax, %ecx, 4) 35 jng else // Jump if Not Greater 36 // 37 movl $8, 0(%esp) 38 call malloc 39 movl queue(%ebp), %edx 40 movl %eax, suiv(%edx) 41 // 42 movl queue(%ebp), %eax 43 movl suiv(%eax), %eax 44 movl %eax, queue(%ebp) 45 // 46 movl tab(%ebp), %eax 47 movl i(%ebp), %ecx 48 movl (%eax, %ecx, 4), %eax 49 movl queue(%ebp), %edx 50 movl %eax, val(%edx) 51 // 52 movl queue(%ebp), %eax 53 movl $0, suiv(%eax) 54 else: 55 // 56 addl $1, i(%ebp) 57 jmp for 58 fin_for: 59 // 60 movl queue(%ebp), %eax 61 movl $0, suiv(%eax) 62 // 63 movl (sent+suiv)(%ebp), %eax 64 movl liste(%ebp), %edx 65 movl %eax, (%edx) 66 leave 67 ret 68 Question 1 Expliquer en 5 lignes maximum ce que fait la fonction decouper_asm. Cette fonction parcours le tableau tab donnée en entrée et construit en sortie la liste chaînée liste composée de tous les entiers strictement positifs présents dans le tableau initial. Les entiers sélectionnés apparaissent dans liste dans le même ordre que dans tab. La fin du tableau initial est indiquée par une case contenant la valeur entière 0. Question 2 Donner le code C équivalent à la fonction decouper_asm. N oubliez pas les déclarations des variables utilisées. void decouper(int tab[], struct cellule_t **liste) { 6

struct cellule_t sent; struct cellule_t *queue = &sent; for (unsigned i = 0; tab[i]!= 0; i++) { if (tab[i] > 0) { queue->suiv = malloc(sizeof(struct cellule_t)); queue = queue->suiv; queue->val = tab[i]; queue->suiv = NULL; queue->suiv = NULL; *liste = sent.suiv; Question 3 Ecrire une implantation assembleur optimisée de la fonction decouper_asm. On cherchera donc à minimiser le nombre d accès mémoire en utilisant au mieux les registres disponibles. Il est utile de chercher à supprimer les accès mémoires ayant lieu dans la boucle : ceux à l extérieur ne seront exécutés qu une fois ce qui ne changera pas grand-chose au temps total d exécution sur un grand tableau. De plus, l appel à malloc dans le corps de la boucle nous empêche de mieux utiliser les registres scratch : si on essayait de stocker par exemple tab[i] dans %edx, il faudrait le sauvegarder dans la pile avant d appeler malloc et le restaurer après, ce qui ne nous ferait rien gagner..text /* struct cellule_t { int val; struct cellule_t *suiv; ; */.set val, 0.set suiv, 4 // void decouper_asm_opt(int tab[], struct cellule_t **liste);.globl decouper_asm_opt decouper_asm_opt:.set tab, 8.set liste, 12 pushl %ebx // registres non-scratch utilises pushl %esi pushl %edi enter $(8+4), $0 andl $-16, %esp.set sent, -20 // tab = %edi, i = %esi, queue = %ebx movl tab(%ebp), %edi // queue = &sent; leal sent(%ebp), %ebx // i = 0 xorl %esi, %esi for: 7

// tab[i]!= 0 cmpl $0, (%edi, %esi, 4) je fin_for // if (tab[i] > 0) jng else // queue->suiv = malloc(sizeof(struct cellule_t)); movl $8, 0(%esp) call malloc movl %eax, suiv(%ebx) // queue = queue->suiv; movl suiv(%ebx), %ebx // queue->val = tab[i]; movl (%edi, %esi, 4), %eax movl %eax, val(%ebx) // queue->suiv = NULL movl $0, suiv(%ebx) else: // i++ addl $1, %esi jmp for fin_for: // queue->suiv = NULL; movl $0, suiv(%ebx) // *liste = sent.suiv; movl (sent+suiv)(%ebp), %eax movl liste(%ebp), %edx movl %eax, (%edx) movl -12(%ebp), %edi movl -8(%ebp), %esi movl -4(%ebp), %ebx leave ret Ex. 3 : Arbres binaires de recherche (8 pts) On va travailler dans cet exercice sur des arbres binaires de recherche (ABR) dont les nœuds contiennent une simple valeur entière (naturelle). On rappelle les principales propriétés de cette structure de données : chaque nœud de l arbre a au plus 2 fils ; le sous-arbre gauche d un nœud N donné ne contient que des nœuds dont la valeur est strictement inférieure à la valeur de N ; le sous-arbre droit d un nœud N donné ne contient que des nœuds dont la valeur est strictement supérieure à la valeur de N ; les sous-arbres gauche et droit d un nœud donné sont aussi des arbres binaires de recherche. Il vient naturellement de ses propriétés que chaque clé est unique (i.e. il n existe pas plusieurs nœuds de même valeur). La figure ci-dessous représente un arbre binaire de recherche typique : 8

En C, on défini simplement le type nœud d un ABR par : struct noeud_t { unsigned val; struct noeud_t *fg; struct noeud_t *fd; ; Question 1 Ecrire en C une fonction récursive int rechercher(unsigned v, struct noeud_t *arbre) qui renvoie faux (i.e. 0) si la valeur v n est pas présente dans l ABR arbre et vrai (i.e. 1) sinon. int rechercher(unsigned v, struct noeud_t *arbre) { if (arbre == NULL) { return 0; else if (v == arbre->val) { return 1; else if (v < arbre->val) { return rechercher(v, arbre->fg); else { return rechercher(v, arbre->fd); Traduire cette fonction de recherche en assembleur sans chercher à l opti- Question 2 miser..text /* struct noeud_t { unsigned val; struct noeud_t *fg; struct noeud_t *fd; ; 9

*/.set val, 0.set fg, 4.set fd, 8 // int rechercher_asm(unsigned v, struct noeud_t *arbre).globl rechercher_asm rechercher_asm:.set v, 8.set arbre, 12 enter $8, $0 andl $-16, %esp // if (arbre == NULL) cmpl $0, arbre(%ebp) jne L0 // return 0; xorl %eax, %eax jmp fin L0: // if (val == arbre->val) movl arbre(%ebp), %eax movl val(%eax), %eax cmpl %eax, v(%ebp) jne L1 // return 1 movl $1, %eax jmp fin L1: // if (val < arbre->val) movl arbre(%ebp), %eax movl val(%eax), %eax cmpl %eax, v(%ebp) jnb L2 // return rechercher_asm(v, arbre->fg); movl arbre(%ebp), %eax movl fg(%eax), %ecx movl %ecx, 4(%esp) movl v(%ebp), %ecx movl %ecx, 0(%esp) call rechercher_asm jmp fin L2: // else // return rechercher_asm(v, arbre->fd); movl arbre(%ebp), %eax movl fd(%eax), %ecx movl %ecx, 4(%esp) movl v(%ebp), %ecx movl %ecx, 0(%esp) call rechercher_asm fin: leave ret 10

Soit la fonction C suivante : void arbre_vers_tab(struct noeud_t *arbre, unsigned *tab[]) { if (arbre!= NULL) { arbre_vers_tab(arbre->fg, tab); **tab = arbre->val; (*tab)++; arbre_vers_tab(arbre->fd, tab); Question 3 Traduire cette fonction en assembleur sans chercher à l optimiser..text /* struct noeud_t { unsigned val; struct noeud_t *fg; struct noeud_t *fd; ; */.set val, 0.set fg, 4.set fd, 8 // void arbre_vers_tab_asm(struct noeud_t *arbre, unsigned *tab[]);.globl arbre_vers_tab_asm arbre_vers_tab_asm:.set arbre, 8.set tab, 12 enter $8, $0 andl $-16, %esp // if (arbre!= NULL) { cmpl $0, arbre(%ebp) je fin // arbre_vers_tab(arbre->fg, tab); movl tab(%ebp), %ecx movl %ecx, 4(%esp) movl arbre(%ebp), %eax movl fg(%eax), %ecx movl %ecx, 0(%esp) call arbre_vers_tab_asm // **tab = arbre->val; movl arbre(%ebp), %eax movl val(%eax), %eax movl tab(%ebp), %edx movl (%edx), %edx movl %eax, (%edx) // (*tab)++; movl tab(%ebp), %eax addl $4, (%eax) // arbre_vers_tab(arbre->fd, tab); movl tab(%ebp), %ecx movl %ecx, 4(%esp) 11

movl arbre(%ebp), %eax movl fd(%eax), %ecx movl %ecx, 0(%esp) call arbre_vers_tab_asm fin: leave ret Question 4 fonction. Décrire en 2 lignes maximum le contenu du tableau tab en sortie de cette Le tableau contient les valeurs des nœuds présents dans l arbre initial, triées par ordre croissant. 12