Zero One Cyber

Contenu du cours
Tutoriel Assembleur – Chapitre 1 : Les bases indispensables pour débuter
Dans ce premier chapitre, tu découvriras les fondamentaux du langage Assembleur afin de comprendre comment un programme interagit directement avec le processeur et la mémoire. Tu apprendras : ce qu’est réellement l’Assembleur et à quoi il sert le rôle du processeur, des registres et de la mémoire la structure d’un programme assembleur les instructions de base et leur fonctionnement le flux d’exécution d’un programme les notions essentielles pour lire et comprendre du code assembleur simple Ce chapitre pose les bases indispensables pour aborder la programmation bas niveau, le reverse engineering et l’analyse de binaires dans la suite du cours. Aucun prérequis avancé n’est nécessaire : tout est expliqué pas à pas, avec une approche claire et accessible.
0/13
Programmation bas niveau : maîtriser l’Assembleur

 

Comprendre le format PCX

 

Dans le chapitre précédent, nous avons travaillé avec des images au format RAW, c’est-à-dire des données binaires non compressées. Il est maintenant utile de s’intéresser aux formats d’images compressés, qui permettent de réduire considérablement la taille des fichiers. Il existe de nombreux formats, chacun avec ses avantages et ses limites. Parmi les plus simples à appréhender, on trouve le format PCX.

 

Le format PCX a été conçu par ZSOFT dans le but principal d’alléger la taille des images. Il repose sur un algorithme de compression appelé RLE, pour Run Length Encoding. Le principe est simple : lorsqu’une suite de pixels identiques apparaît, elle est remplacée par une information indiquant le nombre de répétitions ainsi que la couleur du pixel. Selon la complexité de l’image, cette méthode peut réduire la taille du fichier jusqu’à 90 %.

 

Structure de l’en-tête PCX

 

Un fichier PCX commence par un en-tête, aussi appelé header. Cette zone contient toutes les informations nécessaires pour décrire l’image, comme ses dimensions, le nombre de couleurs ou encore les paramètres de la palette. ZSOFT a défini plusieurs variantes du format PCX. Le format le plus courant pour les images en 256 couleurs est le format 5, tandis que les formats en 16 couleurs ou en noir et blanc sont aujourd’hui largement dépassés.

 

Cet en-tête occupe exactement 128 octets au début du fichier. Il précise notamment les coordonnées minimales et maximales de l’image, ce qui permet de calculer sa largeur et sa hauteur, la résolution horizontale et verticale, le nombre de plans de couleur ainsi que diverses informations liées à la palette et à l’affichage.

 

Dans un programme capable d’afficher des images de tailles variables, le header est indispensable. En revanche, dans nos exemples en assembleur, nous savons déjà que l’écran est en mode 320×200 et que l’image utilise 256 couleurs. Dans ce contexte précis, l’en-tête peut être ignoré sans conséquence, ce qui simplifie le traitement.

 

Données compressées et gestion de la palette

 

Une fois les 128 premiers octets du fichier ignorés, on arrive à la zone contenant les données compressées de l’image. La lecture se fait octet par octet. Si la valeur lue est inférieure ou égale à 0C0h, l’octet correspond directement à un pixel non compressé et peut être affiché tel quel à l’écran.

 

Si, au contraire, la valeur est supérieure à 0C0h, cela signifie qu’il s’agit d’une séquence compressée. En soustrayant 0C0h à cette valeur, on obtient le nombre de répétitions. L’octet suivant indique la couleur à répéter. Il suffit alors d’écrire cette couleur autant de fois que nécessaire dans la mémoire vidéo. Ce mécanisme est répété jusqu’à ce que l’ensemble de l’image, soit 64000 pixels pour un écran 320×200, soit entièrement reconstruit.

 

Avant d’afficher l’image, il est fortement conseillé de configurer correctement la palette. Les informations de palette se trouvent à la fin du fichier, exactement 768 octets avant la fin. Chaque couleur est définie par trois composantes, rouge, vert et bleu, codées sur 8 bits. La carte VGA, cependant, ne gère que des valeurs sur 6 bits. Il est donc nécessaire de diviser chaque composante par quatre afin de les adapter au matériel.

 

Lecture et affichage en assembleur A86

 

L’exemple complet se trouve dans l’archive PCXEX.zip. Le programme présenté ici suppose que l’image PCX a déjà été convertie en données assembleur à l’aide de directives DB ou DW. Il se limite à l’affichage d’images en 320×200 avec une palette de 256 couleurs.

 

Le code initialise le mode vidéo, configure la palette à partir des données PCX, puis décompresse et affiche l’image pixel par pixel en mémoire vidéo. Les parties déjà étudiées précédemment sont volontairement moins détaillées afin de se concentrer sur le fonctionnement spécifique du format PCX.

 

Les routines SET_COLOR et GET_COLOR permettent respectivement d’écrire et de lire une couleur dans la palette VGA, tandis que la boucle principale gère la décompression RLE et l’affichage à l’écran.

 

Ajout d’un effet de fade-out

 

L’effet de fade-out est un classique en programmation graphique. Il donne l’impression que l’image s’assombrit progressivement jusqu’à disparaître complètement dans le noir. Cet effet est relativement simple à mettre en œuvre et peut être réalisé de différentes manières.

 

La méthode présentée ici consiste à modifier progressivement la palette. Pour chaque couleur, on examine les composantes rouge, verte et bleue. Si l’une d’elles est déjà à zéro, elle reste inchangée. Sinon, sa valeur est décrémentée d’une unité. En répétant cette opération image après image, l’ensemble des couleurs s’assombrit progressivement.

 

Comme la valeur maximale d’une composante est 63, il suffit de parcourir la palette 63 fois pour obtenir un écran totalement noir. Une synchronisation avec le balayage de l’écran est ajoutée afin de ralentir l’effet et d’obtenir une animation fluide.

 

Implémentation du fade-out en A86

 

La routine de fade-out s’intègre à la fin du programme principal, juste avant le retour au mode texte et au système DOS. Elle repose sur les procédures GET_COLOR et SET_COLOR pour lire et écrire les valeurs de la palette, ainsi que sur une routine de synchronisation permettant d’attendre le retour du faisceau cathodique.

 

Cette approche permet de créer un effet visuel propre et progressif, sans stocker de copies supplémentaires de la palette en mémoire, tout en réutilisant les mécanismes déjà mis en place dans les chapitres précédents.