Support de cours avantages et inconvénients de l’assembleur, tutoriel & guide de travaux pratiques Assembleur en pdf.
Organisation de l’Ordinateur
Et c’est parti pour l’assembleur, je rassemble mon cerveau et prend mon courage à deux pattes… en effet, il va m’en falloir, car après les explications de bases, assez facile, et que vous connaissiez sans doute déjà, on va s’attaquer à un gros morceau très important dans la programmation en assembleur, puisqu’il s’agit de la gestion de la mémoire. Il est vital de comprendre comment elle est organisée, et comment on y accède efficacement. D’ou le titre.
Nous y voilà. Encore un chapitre barbant… Donc comme je l’ai dit plus haut, ce chapitre est extrêmement important. Car après ça, on entrera de plein pied dans la programmation en apprenant des instructions en plus grosse quantité, puis dans les chapitres suivants, nous aborderont la structure des données. Donc je le souligne bien, il faut comprendre ce chapitre.
Pour décrire brièvement ce chapitre, je peux déjà vous dire qu’il traitera de l’organisation de la mémoire, de la façon dont le processeur communique avec, les différents registres des processeurs Intel de la famille 80×86, les modes d’adressage de ces processeurs, ensuite nous expliquerons le fonctionnement des registres et des drapeaux ainsi que la pile. Enfin, nous verrons les premières instructions d’assembleur, liées donc à la gestion de la mémoire.
Un microprocesseur, en deux mots
Sans entrer dans les détails qui seront vus en cours, nous présentons le minimum à savoir sur ce qu’est un microprocesseur.
Le microprocesseur, noté CPU (Central Processing Unit), est un élément indispensable dans un ordinateur. Il s’agit d’un élément semi-conducteur au silicium dont la fabrication nécessite une précision extrême. En effet, le microprocesseur regroupe un certain nombre de transistors élémentaires interconnectés, caractérisé par une très grande intégration et doté des facultés fonctionnelles d’interprétation et d’exécution des instructions d’un programme. Le microprocesseur n’est pas uniquement utilisé au sein des PC. De plus en plus les objets qui nous entourent sont truffés de microprocesseurs, de la voiture au téléphone portable en passant par la chaudière et la télévision.
Un microprocesseur constitue le cœur de tout ordinateur: il exécute les instructions qui composent les programmes que nous lui demandons d’exécuter. Les instructions sont stockées en mémoire (en dehors du microprocesseur). Ces instructions (dont l’ensemble compose le langage assembleur) sont très simples mais n’en permettent pas moins, en les combinant, de réaliser n’importe quelle opération programmable. Pour exécuter un programme, le processeur lit les instructions en mémoire, une par une. Il connaît à tout instant l’adresse (l’endroit dans la mémoire) à laquelle se trouve la prochaine instruction à exécuter car il mémorise cette adresse dans son compteur ordinal.
Avant de nous intéresser plus particulièrement à l’architecture interne d’un microprocesseur, il convient de connaître l’évolution impressionnante de ces composants.
Historique
Le concept de microprocesseur a été créé par la Société Intel. Cette Société, créée en 1968, était spécialisée dans la conception et la fabrication de puces mémoire. À la demande de deux de ses clients — fabricants de calculatrices et de terminaux — Intel étudia une unité de calcul implémentée sur une seule puce. Ceci donna naissance, en 1971, au premier microprocesseur du monde, le 4004, qui était une unité de calcul 4 bits fonctionnant à 108 kHz. Il résultait de l’intégration d’environ 2300 transistors. A partir de cette date, un rythme très rapide d’évolution s’est installé. De nombreux autres modèles sont apparus, de plus en plus puissants et de plus en plus complexes. Ce rythme d’évolution s’est maintenu sans fléchir jusqu’à aujourd’hui. Ces évolutions concernent les techniques d’intégrations des nombres de transistors et la fréquence d’horloge des processeurs. Il y a également d’autres améliorations, comme la largeur de bus mémoire, la taille des registres ou la taille de la mémoire cache. Dans le même intervalle de temps, leur puissance de traitement est passée de 60 000 instructions exécutées par seconde par l’Intel 4004 à plusieurs milliards par les machines actuelles les plus puissants. L’histoire des microprocesseurs sur les trente dernières années est certainement la plus formidable évolution technologique de l’histoire humaine, tant en durée qu’en ampleur. Aujourd’hui, le multimédia puis le 3D et le temps réel.
Demain, le monde virtuel !
Ce rythme d’évolution effréné est appelé loi de Moore (Gordon E. Moore, du non du président de la compagnie Intel qui l’a formulé dans les années 70). Il prévoyait que les performances des processeurs (par extension le nombre de transistors intégrés sur silicium) doubleraient tous les 12 mois. Cette loi a été révisée en 1975, portant le nombre de mois à 18. La loi de Moore se vérifie encore aujourd’hui. Moore estime que cette évolution se poursuivra jusqu’en 2017, date à laquelle elle devrait rencontrer des contraintes liées à la physique des atomes.
Le tableau si dessous recense l’évolution de la gamme des processeurs compatibles Intel x86, avec les dates des premières versions de chaque modèle.
Cette miniaturisation a permis:
D’augmenter les vitesses de fonctionnement des processeurs, car les distances entre les composants sont réduites.
De réduire les coûts, car un seul circuit en remplace plusieurs.
De créer des ordinateurs bien plus petits : les micro-ordinateurs.
Comme dans tout circuit intégré la technologie de fabrication impose au microprocesseur des caractéristiques :
Le jeu d’instructions qu’il peut exécuter. Tout microprocesseur contient en lui-même un jeu d’instructions. Ces instructions, très basiques, se résument à une tâche simple, par exemple :
Mettre telle valeur dans la mémoire.
Ou additionner telle valeur avec telle autre valeur et mettre le résultat dans la mémoire.
Comparer deux nombres pour déterminer s’ils sont égaux, comparer deux nombres pour déterminer lequel est le plus grand, multiplier deux nombres…
La complexité de son architecture. Cette complexité se mesure par le nombre de transistors contenus dans le microprocesseur. Plus le microprocesseur contiendra de transistors, plus il pourra effectuer des opérations complexes, et/ou traiter des chiffres des grande taille.
Le nombre de bits que le processeur peut traiter ensemble, autrement la longueur des données que peut manipuler un microprocesseur. Les premiers microprocesseurs ne pouvaient traiter plus de 4 bits d’un coup. Ils devaient donc exécuter plusieurs instructions pour additionner des nombres de 32 ou 64 bits. Les microprocesseurs actuels (en 2007) peuvent traiter des nombres sur 64 bits ensemble. Le nombre de bits est en rapport direct avec la capacité à traiter de grands nombres rapidement, ou des nombres d’une grande précision (nombres de décimales significatives).
• La vitesse de l’horloge. Le rôle de l’horloge est de cadencer le rythme du travail du microprocesseur. L’horloge tourne à une fréquence fixée (appelée vitesse d’horloge). Lorsque vous achetez un ordinateur à 1,6GHz, 1,6GHz est la fréquence de cette horloge. L’horloge ne décompte pas les minutes et les secondes. Elle bat simplement à un rythme constant. Les composants électroniques du processeur utilisent les pulsations pour effectuer leurs opérations correctement comme le battement d’un métronome aide à jouer de la musique à un rythme correct. Le nombre de battements (ou, comme on les appelle couramment cycles) que requiert une instruction dépend du modèle et de la génération du processeur. Le nombre de cycles dépend de l’instruction. Plus la vitesse de l’horloge n’augmente, plus le microprocesseur complète de calculs en une seconde.
Notations
x86 ou i86 : est la dénomination de la famille de microprocesseurs compatibles avec le jeu d’instructions de l’Intel 8086. Les différents constructeurs de microprocesseurs pour PC se doivent de maintenir une compatibilité ascendante afin que les anciens logiciels fonctionnent sur les nouveaux microprocesseurs. L’architecture de la série x86 à partir du Pentium a été nommée IA-32 par Intel.
IA-32 (Intel architecture 32 bits) ou i386 : désigne l’architecture à partir du Intel 80386, 32 bits, qui a enfin permis de sortir du mode réel correctement, et de faire un bon multitâches sur les Intel. Et d’avoir un adressage mémoire de 4 Go.
IA-64 (Intel Architecture 64 bits) désigne l’architecture des nouvelles est une architecture de processeurs Intel destinées à remplacer les x86. Il s’agit d’une rupture totale avec la série x86, le jeu d’instructions n’ayant plus rien à voir, ni les éléments de l’architecture du processeur. Le résultat est quelque chose de globalement nettement plus simple, donc de bien plus rapide, en donnant un contrôle plus fin au logiciel sur le matériel.
Il faut savoir que les familles de processeur ce sont succédés en ajoutant leurs lots d’améliorations, et pas uniquement en matière de rapidité. Voici les principaux processeurs x86: 8088/8086, 80188/80186, 80286, 80386, 80486, 80586/pentium.
8088, 8086: Ces processeurs, du point de vue de la programmation sont identiques. Ils étaient les processeurs utilisés dans les tous premiers PC. Ils offrent plusieurs registres 16 bits : AX, BX, CX, DX, SI, DI, BP, SP, CS, DS, SS, ES, IP, FLAGS. Ils ne supportent que jusqu’à 1Mo de mémoire et n’opèrent qu’en mode réel. Dans ce mode, un programme peut accéder à n’importe quelle adresse mémoire, même la mémoire des autres programmes ! Cela rend le débogage et la sécurité très difficiles ! De plus, la mémoire du programme doit être divisée en segments. Chaque segment ne peut pas dépasser les 64Ko.
80286: Ce processeur était utilisé dans les PC de type AT. Il apporte quelques nouvelles instructions au langage machine de base des 8088/86. Cependant, sa principale nouvelle fonctionnalité est le mode protégé 16 bits. Dans ce mode, il peut accéder jusqu’à 16Mo de mémoire et empêcher les programmes d’accéder à la mémoire des uns et des autres. Cependant, les programmes sont toujours divisés en segments qui ne peuvent pas dépasser les 64Ko.
80386: Ce processeur a grandement amélioré le 80286. Tout d’abord, il étend la plupart des registres à 32 bits (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP) et ajoute deux nouveaux registres 16 bits : FS et GS. Il ajoute également un nouveau mode protégé 32 bits. Dans ce mode, il peut accéder jusqu’à 4Go de mémoire. Les programmes sont encore divisés en segments mais maintenant, chaque segment peut également faire jusqu’à 4Go !
80486/Pentium/Pentium Pro: Ces membres de la famille 80×86 apportent très peu de nouvelles fonctionnalités. Ils accélèrent principalement l’exécution des instructions.
Le 80586, appelé Pentium pour des raisons de protection commerciale, dispose d’un bus de données de 64 bits et est muni d’un dispositif de prévision des branchements. Il est constitué de 2 processeurs en pipe-line parallèles lui permettant d’exécuter deux instructions en même temps. Son cadencement est envisagé (en 1994) jusqu’à 150 MHZ.
Pentium MMX: Ce processeur ajoute les instructions MMX (MultiMedia eXentions) au Pentium. Ces instructions peuvent accélérer des opérations graphiques courantes.
Pentium II: C’est un processeur Pentium Pro avec les instructions MMX (Le Pentium III est grossièrement un Pentium II plus rapide).
Pourquoi les différents microprocesseurs d’Intel sont-ils alors compatibles entre eux ?
Tout simplement parce que chaque fois que Intel sort un nouveau processeur, toutes les instructions des processeurs précédents sont incluses. En fait, il n’y a généralement pas beaucoup de nouvelles instructions ajoutées. Ceci nous assure que les vieux programmes (ceux écrits pour de plus vieux microprocesseurs compatibles) peuvent parfaitement rouler (fonctionner) sur les nouveaux processeurs. Par contre, les nouveaux programmes, s’ils emploient les nouvelles fonctions plus performantes des nouveaux microprocesseurs, ne pourront pas fonctionner sur les microprocesseurs plus anciens. C’est ce qu’on appelle la compatibilité ascendante. Les nouveaux PC sont compatibles avec les anciens, mais pas le contraire. Les nouveaux Macintosh sont compatibles avec les anciens, mais pas le contraire. Les PC ne sont pas compatibles avec les Macintosh.
Le mode de fonctionnement des x86
Le 8086, 8088, 80186 et 80188 n’ont qu’un mode de fonctionnement, le mode réel :
1 Mo au maximum et ils sont monotâches. A partir du 80286 et surtout du 80386, il y a eu trois modes de fonctionnement. En voici le détail :
Le mode réel : mode par défaut du microprocesseur, celui dans lequel est le processeur au démarrage, et dans lequel s’exécute DOS. Il fournit les mêmes fonctionnalités que le 8086. Cela a plusieurs conséquences, dont l’une est qu’il n’est pas possible d’adresser plus que 1 Mo mémoire.
Le mode protégé : exploité par Windows à partir de la version 3.1. Il tire son nom de « protégé » de ses nombreuses fonctions de protection. Le terme protection signifie ici « protection contre les bugs ou les programmes malveillants ». Eh oui, en mode protégé, les programmes sont soumis à des règles très strictes, qui ne sont pas réellement astreignante pour des programmeurs normaux, mais qui sont terribles dès que le programme tente de sortir de l’espace qui lui est réservé. Pourquoi donc ? Le mode protégé à été conçu pour permettre l’existence de systèmes multitâches stables. Imaginons qu’une des tâches commette une « erreur de protection », le système d’exploitation la ferme, et le système de plante pas – du moins en théorie…
Par exemple, il est n’est pas possible à une tâche de faire des E/S sur certains ports, donc de modifier anarchiquement l’état du matériels, ce qui pourrait entraîner un plantage – seul le système d’exploitation est autorisé à le faire, mais il a pour mission de contrôler scrupuleusement le processus… (Et là, on voit que Windows 95 a été fait légèrement à la va-vite…). Il n’est pas non plus possible de lire des portions de mémoires réservés à d’autres programmes ou au système d’exploitation, question de confidentialité et de sécurité.
Ce qui est très appréciable, c’est que toutes les erreurs qui pourraient survenir déclenchent ce que l’on nomme une Exception, c’est à dire une interruption déclenchée par le processeur, interceptée par le système d’exploitation, qui prend les mesures nécessaires (fermer l’application en question). Conséquence immédiate : les plantages, c’est du passé !
Le mode virtuel est un mode qui permet à des programmes réalisés pour le 8086 de tourner sur un système multiutilisateur, comme s’il y avait plusieurs processeurs dans le même.
Organisation interne du microprocesseur
Maintenant que nous savons ce qu’est un microprocesseur, penchons-nous sur son organisation intérieure. En effet, un nombre très important de divers éléments est compris dans la puce de silicium que vous avez pu observer ci-dessus.
En fait, un microprocesseur x86 n’est pas uniquement un bloc de n millions de transistors, mais bien un assemblage intelligent et fortement optimisé de blocs de transistors nommés unités. Chaque unité est dédiée à une tâche précise. On peut les regrouper en trois parties principales. Il s’agit de :
l’UAL (Unité Arithmétique et Logique) ;
de l’Unité de commande ;
et du jeu de registres ;
L’unité arithmétique et logique est un élément particulièrement important au cœur du microprocesseur. L’unité arithmétique et logique est commandée par l’unité de commande. Son rôle et d’effectuer des opérations mathématiques de base, comme des additions, des soustractions, des multiplications ou des divisions. L’unité arithmétique et logique est également capable d’effectuer des opérations logiques, comme les fonctions NON, ET-Logique, OU-inclusif, OU-Exclusif, etc. Les éléments que l’UAL doit traiter proviennent du jeu de registres.
Le jeu de registre contient l’ensemble des registres du microprocesseur. On appelle registres des cellules mémoires qui sont logées non pas dans la mémoire RAM de l’ordinateur, mais directement sur le processeur lui même dans le but de recevoir des informations spécifiques, notamment des adresses et des données stockées durant l’exécution d’un programme. Il existe plusieurs types de registres, mais ils sont en nombre très limitée. Certains d’entre eux sont affectés à des opérations d’ordre général et sont accessibles au programmeur à tout moment. Nous disons alors qu’il s’agit de registres généraux. D’autres registres ont des rôles bien plus spécifiques et ne peuvent pas servir à un usage non spécialisé. Enfin, d’autres registres sont invisibles et par conséquent inaccessible au programmeur. Ces registres ne sont accessibles qu’au microprocesseur. Lorsque nous exécutons un programme.
Introduction
Assembleur, philosophieet atouts
Avantages et inconvénients de l’assembleur
Que programmer en Assembleur ?
Chapitre 1 : Notions de base
Les systèmes de numération
Décimale
Binaire
Octal
Hexadécimale
Les conversions entre bases numérales
Décimale Binaire
Binaire Décimale
Binaire Hexadécimale
Hexadécimale Binaire
Y’a t’ils des nombres négatifs en binaire ?
Opérations Arithmétiques
L’addition
La soustraction
Chapitre 2 : Organisation de l’Ordinateur
Un microprocesseur, en deux mots
Historique
Notations
Le mode de fonctionnement des x86
Organisation interne du microprocesseur
Registres généraux
Registres de segments
Registres d’offset
Registre de flag
Les registres MMX et SIMD
Les registres spécialisé.s
La pile
La mémoire
La pagination mémoire
Organisation de la mémoire
Chapitre 3 : Instruction du microprocesseur
Anatomie d’un programme en assembleur
Structure des instructions
Étiquette
Mnémonique
Opérandes
Ecrire des commentaires dans le programme
Lisibilité et présentation
Notes et abréviations
Opérandes
Liste des instructions par fonctionnalités
Instructions de déplacement et d’affectation
Instructions logiques et arithmétiques
Instructions de manipulation de bits
Instructions de décalage
Instructions de traitement
Instructions de contrôle et de test
Saut inconditionnel
Saut conditionnel
Chapitre 4 : Les outils nécessaires au programmeur
Installation de Masm
Configuration de RadAsm
Créer son premier projet
Présentation rapide de l’interface
Squelette d’un programme en Assembleur
Chapitre 5 : L’environnement Windows
Chapitre 6 : Structure de données
Les variables et les constantes
Portée des variables
Directive ALIGN
Directive d’égalité (=)
L’opérateur PTR
L’opérateur TYPE
Les tableaux
L’opérateur LENGTHOF
Les structures
Les unions
Les pointeurs
Les opérateurs ADDR & OFFSET
Les crochets
Chapitre 7 : Principe de base de la programmation Windows
Communication par le biais de message
Programmation événementielle
La notion d’indépendance vis-à-vis des périphériques
Stockage des informations des programmes sous forme de ressources
Des types de données étranges
Convention spéciale de nommage
La programmation Windows en pratique
Chapitre 8 : Une simple fenêtre
La classe de fenêtre
Création d’une fenêtre
Les Tests
La directive conditionnelle .IF