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 :
- Assemblage :
masm source.asm;génère le fichier objet. - Liaison :
link source.obj;produit l'exécutable final .exe. - 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 21hafin 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,
41hcorrespond à 'A'. - Octet d'attribut (Offset impair) : Définit le style visuel. Le format binaire est généralement
IRGBpour le fond etIRGBpour 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.