2/16 L'assembleur VLTN Chapitre 6: Programmation assembleur > Machine rudimentaire pour l'étude pédagogique ; > Inspiré de l'IBM 650 ; > Stocke des valeurs de 6 chi res en base 10 ; > 1 registre de calcul ACCU ; > 1 registre d'instruction INST ; > 2 registres PC et PT sur 2 chi res ; M. Dubacq IUT de Villetanneuse > 2 drapeaux NUL et ERR (ACCU nul et dernier calcul avec débordement) ; 2008 2009 > Mémoire adressable : 100 adresses (sur 2 chi res en base 10) ; > Codage machine : DCB (décimal codé binaire). 3/16 Mémoire et Instructions 4/16 Exécution > Une instruction est codé par six chi res XXYYZZ ; > VLTN peut être exécuté par un simulateur ; > XX est le code d'opération (représente l'opération à effectuer) ; > Un programme complet décrira la mémoire initiale et la série d'entrées ; > YY est l'argument ; > mémoire initiale : dans un chier : 10 : 40 30 24 décrit qu'à la case 10 de la mémoire, il y a l'instruction ADD 30 24 (ou bien le nombre 403 024) > ZZ est l'adresse de prochaine instruction ; > Pas de séparation code/données : tout emplacement peut être l'un ou l'autre ; > Mnémonique en quatre lettres (ou moins). > ACCU vaut 000000, ERR et NUL valent FAUX, PC vaut 00 ; > Disponible sur la page web http://lipn.fr/~dubacq/ ; > Le simulateur donne les sorties et le code de n. 5/16 Instructions : Manipulations OP 01 02 10 21 31 80 MNEM TSTN TSTE SET LOAD STOR GOTO Nom Test NUL Test ERR Set Load Store Nothing/Goto Effet Si NUL, PC<-YY, sinon PC<-ZZ Si ERR, PC<-YY, sinon PC<-ZZ ACCU<-YY PC<-ZZ ACCU<-MEM[YY] PC<-ZZ MEM[YY]<-ACCU PC<-ZZ PC<-ZZ À chaque cycle où ACCU est modi é, ERR est mis à VRAI si débordement, FAUX sinon. NUL est mis à VRAI si ACCU est nul. Résultat tronqué si ERR (ex : 689210+582636=2718456). Instructions : Logique OP 50 51 52 53 MNEM SHFL SHFR ROTL REVE Nom Shift left Shift right Rotate left Reverse Effet ACCU<-ACCU ACCU<-ACCU ACCU<-ACCU ACCU<-ACCU déc. g YY col. déc. d YY col. rot. g YY col. à l’envers 6/16 Instructions : Arithmétique OP 40 41 42 43 44 45 46 47 MNEM ADD ADDI ADDM ADDL SUB SUBI SUBM SUBL Nom Add Add Add Add Sub Sub Sub Sub Imm. Imm. mid. Imm. left Imm. Imm. mid. Imm. left Effet ACCU<-ACCU+MEM[YY] ACCU<-ACCU+YY ACCU<-ACCU+YY*100 ACCU<-ACCU+YY*10000 ACCU<-ACCU-MEM[YY] ACCU<-ACCU-YY ACCU<-ACCU-YY*100 ACCU<-ACCU-YY*10000 PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ Les opérations se font en base 10 (tout est codé en binaire en interne, mais on a programmé la table d'addition en base 10). Quand A − B déborde (négatif), on obtient 1 000 000 + A − B. 7/16 8/16 Instructions : Entrées/Sorties PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ Usuellement, on a aussi les opérations AND, OR, XOR et NOT. Pour un ordinateur qui utilise un codage décimal, ça n'a pas tellement de sens. OP 90 91 00 MNEM READ WRIT EJECT Nom Read input Write output Eject (fin de travail) Effet MEM[YY]<-input PC<-ZZ output<-MEM[YY] PC<-ZZ Code de fin : YYZZ Une entrée lue sur input est consommée (plus présente), une sortie lue sur output est a ichée. Le code de n est conventionnellement 0000 pour un programme qui nit normalement, le reste au choix du programmeur (par ex., un programme avec pas assez de données s'arrêterait avec 0001). Si aucune entrée n'est disponible, READ met ERR à 1 et renvoie un nombre aléatoire. Sinon, ERR est mis à 0. 9/16 Exemple de programme Instructions : Indirections OP 11 12 13 14 15 16 17 22 32 81 82 MNEM SETL SETM SETR SAVE COPY SWAP SETP LDIX STIX LINK RET Nom SET Left Set Middle Set Right Save Copy Swap Set PT Load Index Store Index Jump and link Return Effet Left(ACCU)<-YY Mid(ACCU)<-YY Right(ACCU)<-YY PT<-ACCU ACCU<-PT PT<-Right(ACCU) ACCU<-PT Right(PT)<-YY ACCU<-MEM[PTR+YY] MEM[PTR+YY]<-ACCU ACCU<-PC PC<-ACCU+YY PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ PC<-ZZ Ces instructions seront utilisées plus tard dans le cours. Quand YY dépasse 100, on enlève 100 : +99 est donc équivalent à -1. Mémoire dans un système moderne > Adresses sur n bits, mots de x octets ; > Notation hexadécimale pour les adresses ; > 2n octets adressables, soit 2n/x mots. Adresse Mémoire 0x00000000 1ermot 0x00000004 2emot 0x00000008 3emot .. . . . . ←−1 mot−→ . . = 4 octets .. . . 0xFFFFFFFC 230emot 10/16 // Fichier somme2.vltn 00: 90 50 01 // READ 50 01 01: 90 51 02 // READ 51 02 02: 21 50 03 // LOAD 50 03 03: 40 51 04 // ADD 51 04 04: 31 52 05 // STOR 52 05 05: 91 52 06 // WRIT 52 06 06: 00 00 00 // EJECT 0000 // Exécution runner somme2.vltn 000024 000048 Exit code: 0000 000072 Plus en TD... 11/16 12/16 Utilisation de la mémoire > On distingue dans tous les systèmes modernes plusieurs types d'utilisation de la mémoire ; > Programme (segment de texte) contient les instructions ; > Données (segment de données) contient les données ; > Données statiques : début du segment de données ; > Données dynamiques (tas) : au-dessus des données statiques ; > Données de fonctionnement (pile) : à l'envers, jusqu'au fond de pile ; > Mémoire pour le noyau et emplacements reservés. 13/16 Représentation de la mémoire (en MIPS) 0x00000000 0x003FFFFF 0x00400000 0x0FFFFFFF 0x10000000 0x???????? 0x???????? 0x???????? 0x???????? 0x???????? 0x???????? 0x7FFFFFFF 0x80000000 0xFFFFFFFF > Contient le code machine correspondant aux instructions ; Reservé Segment de texte > Assembleur : forme textuelle, code machine : codage binaire ; Données statiques > Les instructions sont consécutives dans la mémoire ; Tas l l > Exécution consécutive des instructions, sauf sauts et branchements ; Espace libre Le segment de texte 14/16 > Registre PC : adresse d'instruction courante ; > Point d'entrée déclarée par une étiquette main. Pile Reservé Le segment de données statiques 15/16 16/16 La mémoire en VLTN > Déclaration de données dont l'adresse et la taille sont connues du début à la n du programme ; > Répartition conventionnelle (à part adresse 0) ; > Les étiquettes sont les seuls repères dans la mémoire pour l'assembleur ; > Adresses 50 (ou plus) : variables globales (équivalent du segment de données statiques et du tas) ; > Transformées en constantes lors de l'assemblage ; > Adresses 99 et moins : pile (pour plus tard). > Souvent, pseudo-instruction LoadAddress met la valeur de l'adresse dans registre ; > Déclaration de types de base avec valeurs initiales ; > Quand pas d'étiquette, adressage par connaissance des tailles des objets. > Adresses 0 et suivantes : programme ;