<-Précédent | Retour à l'accueil | Contact : etienne"point"sauvage"at"gmail.com | Suivant-> |
Depuis la création du secteur d'amorçage au chapitre précédent, je ne veux pas dire qu'on n'a plus rien, mais peu s'en faut. Les routines sont un peu bringuebalantes, tout ça. Cela nécessite une petite remise à niveau.
Il faut avouer ce qui est : il devient rude de retrouver quoi que ce soit dans le code. NASM permet de s'y retrouver un peu mieux en séparant le code en plusieurs fichiers. La directive %include "[nom du fichier]" permet d'insérer à cet endroit le contenu du fichier spécifié.
Les routines d'affichage de texte ont été déportées dans un fichier "affichageTexte.asm". Il y a deux fonctions : une fonction qui affiche une chaîne de caractères à l'écran "affiche_chaine", et une fonction qui transforme un nombre en chaîne de caractères "nombre_vers_chaine". Il faut garder à l'esprit que ces fonctions ont vocation à disparaître, puisqu'elles fonctionnent en mode texte, qui disparaît rapidement. Elles sont reprises du chapitre 3, clarifiées, déboguées et ainsi de suite.
Cette fonction affiche la chaîne de caractères pointée par si et se terminant par le caractère 0, aussi appelé caractère nul, de valeur numérique 0. Elle suppose que l'écran mesure 80 caractères de large sur 25 de haut. En cas de débordement, elle efface la page et continue son écriture en haut. Elle ne connaît que deux caractères non affichables : le 0 et le 13, respectivement marqueur de fin de chaîne et retour à la ligne.
;Affiche à l'écran une chaîne de caractères
affiche_chaine:
push ax
push bx
push cx
push dx
xor bh, bh; RAZ de bh, qui stocke la page d'affichage
mov ah, 0x03
int 0x10; appel de l'interruption BIOS qui donne la position du curseur, stockée dans dx
mov cx, 1; nombre de fois où l'on va afficher un caractère
affiche_suivant:
lodsb
or al, al;on compare al à zéro pour s'arrêter
jz fin_affiche_suivant
cmp al, 13
je nouvelle_ligne
mov ah, 0x0A;on affiche le caractère courant cx fois
int 0x10
inc dl; on passe à la colonne suivante pour la position du curseur
cmp dl, 80
jne positionne_curseur
nouvelle_ligne:
inc dh; on passe à la ligne suivante
xor dl, dl; colonne 0
cmp dh, 25
jb positionne_curseur
xor dh, dh
mov ah, 0x02;on positionne le curseur
int 0x10
mov cx, 25*80
mov ah, 0x0A;on affiche le caractère courant cx fois
mov al, ' '
int 0x10
mov cx, 1
positionne_curseur:
mov ah, 0x02;on positionne le curseur
int 0x10
jmp affiche_suivant
fin_affiche_suivant:
pop dx
pop cx
pop bx
pop ax
ret
Cette fonction écrit dans la chaîne pointée par di le nombre contenu dans ax.
;écrit dans la chaîne pointée par DI le nombre contenu dans AX
;si CL est à un, on écrit un caractère terminal
;CH contient le nombre minimal de caractères à utiliser
;BL contient la base
nombre_vers_chaine:
push bx
push dx
push cx
xor bh, bh
mov cl, 1
stocke_digit:
xor dx, dx
div bx
push dx ;sauve le reste dans la pile
inc cl
or ax, ax
jne stocke_digit
;Les digits sont stockés dans la pile
inc bh ;
ajout_zero:
cmp ch, cl
jb clearCH
push ' '-'A'+10
inc cl
jmp ajout_zero
clearCH:
xor ch, ch
;Affichage du chiffre
boucle_digit:
dec bh
loop affiche_digit
pop cx ; on récupère le paramètre bx
test cl, 0b1 ; s'il est à 1, on écrit un caractère terminal
jz depile
mov byte [di], 0
depile:
pop dx
pop bx
ret
affiche_digit:
pop ax
cmp ax, 10
jae dixPlus
add ax, '0'
stosb ; met AL dans l'octet pointé par DI et incrémente DI
jmp boucle_digit
dixPlus:
add ax, 'A' - 10
stosb
jmp boucle_digit
;fin nombre_vers_chaine
Pour faire une sorte de séance de révision, nous allons retravailler les graphiques du chapitre 5. Reprenons tout le déroulement du programme :