Exercices : codage des procédures et fonctions. 1 Appel de fonction ou procédure en ARM

Documents pareils
Rappels d architecture


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

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Compilation (INF 564)

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

Algorithmique et Programmation, IMA

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

Initiation à l algorithmique

Cours d Algorithmique et de Langage C v 3.0

Représentation d un entier en base b

Structure d un programme

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Algorithmique et programmation : les bases (VBA) Corrigé

Le langage C. Séance n 4

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

Conception de circuits numériques et architecture des ordinateurs

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

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

UE C avancé cours 1: introduction et révisions

Cours Informatique Master STEP

Conventions d écriture et outils de mise au point

Architecture des ordinateurs

Gestion mémoire et Représentation intermédiaire

TP 1. Prise en main du langage Python

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

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

Licence Sciences et Technologies Examen janvier 2010

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

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

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

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)

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Architecture des ordinateurs

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

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

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

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

Les chaînes de caractères

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

Algorithmique I. Algorithmique I p.1/??

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Algorithme. Table des matières

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

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

Programmation en langage C

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

OS Réseaux et Programmation Système - C5

Algorithmique, Structures de données et langage C

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

Cours 1 : La compilation

Traduction des Langages : Le Compilateur Micro Java

ASR1 TD7 : Un microprocesseur RISC 16 bits

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

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

STAGE IREM 0- Premiers pas en Python

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

Propagation sur réseau statique et dynamique

Microprocesseur + Logiciel

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

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

Les arbres binaires de recherche

Rappels Entrées -Sorties

TP : Gestion d une image au format PGM

Informatique Générale

Programmation assembleur : aperçu

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

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

Concept de machine virtuelle

Algorithmes récursifs

Programmation impérative

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

CORRECTION EXERCICES ALGORITHME 1

Jeu d instructions NIOS II

La mémoire. Un ordinateur. L'octet. Le bit

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

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

Approche Contract First

Premiers Pas en Programmation Objet : les Classes et les Objets

Solutions du chapitre 4

Exercices INF5171 : série #3 (Automne 2012)

Chapitre VI- La validation de la composition.

4. Les structures de données statiques

C f tracée ci- contre est la représentation graphique d une

Feuille TD n 1 Exercices d algorithmique éléments de correction

Projet Active Object

TP1 : Initiation à Java et Eclipse

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

I. Introduction aux fonctions : les fonctions standards

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

Logiciel de Base. I. Représentation des nombres

Cours TD TP EC UE EC UE CC Mixte Introduction aux sciences de. 3 Environnement. 4 l'administration et de. Anglais 28 2

Introduction au langage C

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

Transcription:

UGA - UFR IM 2 AG - MASTER 2 CCI Exercices : codage des procédures et fonctions 1 Appel de fonction ou procédure en ARM L instruction permettant l appel de fonction ou de procédure est nommée bl. Son effet est de sauvegarder l adresse de l instruction qui suit l instruction bl... (on parle de l adresse de retour) dans le registre r14 aussi nommé lr (Link Register) avant de réaliser le branchement à la fonction ou procédure. Le retour se fait alors par l instruction mov pc, lr. Le schéma standard d un programme P appelant une fonction ou procédure Q peut s écrire : P:... Q:... bl Q......... mov pc, lr 2 Codage d une fonction avec paramètres passés par les registres On considère une fonction qui retourne un code pour un caractère donné. fonction code (c: caractère, n: entier naturel) --> caractère { code(c, n) est le caractère obtenu par une translation de n caractères à partir de c en considérant l ordre alphabétique usuel. Par exemple code( a, 3) est le caractère d. préconditions : c est une lettre minuscule, 0 <= n <= 26 } Les caractères sont représentés par un entier (type int en C) qui est la valeur de leur code ascii. On donne ci-dessous un algorithme et un programme en C pour la fonction code. code (ascii_c, n) : retour : si ascii_c + n <= 122 alors acsii_c + n sinon acsii_c + n - 26 int code (unsigned int ascii_c, unsigned int n) { int res; if (ascii_c + n <= 122) res = ascii_c + n; else res = ascii_c + n - 26; return res; } 1

Exercice 2.1 : On convient que le code ascii du caractère c est dans le registre r0, que l entier n est dans le registre r1 et que le résultat de la fonction est dans le registre r2. Traduire en langage d assemblage ARM la fonction code. On considère le programme suivant : cc1 : entier; rr1 : entier; Lire (cc1); rr1 = code (cc1, 3); Ecrire (rr1); Exercice 2.2 : On donne ci-dessous un squelette de traduction en langage d assemblage ARM de ce programme, avec en particulier les parties de code correspondants à Lire(cc1) et Ecrire(rr1). Compléter le programme en langage d assemblage ARM. On précise les spécifications suivantes : la procédure LireCar lit un caractère dans le mot mémoire dont l adresse est donnée en paramètre, dans le registre r1. la procédure Ecrcar prend en paramètre d entrée le caractère à écrire, dans le registre r1..data cc1:.byte 0 rr1:.byte 0.text main: @ Lire(cc1) ldr r1, ptr_cc1 bl Lircar @ l entier lu est dans la zone data à l adresse cc1 @... appel de code (cc1, 3)... @ A COMPLETER @ on range le resultat dans rr1 @ A COMPLETER @ Ecrire(rr1) : l entier à écrire doit être dans r1 ldr r0, ptr_rr1 ldr r1, [r0] bl EcrCar... ptr_cc1:.word cc1 ptr_rr1:.word rr1 2

3 Un autre exemple : factorielle 3.1 Utilisation d une fonction de calcul du produit de deux entiers On considère le programme suivant qui calcule la factorielle d un entier en utilisant un algorithme itératif. res, x, n : entiers @ n est l entier dont on veut calculer la factorielle Lire (n) res = 1 x = n tantque x!= 1 res = res * x x = x - 1 Ecrire (res) Exercice 3.1 : donner une traduction de ce programme en langage d assemblage ARM. Les variables res, x et n seront rangées respectivement dans les registres : r5, r6, r7 (voir le squelette de programme ci-dessous). On utilise une fonction mul qui calcule le produit de deux entiers dont la spécification est la suivante : @ fonction mul (a,b : entiers) --> un entier @ calcule le produit des deux entiers donnés a et b @ paramètres données : a<-->r0 b<-->r1 @ résultat dans r2.data n:.skip 4 res:.skip 4.text main: @ Lire(n) ldr r1, ptr_n bl Lire32 @ l entier lu est dans la zone data à l adresse n... @ Ecrire(res), l entier à écrire est dans r1 ldr r0, ptr_res ldr r1, [r0] bl EcrNdecimal32... ptr_n:.word n ptr_res:.word res 3

3.2 Une fonction en appelle une autre On reprend l exercice précédent en définissant une fonction qui calcule la factorielle, cette fonction étant appelée dans le programme principal. fonction fact0 (n : entier) --> entier { int res, x res = 1; x = n tantque (x!= 1) res = res * x; x = x - 1; retour res; } n, f0: entier Lire (n) f0 = fact0 (n) Ecrire (f0); Exercice 3.2.1 : transformer le programme précédent pour donner un code ARM de la fonction fact0 et écrire le programme principal ci-dessus en rangeant les variables n et f0 dans la zone data. On convient des conventions suivantes pour la fonction fact0 : le paramètre n est passé dans le registre r0, le résultat de la fonction est rangé dans le registre r1. Exercice 3.2.2 : imaginez l exécution : le programme appelle la fonction fact0 qui appelle la fonction mul. Quelles sont les adresses que l on trouve successivement dans le registre lr. Conclure... 4 Mécanisme de pile La pile est une zone de la mémoire. Elle est accessible par un registre particulier appelé pointeur de pile (noté sp, pour stack pointer) : le registre sp contient une adresse qui repère un mot de la zone mémoire en question. On veut effectuer les actions suivantes : empiler : on range une information (en général le contenu d un registre) au sommet de la pile. dépiler : on "prend" le mot en sommet de pile pour le ranger par exemple dans un registre. Le tableau ci-dessous décrit les différentes façons de mettre en oeuvre une pile en fonction des conventions possibles pour le sens de progression (vers les adresses croissantes ou décroissantes) et pour le contenu de la case mémoire pointée (vide ou pleine). 4

sens croissant croissant décroissant décroissant pointage 1 er vide dernier plein 1 er vide dernier plein empiler reg M[sp] reg sp sp+1 M[sp] reg sp sp-1 sp sp+1 M[sp] reg sp sp-1 M[sp] reg dépiler reg sp sp-1 reg M[sp] sp sp+1 reg M[sp] reg M[sp] sp sp-1 reg M[sp] sp sp+1 Dans le TD et dans tout le semestre, on travaille avec un type de mise en oeuvre. On choisit celle qui est utilisée dans le compilateur gcc c est-à-dire "décroissant, dernier plein" (Cf. figure 1). Mem 0 0 Mem sommet de pile avant après SP SP max max empiler Figure 1 Mise en oeuvre de la pile. La pile progresse vers les adresses décroissantes, le pointeur de pile repère la dernière information empilée Exercice 4 : utilisation de la pile Supposons que la pile soit comprise entre les adresses 3000 comprise et 30F0 exclue. Le pointeur de pile est initialisé avec l adresse 30F0. Dans cet exercice on empile des informations de taille 1 octet. Questions : 1. Quelle est la valeur de sp quand la pile est pleine? 2. De combien de mots de 32 bits dispose-t-on dans la pile? 3. De combien d octets dispose-t-on dans la pile? 4. Ecrire en ARM les deux instructions permettant d empiler le contenu d un octet du registre r0. Dans la suite du TD on ecrira : empiler r0. 5

5. Ecrire en ARM les deux instructions permettant de depiler le sommet de pile dans le registre r0. Dans la suite du TD on ecrira : depiler r0. 6. Dessiner l état de la mémoire après chacune des étapes du programme suivant : mov r0,# 7; empiler r0; mov r0, # 2; empiler r0; mov r0, # 5; empiler r0; mov r0, # 47; depiler r0; depiler r0; mov r0, # 9; empiler r0 7. Reprendre l exercice si on travaille avec des informations codées sur 4 octets. Comment modifier le code de empiler et depiler? 5 Appel et retours de procédures On travaille avec le programme ci-dessous ; les procédures "A", "B" et "C" sont rangés aux adresses 10, 60 et 80. Remarque : il s agit du programme donné en cours dans lequel on a remplacé les Ai, Bi et Ci par des vraies instructions. 10 A1= mov r0, # 0 60 B1= empiler r0 80 C1= mov r0, # 47 14 A2= empiler r0 68 B2= add r0, r0, # 1 84 bl 60 (B) 1c bl 60 (B) 6c B3= depiler r0 88 C2= empiler r0 20 A3= mov r5, #28 74 mov pc, lr 90 bl si condx 80 (C) 24 bl 80 (C) 94 C3= mov r2, r5 28 A4= depiler r0 98 C4= depiler r0 a0 mov pc, lr Exercice 5 : Le programme C est incorrect. Expliquer pourquoi et le corriger en conséquence. Donner une trace de l exécution du nouveau programme en indiquant après chaque instruction le contenu des registres et de la pile. pc lr sp r0 r2 r5 m[30f0] m[30ec] m[30e8] m[30e4] m[30e0]?? 30f0???????? 10? 30f0 0??????? 14? 30ec 0??? 0??? 6 Gestion des paramètres et des variables dans la pile On reprend la fonction code programmée au paragraphe 2. code (ascii_c, n) : res : entier res <- ascii_c + n si res > 122 alors res <- res - 26 retour: res 6

Exercice 6.1 : On veut gérer le passage des paramètres et les variables locales dans la pile. Dessiner le contenu de la pile lors de l exécution de la fonction puis écrire une traduction de cette fonction en langage ARM. Écrire un programme qui appelle la fonction code. Reprendre les fonctions fact0 et mul du paragraphe 3.2. Exercice 6.2 : On veut gérer le passage des paramètres et les variables locales dans la pile. Dessiner le contenu de la pile lors de l exécution de la fonction fact0 juste avant et juste après l exécution de l instruction res <- res * x. Ecrire une traduction de cette fonction en langage ARM. Écrire un programme qui appelle la fonction fact0. Exercice 6.2 : Reprendre les exemples traités précédemment dans ce TD et effectuer les sauvegardes nécessaires de temporaires dans la pile. 7 Paramètre passé par adresse On transforme la fonction code du paragraphe 2 en procédure avec un paramètre résultat. procedure coder (c : in caractère, n: in entier, cres: out caractère) { après l appel coder(c, n, cres), cres est le caractère c translaté de n positions } Les caractères sont représentés par leur code ascii. On donne ci-dessous un algorithme pour la procédure coder. On donne aussi la version correspondante avec un passage de paramètre par adresse. coder (ascii_c, n, cres) : si ascii_c + n <= 122 alors cres <-- acsii_c + n sinon cres <-- acsii_c + n - 26 procedure coder (données ascii_c, n: entier, adresse cres: entier) { si (ascii_c + n <= 122) alors mem[cres] = ascii_c + n; sinon mem[cres] = ascii_c + n - 26; } Exercice 7.1 : On convient que le paramètre ascii_c est dans le registre r0, que l entier n est dans le registre r1 et que l adresse cres est dans le registre r2. Traduire en langage d assemblage ARM la procédure coder. 7

Exercice 7.2 : On considère le programme suivant : cc, rr: entier Lire (cc) coder (cc, 3, adresse de rr) Ecrire (rr) Traduire ce programme en langage d assemblage ARM. Les variables cc et rr sont dans la zone data. Exercice 7.3 : Reprendre la procédure et le programme précédent en passant les paramètres ascii_c, n et cres dans la pile. 8