Tableau à une dimension. Exemple. Utilisation de constantes en assembleur

Documents pareils
Rappels d architecture

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

Microprocesseur + Logiciel

Architecture des Systèmes d Information Architecture des Systèmes d Information

Chap III : Les tableaux

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

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

Représentation d un entier en base b

Structure d un programme

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

IV- Comment fonctionne un ordinateur?

Algorithme. Table des matières

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

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Compilation (INF 564)

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Architecture des ordinateurs

Cours d Algorithmique et de Langage C v 3.0

Conception de circuits numériques et architecture des ordinateurs

CM2 L architecture MIPS32

Informatique Générale

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

Programmation assembleur : aperçu

Architecture des ordinateurs

Rappels Entrées -Sorties

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

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

Représentation des Nombres

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Conventions d écriture et outils de mise au point

Limitations of the Playstation 3 for High Performance Cluster Computing

LES TYPES DE DONNÉES DU LANGAGE PASCAL


Utilisation d objets : String et ArrayList

Adama MBODJI MBODJ.SYSTEM

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

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

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

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

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

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

Plus courts chemins, programmation dynamique

Présentation du cours

TD Architecture des ordinateurs. Jean-Luc Dekeyser

4. Les structures de données statiques

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

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Algorithmique et Programmation, IMA

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

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

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

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Gestion de la mémoire

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

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

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

Introduction à MATLAB R

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

SUPPORT DE COURS. Langage C

La Clé informatique. Formation Excel XP Aide-mémoire

ASR1 TD7 : Un microprocesseur RISC 16 bits

Introduction à la Programmation Parallèle: MPI

Plan du cours Cours théoriques. 29 septembre 2014

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

1 Recherche en table par balayage

TP 1. Prise en main du langage Python

Programmation en langage C

Cours Informatique 1. Monsieur SADOUNI Salheddine

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Choisir le mode d envoi souhaité. Option 1 : Envoyer un SMS à un nombre réduit de numéros (0 10 )

Algorithmique, Structures de données et langage C

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

Définitions. Numéro à préciser. (Durée : )

Logiciel de base. Première année ENSIMAG

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

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

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

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

Les structures. Chapitre 3

Les chaînes de caractères

Travaux Dirigés n 1 : chaînes de caractères

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Corrigé des TD 1 à 5

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

Java Licence Professionnelle CISII,

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

Logiciel de Base. I. Représentation des nombres

TP : Gestion d une image au format PGM

2 Comment fonctionne un ordinateur, dans les grandes lignes

Python - introduction à la programmation et calcul scientifique

Partie 7 : Gestion de la mémoire

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

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

Transcription:

Les tableaux en langage d assemblage Introduction Nous avons vu comment sont gérés les variables possédant des types élémentaires : entier signés ou non, caractères Un tableau!en langage de haut niveau: -Une liste d éléments d un type donné -Un tableau a une taille fixée à sa déclaration -Chaque élément est numéroté, on parle d indice du tableau (les numéros se suivent ) -Ces indices peuvent varier dans différents intervalles: Toujours 0 à NB_ELEMENT 1 en C i à i+nb_element-1 dans d autres langages (comme ADA) Exemple!: N l entier 12 T!: un tableau sur [0.. N-1] d entiers Stockage et accès aux éléments en assembleur!? Tableau à une dimension Stockage d un tableau en mémoire. -Pour faciliter l accès aux éléments, ils seront stockés de façon contigue en mémoire. -Soit TAILLE_ELEMENT la taille d un élément (en octet) et NB_ELEMENT le nombre d éléments du tableau -La quantité de mémoire nécessaire est TAILLE_ELEMENT* NB_ELEMENT (pas toujours vrai, voir plus bas) - Il faut réserver en mémoire TAILLE_ELEMENT* NB_ELEMENT octets (en l initialisant éventuellement) -Si le tableau n est pas initialisé à la déclaration, on peut se servir de la zone bss P. Sicard-Cours ALM 6 Les tableaux en assembleur 1 P. Sicard-Cours ALM 6 Les tableaux en assembleur 2 Exemple NB_ELEMENT l entier 12 Tab un tableau de [0.. NB_ELEMENT-1] d entiers Chaque entier est codé sur 4 octets En langage C!: #define NB_ELEMENT 12 int Tab [NB_ELEMENT]!; En ADA : Tab: array(0..nb_element-1) of INTEGER; En assembleur ARM: Ad_Tab!:.skip 12*4 Pour rendre le programme plus lisible on peut utiliser des constantes en assembleur, on peut ensuite se resservir de ces constantes dans les instructions Utilisation de constantes en assembleur Définition d une constante!: -Avant la zone bss et data -La portée : toute la suite du programme (zone data bss et text) -" Syntaxe.set NOM_CONST, Valeur ou NOM_CONST=Valeur -" Norme usuelle!: constante en majuscule Exemple!:.set NB_ELEMENT, 12.set TAILLE_ELEMENT, 4 Ad_Tab!:.skip TAILLE_ELEMENT* NB_ELEMENT P. Sicard-Cours ALM 6 Les tableaux en assembleur 3 P. Sicard-Cours ALM 6 Les tableaux en assembleur 4

Exemple 2 NB_ELEMENT l entier 4 Tabc un tableau de [7.. 7+NB_ELEMENT-1] de caractères initialisé à { r, i, c, m (Chaque caractère est codé sur 1 octet) En langage C!: #define NB_ELEMENT 4 char Tabc [NB_ELEMENT]= { r, i, c, m!; /* indice forcément de 0 à 3 */ En ADA : Tabc: array(7.. 7+ NB_ELEMENT-1) of CHARACTER= ( r, i, c, m ) En assembleur ARM:.set NB_ELEMENT, 4.set TAILLE_ELEMENT, 1 @ peut servir dans le programme.data Ad_Tabc!:.byte r.byte i.byte c.byte m P. Sicard-Cours ALM 6 Les tableaux en assembleur 5 0 1 Mémoire d'octets Ad_Tabc 72 69 63 6D Ad_Tab Premier entier (non initialisé) Codes Ascii des caractères (en hexa) 12*4= 48 octets P. Sicard-Cours ALM 6 Les tableaux en assembleur 6 Accès aux éléments d un tableau Nom du tableau et valeur (ou variable) servant d indice ; En C: T[i], en ADA: T(i) Il faut calculer l adresse de cet élément en mémoire Indice de 0 à NB_ELEMENT -1 : -Adresse de T[i]= Ad_T + i*taille_element Indice de 1 à TAILLE : -Adresse de T[i]= ad_t + (i-1)*taille_element Indice de n à m avec n > 1 : 0 1 Ad_Tab Mémoire d'octets Elément 1 Elément 2 Elément 3 Elément j Dernier élément Indices n n+1 n+j-1 m Adresses T(i) Ad_Tab Ad_Tab + Taille_El Ad_Tab + (j-1)*taille_el avec j= indice-n+1 Ad_Tab + (indice-n)*taille_el Ad_Tab + (m-n)*taille_el -NB_ELEMENT = (m-n) +1 -Adresse de T[i]= ad_t + (i-n)*taille_element P. Sicard-Cours ALM 6 Les tableaux en assembleur 7 P. Sicard-Cours ALM 6 Les tableaux en assembleur 8

En ARM Soit N l entier 10, Soit un T un tableau sur [0..N-1] d entiers sur 4 octets.set N, 10.set TAILLE_ELT, 4 Ad_T :.skip N*TAILLE_ELT Comment traduire T[3]= 5 en ARM?.text ldr r1, Relais_T @ r 1 c o n t i e n t l a d r e s s e correspondant à l étiquette T (début du tableau) add r1, r1,#3*taille_elt @r1 contient l adresse de T[3], attention valeur immédiate max 255 mov r2, #5 str r2, [r1] Relais_T :.word Ad_T Remarque : on peut aussi écrire : ldr r1,=ad_t et remplacer le relais OPTIMISATION Particularité du jeu d instruction du processeur ARM Très répandue pour optimiser les accès aux tableaux Mode adressage pre-indéxé pour str et ldr : str r2, [r1, #3*TAILLE_ELEMENT] @Mem[r1, #3*TAILLE_ELEMENT ]= r2; T(3)=r2 Attention r1 n est pas modifié La valeur immédiate est sur 12 bits max On peut en cas de besoin aussi faire str r2, [r1, r3] On gagne une instruction P. Sicard-Cours ALM 6 Les tableaux en assembleur 9 P. Sicard-Cours ALM 6 Les tableaux en assembleur 10 Soit l algorithme!: Parcours d un tableau N!: l entier 12 T!:un tableau sur [0..N-1] d entiers sur 4 octets i parcourant 0..N-1!:T [i]!i On traduit le parcourant en tant que!: i!0!; Tant que i < N faire début T[i]!i!; i!i+1!; fin Parcours en ARM.set N, 12 Ad_T!:.skip N*4.text mov r1,#0 " " @i supposé dans r1, initialisé à 0 tantque!: cmp r1,#n beq fintq ldr r0, =Ad_T add r2, r0, r1, LSL#2 @r2= Ad_T+4*i= adresse de T[i] str r1, [r2]" " @ T[i]=i! add r1, r1, #1" " @i=i+1 bal tantque fintq :.ltorg Remarque!: On oublie ici les chargement/stockage de i. P. Sicard-Cours ALM 6 Les tableaux en assembleur 11 P. Sicard-Cours ALM 6 Les tableaux en assembleur 12

Optimisation 1 d un parcours de tableau On évite le chargement de l adresse à chaque tour de boucle Algorithme!: T vu comme un tableau d octet MEM I!0!;Ad!Ad_T!; Tant que i < N faire MEM[Ad]!i!; i!i+1!;ad!ad+4!; En ARM:.set TAILLE_ELT mov r1,#0 " " @i dans r1 initialisé à 0 ldr r0, =Ad_T" " @r0 (Ad) contient l adresse de T tantque!: cmp r1,#n beq fintq str r1, [r0]" " @ T[i]=i add r0,r0,#taille_elt" " @Ad=Ad+4 add r1, r1, #1" @i=i+1 bal tantque.ltorg P. Sicard-Cours ALM 6 Les tableaux en assembleur 13 Mode d adressage de l instruction str particulier : Adressage post-incrémenté: - str regj, [regi], #valeur-immediate Exemple: str r1, [r0], #TAILLE_ELT! @ additionne TAILLE_ELT à r0 après le stockage en mémoire équivalent à str r1,[r0] add r0, r0, #TAILLE_ELT Optimisation 2 P. Sicard-Cours ALM 6 Les tableaux en assembleur 14 Structure Exemple: nom_struct!: le type < champ1!: un entier, champ2!: un caractère, champ3!: un entier> Nomvar!: un nom_struct En C!:" struct nom_struct " { int champ1!; char champ2!; int champ3!; " " struct nom_struct nom_var!; Ad_var:.skip 9 Structure en assembleur Accès aux champ1 (par des ldrb/strb) à l adresse de la variable nom_var: Ad_var Accès aux champ2 à l adresse Ad_var + 4 Accès aux champ3 à l adresse Ad_var + 5 Problème de l alignement : Ad_var et Ad_var +5 ne peuvent pas être multiples de 4 si les champs sont stockés de façon contiguë en mémoire Ad_var Ad_var+4 Ad_var+5 Champ1 Champ2 Champ3 Architecture et principes 01 P. Sicard-Cours Réseaux 1 15 P. Sicard-Cours ALM 6 Les tableaux en assembleur 16

Problème d alignement dans une structure Solutions au problème d alignement -Changer l ordre de stockage en mémoire des différents champs -Laisser des trous pour garder le bon alignement du champ suivant Ad_var Champ1 Ad_var+4 Champ2 Trou inutilisé Ad_var+8 Champ3 Directive d alignement d adresse.balign x l étiquette (ou la réservation) suivante a une adresse mulitple de x. (.align x adresse suivante multiple de 2 x ) Exemple: Ad_var!:.skip 5.balign 4.skip 4 Il y a un trou de 3 octets On peut aussi faire: Ad_var:.skip 12 Il faudra se rappeler dans le programme de l organisation de la structure en mémoire P. Sicard-Cours ALM 6 Les tableaux en assembleur 17 P. Sicard-Cours ALM 6 Les tableaux en assembleur 18 Accès aux champs d une structure On définit les déplacements (par rapport à l adresse de la variable) pour accéder à chaque champ (Sans oublier les trous éventuels) On additionne le bon déplacement à l adresse avant le chargement/stockage de la variable Exemple : nom_var.champ2= a ;.set DELTA_CHAMP1, 0.set DELTA_CHAMP2, 4 @déplacement pour accéder au champ2.set DELTA_CHAMP3, 8 ldr r1, =nom_var mov r2, a @ou #0x65 add r1,r1,# DELTA_CHAMP2 @r1 contient l adresse du champ1 str r2,[r1] On peut aussi utiliser le mode d adressage pré-indexé du ARM : str r2, [r1,#delta_champ2] Tableau de structure Pour les tableaux, entre les éléments structures le problème de l alignement peut se poser aussi Exemple struct nom_struct { int champ1 ; char champ2 ; struct nom_struct nom_var ; struct nom_struct tab[taille] ; Il faudra laisser un trou de 3 octets entre chaque élément du tableau.set TAILLE, 4.set TAILLE_ELT, 8 @ 5 +3 pour faire un multiple de 4 Ad_Tab :.skip TAILLE*TAILLE_ELT P. Sicard-Cours ALM 6 Les tableaux en assembleur 19 P. Sicard-Cours ALM 6 Les tableaux en assembleur 20

Accès au champ d une structure élément d un tableau Il faut calculer l adresse de l élément puis ajouter le déplacement du champ voulu Exemple: tab[3].champ2= a.set TAILLE, 4.set TAILLE_ELT, 8 @ 5 +3 pour faire un multiple de 4.set DELTA_CHAMP1, 0.set DELTA_CHAMP2, 4 @ déplacements pour l accès au champs Ad_Tab :.skip TAILLE*TAILLE_ELT Tableaux à 2 dimensions Exemple un tableau T sur [0..M-1]*[0..N-1] d éléments de taille TAILLE_ELT On peut le voir comme une matrice Il faut ranger les éléments de ce tableau en mémoire (tableau à une dimension) N-1 mov r1,#3 @indice 3 dans r1 ldr r0, =Ad_Tab @r0 contient l adresse de T mov r2, a add r0, r0, r1, LSL#3 @r0 = Ad_Tab+ 8*3 = adresse de T[3] str r2, [r0,#delta_champ2] T[2, 1] 0 0 M-1 P. Sicard-Cours ALM 6 Les tableaux en assembleur 21 P. Sicard-Cours ALM 6 Les tableaux en assembleur 22 Deux façons «simples» : -Soit par «lignes» (on fait d abord évoluer i) -Soit par colonnes (on fait d abord évoluer j) (voir figure) Calcul de l indice en mémoire (déplacement par rapport à l adresse de début du tableau) à partir des deux indices dans la matrice Taille nécessaire en mémoire identique : TAILLE_ELT*M*N.set N, 12.set M, 8.set TAILLE_ELT, 4 Tableaux à 2 dimensions Ad_T!:.skip TAILLE_ELT*M*N Rangement en mémoire Rangement en faisant évoluer le deuxième indice (le plus à droite) d abord Ad_T T[0,0] T[0,1] T[0,N-1] T[1,0] T[1,N-1] T[M-1,0] T[M-1,N-1] Premier indice =0 Premier indice =1 Premier indice =M-1 P. Sicard-Cours ALM 6 Les tableaux en assembleur 23 P. Sicard-Cours ALM 6 Les tableaux en assembleur 24

Rangement en mémoire Rangement en faisant évoluer le premier indice (le plus à gauche) d abord Ad_T T[0,0] T[1,0] T[M-1,0] T[0,1] T[M-1,1] T[0,N-1] T[M-1,N-1] Deuxième indice =0 Deuxième indice =1 Deuxième indice =N-1 Accès aux éléments d un tableau à 2 dimensions Calculs différents suivant la convention de stockage (à définir au départ): Evolution du premier indice d abord: -Adresse de T[i,j] : -Ad_T + i * TAILLE_ELT + M* j * TAILLE_ELT = Ad_T + TAILLE_ELT * (i+ M*j) -M*TAILLE_ELT: taille d une ligne Evolution du deuxième indice d abord: -adresse de T[i,j] : -Ad_T + i * N* TAILLE_ELT + j* TAILLE_ELT = Ad_T + TAILLE_ELT * (i*n+j) -N*TAILLE_ELT : taille d une colonne P. Sicard-Cours ALM 6 Les tableaux en assembleur 25 P. Sicard-Cours ALM 6 Les tableaux en assembleur 26