Programmation en assembleur du LC3

Documents pareils
Architecture Matérielle et Logicielle (LIF6) Cahier d'exercices, automne 2014

Rappels d architecture

Conception de circuits numériques et architecture des ordinateurs


INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

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

ASR1 TD7 : Un microprocesseur RISC 16 bits

Structure d un programme

Programmation assembleur : aperçu

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

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

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

Microprocesseur + Logiciel

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

Représentation d un entier en base b

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

Cours Informatique Master STEP

TP 1. Prise en main du langage Python

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

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

Algorithmique et Programmation, IMA

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

IV- Comment fonctionne un ordinateur?

Architecture des ordinateurs

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)

Le langage C. Séance n 4

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

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

1. Structure d'un programme FORTRAN 95

Algorithme. Table des matières

Compilation (INF 564)

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

Cours 1 : Qu est-ce que la programmation?

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

Concept de machine virtuelle

Initiation à la programmation en Python

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

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

Jeu d instructions NIOS II

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

Exécution des instructions machine

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

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

Une version javascript sera disponible directement dans le cours prochainement.

Traduction des Langages : Le Compilateur Micro Java

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

Les chaînes de caractères

Java Licence Professionnelle CISII,

INF 321 : mémento de la syntaxe de Java

Tp 1 correction. Structures de données (IF2)

Chapitre 2 Devine mon nombre!

IFT2880 Organisation des ordinateurs et systèmes

V- Manipulations de nombres en binaire

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

Chapitre 5 : Les procédures stockées PL/SQL

Le langage C. Introduction, guide de reference

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

Informatique Générale

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

Logiciels DSPiy. DSPiyStudio logiciels et format des fichiers. incomplet

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

LES TYPES DE DONNÉES DU LANGAGE PASCAL

CM2 L architecture MIPS32

Programmation système I Les entrées/sorties

HMI target Visu / PLC HMI. Pour réaliser une interface homme machine avec PLC control

Les failles Format String

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

Licence Sciences et Technologies Examen janvier 2010

Architecture : Circuits numériques et éléments d architecture

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

L informatique en BCPST

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

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

Gestion mémoire et Représentation intermédiaire

Logiciel de Base. I. Représentation des nombres

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

REALISATION d'un. ORDONNANCEUR à ECHEANCES

PIC : COURS ASSEMBLEUR

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Introduction à MATLAB R

Programmation en langage C

Rappels Entrées -Sorties

Éléments d'architecture des ordinateurs

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

I- Définitions des signaux.

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Utilisation d objets : String et ArrayList

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Présentation du langage et premières fonctions

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

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

Manuel de référence du langage Exemples Les aventures de Docteur R.

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

Les opérations binaires

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

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Cours d Algorithmique et de Langage C v 3.0

Cours Informatique 1. Monsieur SADOUNI Salheddine

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

Transcription:

Programmation en assembleur du LC3 1 Programmation en assembleur du LC-3 Introduction à l'architecture du LC-3 Allure générale d'un programme Les instructions que l'on va utiliser Les instructions de chargement et rangement Les instructions de branchement Un exemple de programme 2 Les routines et la pile Les routines Un exemple de routine Mise en place d'une pile d'exécution Un exemple d'utilisation de la pile 3 Conclusion Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 1 / 35

Introduction Le LC-3 est un processeur developpé dans un but pédagogique par Yale N. Patt et J. Patel dans [Introduction to Computing Systems : From Bits and Gates to C and Beyond, McGraw-Hill, 2004]. Des sources et exécutables sont disponibles à l'adresse : http://highered.mcgraw-hill.com/sites/0072467509/ Nous allons nous baser sur le LC-3 pour illustrer les points suivants : Comment programme t'on en assembleur? Comment mettre en place des routines? Comment mettre en place une pile d'exécution de programme? Ce cours est inspiré de celui d'olivier Carton (Université Paris Diderot - Paris 7), disponible à l'adresse : http://www.liafa.jussieu.fr/~carton Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 2 / 35

Plan 1 Programmation en assembleur du LC-3 Introduction à l'architecture du LC-3 Allure générale d'un programme Les instructions que l'on va utiliser Les instructions de chargement et rangement Les instructions de branchement Un exemple de programme 2 Les routines et la pile Les routines Un exemple de routine Mise en place d'une pile d'exécution Un exemple d'utilisation de la pile 3 Conclusion Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 3 / 35

La mémoire centrale et les registres du LC-3 La mémoire est organisée par mots de 16 bits, avec un adressage sur 16 bits : adresses de (0000) H à (FFFF) H. Les registres : 8 registres généraux 16 bits : R0,...,R7. Toutefois, R6 est utilisé spéciquement pour la gestion de la pile d'exécution, R7 est utilisé pour stocker l'adresse de retour d'un appel de fonction. quelques registres spéciques 16 bits : PC (Program Counter) et IR (Instruction Register) PSR (Program Status Register) plusieurs drapeaux binaires, Les bits N,Z,P du PSR indiquent si la dernière valeur rangée dans un registre général est strictement négative, zéro ou strictement positive. Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 4 / 35

Plan 1 Programmation en assembleur du LC-3 Introduction à l'architecture du LC-3 Allure générale d'un programme Les instructions que l'on va utiliser Les instructions de chargement et rangement Les instructions de branchement Un exemple de programme 2 Les routines et la pile Les routines Un exemple de routine Mise en place d'une pile d'exécution Un exemple d'utilisation de la pile 3 Conclusion Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 5 / 35

Forme générale d'un programme Un programme source écrit en langage d'assemblage est un chier texte qui comporte une suite de lignes. Sur chaque ligne, on trouve : soit une instruction (ADD, LD, BR,... ) ; soit une macro (GETC, OUT,... ) ; soit une directive d'assemblage (.ORIG,.BLKW,... ) ; Une ligne peut être précédée par une étiquette pour référencer son adresse..orig x3000 ; directive pour le début de programme ; partie dédiée au code <- il s'agit d'un commentaire loop: GETC ; macro marquée par une étiquette LD R1,cmpzero ; instruction HALT ; macro ; partie dédiée aux données cmpzero:.fill xffd0 ; étiquette et directive.end ; directive Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 6 / 35

Constantes Il existe deux types de constantes. Les chaînes de caractères qui apparaissent uniquement après la directive.stringz : elles sont délimitées par deux caractères " et implicitement terminées par le caractère nul. Les entiers relatifs en hexadécimal sont précédés d'un x ; sinon, ce sont des décimaux (le préx # est optionnel). Ils peuvent apparaître comme Exemple : opérandes immédiats des instructions (attention à la taille des opérandes), paramétres des directives.orig,.fill et.blkw..orig x3000 ; Constante entière en base 16 AND R2,R1,2 ; Constante entière en base 10 ADD R6,R5,#-1 ; Constante entière négative en base 10.STRINGZ "Chaîne" ; Constante chaîne de caractères Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 7 / 35

Directives d'assemblage.orig adresse Spécie l'adresse à laquelle doit commencer le bloc d'instructions qui suit..end Termine un bloc d'instructions..fill valeur Réserve un mot de 16 bits et le remplit avec la valeur constante donnée en paramètre..stringz chaine Réserve un nombre de mots égal à la longueur de la chaîne de caractères plus un caractère nul (code ASCII 0) et y place la chaîne..blkw nombre Cette directive réserve le nombre de mots de 16 bits passé en paramètre. Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 8 / 35

Les interruptions prédénies : appels système L'instruction TRAP appelle un gestionnaire d'interruptions mis en place par le petit système d'exploitation du LC-3 : il s'agit donc d'un appel système. Chaque appel système est identié par une constante sur 8 bits. Dans l'assembleur du LC-3, on peut utiliser les macros suivantes : instruction macro description TRAP x00 HALT termine un programme (rend la main à l'os) TRAP x20 GETC lit au clavier un caractère ASCII et le place dans l'octet de poids faible de R0 TRAP x21 OUT écrit à l'écran le caractère ASCII placé dans l'octet de poids faible de R0 TRAP x22 PUTS écrit à l'écran la chaîne de caractères pointée par R0 TRAP x23 IN lit au clavier un caractère ASCII, l'écrit à l'écran, et le place dans l'octet de poids faible de R0 Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 9 / 35

Plan 1 Programmation en assembleur du LC-3 Introduction à l'architecture du LC-3 Allure générale d'un programme Les instructions que l'on va utiliser Les instructions de chargement et rangement Les instructions de branchement Un exemple de programme 2 Les routines et la pile Les routines Un exemple de routine Mise en place d'une pile d'exécution Un exemple d'utilisation de la pile 3 Conclusion Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 10 / 35

Les instructions du LC-3 Les instructions du LC-3 se répartissent en trois classes. 1 Instructions arithmétiques et logiques : ADD, AND, NOT. 2 Instructions de chargement et rangement : LD, ST : load et store LDR, STR : comme LD et ST mais avec un adressage relatif LEA : load eective address 3 Instructions de branchement : BR : branch JSR : jump subroutine TRAP : interruption logicielle RET : de retour de routine Il y à aussi NOP, pour no operation, qui ne fait rien... Pour simplier les choses, d'autres instructions du jeu d'instruction du LC3 sont ici omises. Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 11 / 35

Récapitulatif des instructions du LC-3 syntaxe action NZP codage opcode arguments F E D C B A 9 8 7 6 5 4 3 2 1 0 NOT DR,SR DR <- not SR * 1 0 0 1 DR SR 1 1 1 1 1 1 ADD DR,SR1,SR2 DR <- SR1 + SR2 * 0 0 0 1 DR SR1 0 0 0 SR2 ADD DR,SR1,Imm5 DR <- SR1 + SEXT(Imm5) * 0 0 0 1 DR SR1 1 Imm5 AND DR,SR1,SR2 DR <- SR1 and SR2 * 0 1 0 1 DR SR1 0 0 0 SR2 AND DR,SR1,Imm5 DR <- SR1 and SEXT(Imm5) * 0 1 0 1 DR SR1 1 Imm5 LEA DR,label DR <- PC + SEXT(PCoset9) * 1 1 1 0 DR PCoset9 LD DR,label DR <- mem[pc + SEXT(PCoset9)] * 0 0 1 0 DR PCoset9 ST SR,label mem[pc + SEXT(PCoset9)] <- SR 0 0 1 1 SR PCoset9 LDR DR,BaseR,Oset6 DR <- mem[baser + SEXT(Oset6)] * 0 1 1 0 DR BaseR Oset6 STR SR,BaseR,Oset6 mem[baser + SEXT(Oset6)] <- SR 0 1 1 1 SR BaseR Oset6 BR[n][z][p] label Si (cond) PC <- PC + SEXT(PCoset9) 0 0 0 0 n z p PCoset9 NOP No Operation 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 RET (JMP R7) PC <- R7 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 JSR label R7 <- PC ; PC <- PC + SEXT(PCoset11) 0 1 0 0 1 PCoset11 Notez par exemple que l'addition (ADD) se décline de deux façons : ADD DR, SR1, SR2 ADD DR, SR1, Imm5 La colonne NZP indique les instructions qui mettent à jour les drapeaux NZP. Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 12 / 35

Plan 1 Programmation en assembleur du LC-3 Introduction à l'architecture du LC-3 Allure générale d'un programme Les instructions que l'on va utiliser Les instructions de chargement et rangement Les instructions de branchement Un exemple de programme 2 Les routines et la pile Les routines Un exemple de routine Mise en place d'une pile d'exécution Un exemple d'utilisation de la pile 3 Conclusion Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 13 / 35

LD et ST On ne va décrire que LD, mais le principe est symétrique pour ST. syntaxe : LD DR,label le label servira à désigner une adresse mémoire AdM. action : DR Mem[PC + Sext(PCOset9)] valeur de PC après son incrémentation lors du chargement ; si adi est l'adresse de l'instruction, PC = adi+1. PCOset9 est un décalage en complément à 2 sur 9 bits. La case mémoire chargée est donc celle à l'adresse : adm = adi + 1 + Sext(PCOset9), adi 255 adm adi + 256. C'est l'assembleur qui va se charger du calcul de PCOset9 : le programmeur en langage d'assemblage utilise des labels. Notez que la distance entre une instruction LD et la case mémoire dont elle peut charger le contenu est limitée. Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 14 / 35

LDR et STR On ne va décrire que LDR, mais le principe est symétrique pour STR. syntaxe : LDR DR,baseR,Oset6 action : DR Mem[baseR + Sext(PCOset6)] Avec LDR et STR, on peut accéder à toutes les adresses de la mémoire, ce qui permet de lever les limitations de LD/ST. On utilise ces instructions pour manipuler des données sur la pile, comme les variables locales des fonctions ; accéder aux éléments d'un tableau ou d'une chaîne de caractères. baser est utilisé comme un pointeur. Par contre, comment initialiser baser? Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 15 / 35

LEA LEA permet de charger une adresse dans un registre général. syntaxe : LEA DR,label action : DR PC + Sext(PCOset9) L'adresse est calculée comme pour LD, mais seule l'adresse est chargée dans DR. Cette instruction est utile pour : charger l'adresse d'un tableau dans un registre, charger l'adresse de la base de la pile d'exécution. On se sert donc de LEA pour initialiser un pointeur. Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 16 / 35

Plan 1 Programmation en assembleur du LC-3 Introduction à l'architecture du LC-3 Allure générale d'un programme Les instructions que l'on va utiliser Les instructions de chargement et rangement Les instructions de branchement Un exemple de programme 2 Les routines et la pile Les routines Un exemple de routine Mise en place d'une pile d'exécution Un exemple d'utilisation de la pile 3 Conclusion Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 17 / 35

BR On réalise avec BR des branchements inconditionnels ou conditionnels. Trois drapeaux N, Z et P (majuscules) du PSR sont mis à jour dès qu'une nouvelle valeur est chargée dans l'un des registres généraux : N passe à 1 si cette valeur est strictement négative, Z passe à 1 si cette valeur est zéro, P passe à 1 si cette valeur est strictement positive. L'instruction BR contient trois bits n, z et p (minuscules) : syntaxe : BR[n][z][p] label action : si cond alors PC PC+Sext(PCOset9) avec cond = (n z p) + (n = N) + (z = Z) + (p = P) L'assembleur se charge de calculer PCOset9 d'après le label fourni : il faut néanmoins garder à l'esprit le fait que la distance du saut est limitée... Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 18 / 35

Plan 1 Programmation en assembleur du LC-3 Introduction à l'architecture du LC-3 Allure générale d'un programme Les instructions que l'on va utiliser Les instructions de chargement et rangement Les instructions de branchement Un exemple de programme 2 Les routines et la pile Les routines Un exemple de routine Mise en place d'une pile d'exécution Un exemple d'utilisation de la pile 3 Conclusion Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 19 / 35

Un exemple On veut écrire un programme qui range à l'adresse désignée par res la longueur d'une chaîne de caractères se trouvant à l'adresse string. Point de départ :.ORIG x3000 ; Ici viendra notre code HALT string:.stringz "Hello World" res:.blkw #1.END ; Pour mettre fin à l'exécution On va traduire le pseudo-code suivant : R0 <- string; // R0 pointe vers le début de la chaîne R1 <- 0; // Le compteur R1 est initialisé à 0 while((r2 <- Mem[R0])!= '\0') { R0 <- R0+1; // Incrémentation du pointeur R1 <- R1+1; // Incrémentation du compteur } res <- R1; // Rangement du résultat Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 20 / 35

Cela donne au nal le programme suivant :.ORIG x3000 LEA R0,string ; Initialisation du pointeur R0 AND R1,R1,0 ; Le compteur R1 est initialisé à 0 loop: LDR R2,R0,0 ; Chargement dans R2 du caractere pointé par R0 BRz end ; Test de sortie de boucle ADD R0,R0,1 ; Incrémentation du pointeur ADD R1,R1,1 ; Incrémentation du compteur BR loop end: ST R1,res HALT ; Chaîne constante string:.stringz "Hello World" res:.blkw #1.END Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 21 / 35

Plan 1 Programmation en assembleur du LC-3 Introduction à l'architecture du LC-3 Allure générale d'un programme Les instructions que l'on va utiliser Les instructions de chargement et rangement Les instructions de branchement Un exemple de programme 2 Les routines et la pile Les routines Un exemple de routine Mise en place d'une pile d'exécution Un exemple d'utilisation de la pile 3 Conclusion Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 22 / 35

Les routines En assembleur, une routine est juste une portion de code : l'adresse de la première instruction de cette portion de code est connue, et marquée par un label ; on peut eectuer un saut vers cette portion de code (instruction JSR), qui constitue un appel à la routine ; à la n de l'exécution de la routine, une instruction de retour (RET) fait repasser PC à l'adresse suivant celle de l'instruction d'appel de la routine. Une routine correspond un peu à une fonction dans un langage de haut niveau : en fait, le programmeur doit gérer beaucoup de choses lui-même... Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 23 / 35

JSR et RET Lorsqu'une routine est appelée, il faut mémoriser l'adresse à laquelle doit revenir s'exécuter le programme à la n de la routine. JSR stocke l'adresse de retour dans R7, puis eectue un branchement à l'adresse passée comme opérande. RET permet de retourner à la routine appelante, par un saut à l'adresse contenue dans R7. Dans le programme, on fera par exemple appel à la routine sub : JSR sub ; R7 <- PC ; PC <- PC + SEXT(PCoffset11) Dans la routine, le retour au programme principal se fera avec RET : ; routine sub sub: RET ; PC <- R7 Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 24 / 35

Un exemple de routine On reprend le programme pour calculer la longueur d'une chaîne de caractères :.ORIG x3000 LEA R0,string ; Initialisation du pointeur R0 AND R1,R1,0 ; Le compteur R1 est initialisé à 0 loop: LDR R2,R0,0 ; Chargement dans R2 du caractere pointé par R0 BRz end ; Test de sortie de boucle ADD R0,R0,1 ; Incrémentation du pointeur ADD R1,R1,1 ; Incrémentation du compteur BR loop end: ST R1,res HALT ; Chaîne constante string:.stringz "Hello World" res:.blkw #1.END On va écrire une routine strlen pour calculer la longueur d'une chaîne de caractères dont l'adresse est placée dans R0, et qui rend son résultat dans R0. Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 25 / 35

Solution ; Programme principal LEA R0,chaine1 ; Chargement dans R0 de l'adresse de la chaîne JSR strlen ; Appel de la routine ST R0,lg1 HALT ; Données chaine1:.stringz "Hello World" lg1:.blkw #1 ; Routine pour calculer la longueur d'une chaîne terminée par '\0'. ; paramètre d'entrée : R0 adresse de la chaîne ; paramètre de sortie : R0 longueur de la chaîne strlen: AND R1,R1,0 ; Mise à 0 du compteur : c = 0 loop: LDR R2,R0,0 ; Chargement dans R2 du caractère pointé par R0 BRz fini ; Test de fin de chaîne ADD R0,R0,1 ; Incrémentation du pointeur ADD R1,R1,1 ; Incrémentation du compteur BR loop fini: ADD R0,R1,0 ; R0 <- R1 RET ; Retour à l'appelant Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 26 / 35

Plan 1 Programmation en assembleur du LC-3 Introduction à l'architecture du LC-3 Allure générale d'un programme Les instructions que l'on va utiliser Les instructions de chargement et rangement Les instructions de branchement Un exemple de programme 2 Les routines et la pile Les routines Un exemple de routine Mise en place d'une pile d'exécution Un exemple d'utilisation de la pile 3 Conclusion Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 27 / 35

Quand une routine en appelle une autre, elle doit sauvegarder son adresse de retour avant l'appel, et la restaurer après. ; programme principal JSR sub1 ; routine sub1 sub1: JSR sub2 RET ; Problème : ici R7 ne contient l'adresse de retour vers sub1! ; (puisque sub2 a été appelée juste avant) ; routine sub2 sub1: RET Une méthode est de mettre en place une pile d'exécution, qui permet de gérer même les appels récursifs. Il faut aussi sauvegarder les registres dont on souhaite retrouver le contenu après l'exécution d'une routine. Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 28 / 35

On donne ici une manière de gérer une pile d'exécution sur le LC-3 : R6 est réservé à la gestion de la pile. R6 est initialisé à un adresse de fond de pile désignée par stackend. R6 donne toujours l'adresse de la dernière valeur mise sur la pile. La pile croît dans le sens des adresses décroissantes. R0 R1 x0000 R6 R7 x30fe ins1 ins2 x3000 x3001 x30ff stackend: 000000 111111x3100 000000 111111 xffff Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 29 / 35

Mise en place de la pile d'exécution :.ORIG x3000 ; Programme principal main: LD R6,spinit ; on initialise le pointeur de pile HALT ; Gestion de la pile spinit:.fill stackend.blkw #15 stackend:.blkw #1 ; adresse du fond de la pile.end Empilement d'un registre Ri : ADD R6,R6,-1 ; déplacement du sommet de pile STR Ri,R6,0 ; rangement de la valeur Dépilement du sommet de pile dans un registre Ri : LDR Ri,R6,0 ADD R6,R6,1 ; récupération de la valeur ; restauration du sommet de pile Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 30 / 35

Un exemple utilisant la pile On reprend notre exemple, d'abord sous la forme d'un pseudocode : main(void) { sub1(); } sub1(void) { sub2(); return; } sub2(void) { return; } Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 31 / 35

On ajoute la gestion de la pile d'exécution : main(void) { sub1(); } sub1(void) { push(r7); sub2(); R7 <- pop(); return; } sub2(void) { return; } // sauvegarde de l'adresse de retour R7 // restauration de l'adresse de retour Rem : si sub2 faisait appel à d'autres routines, il serait nécessaire qu'elle sauvegarde aussi son adresse de retour! Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 32 / 35

En langage d'assemblage du LC3, cela donne pour le programme principal : ; Programme principal main: LD R6,spinit ; on initialise le pointeur de pile JSR sub1 ; appel à la routine sub1 HALT ; Mémoire réservée à la pile spinit:.fill stackend.blkw #15 stackend:.blkw #1 ; adresse du fond de la pile Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 33 / 35

Et pour les deux routines sub1 et sub2 : ; routine sub1 sub1: ADD R6,R6,#-1 ; STR R7,R6,#0 ; sauvegarde de l'adresse de retour R7. JSR sub2 LDR R7,R6,#0 ; restaure le registre R7. ADD R6,R6,#1 ; RET ; retour à l'appelant ; routine sub2 sub2: RET ; retour à l'appelant Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 34 / 35

Conclusion Nous avons vu : un exemple de langage d'assemblage ; comment peuvent être mis en place les appels de routines et la pile ; utile pour sauvegarder variables, paramètres et adresse de retour... Les étapes suivantes seraient de voir comment transformer : du code en langage d'assemblage vers le langage machine assemblage ; du code en langage de haut niveau vers un langage d'assemblage compilation. source du programme langage C compilateur programme traduit en assembleur langage machine langage d assemblage code objet Nicolas Louvet Programmation en assembleur du LC3. 21 mars 2016 35 / 35