Développement en Assembleur x86 : Cycle de Compilation et Manipulation de la Mémoire Vidéo

Phase 1 : Cycle de Développement et Interruption DOS

Le processus de création d'un programme en assembleur repose sur quatre étapes clés : l'édition du code source (.asm), l'assemblage (.obj), le liage (.exe) et enfin l'exécution ou le débogage. Dans cet exemple, nous allons afficher des caractères numériques en utilisant l'interruption logicielle INT 21h de DOS.

assume cs:code_seg

code_seg segment
    ; Affichage du premier chiffre
    mov ah, 02h      ; Fonction DOS : Sortie de caractère
    mov dl, 5        ; Valeur numérique
    add dl, 30h      ; Conversion en code ASCII ('5')
    int 21h          ; Appel système
    
    ; Affichage du second chiffre
    mov ah, 02h
    mov dl, 8        ; Valeur numérique
    add dl, 30h      ; Conversion en code ASCII ('8')
    int 21h
    
    ; Terminaison du programme
    mov ax, 4C00h
    int 21h
code_seg ends

end

Pour transformer ce code en exécutable sous un environnement DOS (ou DOSBox), les commaneds suivantes sont utilisées :

  1. Assemblage : masm source.asm; génère le fichier objet.
  2. Liaison : link source.obj; produit l'exécutable final .exe.
  3. Exécution : Lancement direct du fichier .exe pour observer la sortie "58".

Lors de l'utilisation de l'utilitaire DEBUG, il est crucial de distinguer les commandes de traçage :

  • T (Trace) : Entre à l'intérieur des sous-routines ou des interruptions.
  • P (Proceed) : Exécute l'instruction ou l'interruption comme un bloc unique, ce qui est nécessaire pour INT 21h afin d'afficher correctement les résultats à l'écran sans se perdre dans le code interne de DOS.

Note technique : Au chargement, le segment de code (CS) est généralement situé à DS+10H. Les 256 premiers octets (100H) constituent le PSP (Program Segment Prefix), utilisé par DOS pour la gestion du processus.

Phase 2 : Accès Direct à la Mémoire Vidéo (VRAM)

L'affichage peut également se faire sans passer par les interruptions DOS, en écrivant directement dans la mémoire tampon vidéo. En mode texte standard, la mémoire vidéo commence à l'adresse segmentée B800:0000. Chaque caractère affiché occupe deux octets : l'octet de poids faible pour le code ASCII et l'octet de poids fort pour l'attribut (couleur de texte et de fond).

assume cs:logic_seg

logic_seg segment
    ; Initialisation du segment de données vers la mémoire vidéo
    mov ax, 0B800h
    mov ds, ax
    
    ; Ecriture d'un caractère 'A' en vert sur fond noir (02h)
    mov bx, 0
    mov word ptr [bx], 0241h 
    
    ; Déplacement vers la colonne suivante (2 octets plus loin)
    add bx, 2
    ; Ecriture d'un caractère 'B' en rouge sur fond noir (04h)
    mov word ptr [bx], 0442h
    
    ; Retour au système
    mov ax, 4C00h
    int 21h
logic_seg ends

end

L'analyse des valeurs hexadécimales envoyées à la mémoire [bx] révèle la structure suivante :

  • Octet de données (Offset pair) : Représente le glyphe ASCII. Par exemple, 41h correspond à 'A'.
  • Octet d'attribut (Offset impair) : Définit le style visuel. Le format binaire est généralement IRGB pour le fond et IRGB pour le texte.

En modifiant les valeurs dans le code, comme passer de 0241h à 0E41h, on change la couleur du 'A' du vert vers le jaune brillant. Cette méthode est nettement plus rapide que les appels système DOS car elle interagit directement avec le matériel d'affichage.

Étiquettes: x86-assembly DOS MASM Low-Level VRAM

Publié le 3 août à 19h51