Chose promis chose due, on va voir comment afficher des couleurs et faire
des asciis en assembleur. Comme ça vous pourrez faire le branleur
auprès de vos potes.
Je vais me répéter mais bon, un prog est divisé en
plusieurs parties :
- la partie data qui contient toutes les constantes et déclaration
de variables.
- La partie code qui contient... le code (en lecture seule)
- La pile (stack) en lecture/écriture qui sert à passer
des arguments aux fonctions...
Bon en général, un prog commence par un prologue et fini
par un épilogue qui servent en gros à déclarer un
nouvel environnement (avec des variables locales) et puis à restituer
l'ancien environnement avant de quitter.
Mais apparement on en a juste besoin dans les fonctions car au lancement
du prog ca ne change rien. Mais plutôt que je sorte du sujet principal
(comme d'hab) je vous conseil de lire n'importe quel texte sur les BoF
(buffers overflows).
Autant que je sache il n'existe qu'un seul livre sur l'assembleur en Français
: L'assembleur facile aux éditions Marabout par Philipe Mercier.
je vais donc citer quelques passages de ce livre.
"Un ordinateur est bien entendu équipé de toutes sortes de périphériques dont les plus importants : le clavier, l'écran, les disques, l'imprimante, etc. Pour accéder à ces périphériques, nous pouvons demander l'aide de MS-DOS : à chaque périphérique correspond une fonction portant le numéro à laquelle le programme doit transmettre des paramètres, spécifiant le type de "service souhaité". Ceci ce fait par l'intermédiaire des registres.L'opération sera alors exécutée par MS-DOS et dans certains cas, des paramètres seront renvoyés également par l'intermédiaire des registres. Ces fonctions sont appelées interruptions."
Donc pour appeler une interruption, il nous suffit de mettre certaines
valeurs dans certains registres puis de lancer l'appel. Une interrution
propose plusieurs services. En général le service est mis
dans AH et les autres paramètres dans les registres BX, CX, DX...
L'appel se fait par l'instruction INT.
Petit exemple qui affiche un texte donnée à un endroit donné
:
[section .data]
mesg db 'Essai de positionnement',13,10,'$'
; Déclaration d'une chaine de caractères
qui finit par l'éternel CR/LF puis un '$' (syntaxe nasm)
[section .text]
org 100h ; défini l'EntryPoint du prog, toujours
à 100h (hexa) pour les fichiers com
push ax ; on sauvegarde les registres car on va
s'en servir (prologue)
push bx
push cx
push dx
;----------Début de la partie de l'effacement
de l'écran
mov al,0 ; on met al à 0 car ax (16 bits)
= ah (8 bits) et al (8 bits)
mov ah,6 ; service 06h
mov bh,7 ; couleur par défaut
des caractères
mov cx,0 ; effacement à parir du coin haut-gauche
mov dh,24 ; l'écran dos fait 25 lignes (ligne
0 -> ligne 24)
mov dl,79 ; et 80 colonnes
int 0x10 ; interruption 10h
;----------Fin de la partie de l'effacement de l'écran
;----------Début du positionnement du curseur
mov ah,12 ; on se place à la ligne 12
mov al,30 ; on se place à la colonne 30
mov dx,ax ; al et ah forment ax. Ces coordonnées
sont ensuite placées en dx
mov ah,2 ; fonction 2h
mov bh,0 ; page 0
int 0x10 ; interruption 10h
;----------Fin positionnement cuseur
;----------et enfin on affiche le message
mov dx, mesg ; on met l'adresse du message en dx
mov ah,9 ; service 9h
int 0x21 ; interruption 21h
;----------fin affichage message
pop dx ; épilogue
pop cx
pop bx
pop ax
ret
L'interruption 10 correspond au service video du bios et la 21 aux entrées/sorties
(clavier, écran, imprimante...)
Pour compiler sous nasm vous faites nasmw -f bin -o prog.com prog.asm
prog.asm étant la source du prog. Moi j'ai nasmw, c la version
qui roule sous windows. Les Nasm est totalement gratuit ;-)
C'est bien beau tout ça mais nous on veux de la couleur, parce
que ça on peut le faire avec n'importe quel language de programmation
qui compile sous windows. Il existe une autre fonction qui permet d'afficher
un message, plus évolué et qui appartient à l'interruption
10 (video comme vue plus haut) mais service 13h qui correspond à
"write string".
Au fil de mes errances sur le web, je suis tombé sur une doc sur
les interruptions et voici un petit truc sur cette fonction :
:int 10,13
^INT 10,13 - Write String (BIOS versions from 1/10/86)
AH = 13h
AL = write mode (see bit settings below)
= 0 string is chars only, attribute in BL, cursor not moved
= 1 string is chard only, attribute in BL, cursor moved
= 2 string contains chars and attributes, cursor not moved
= 3 string contains chars and attributes, cursor moved
BH = video page number
BL = attribute if mode 0 or 1 (AL bit 1=0)
CX = length of string (ignoring attributes)
DH = row coordinate
DL = column coordinate
ES:BP = pointer to string
Ce qui est très puissant dans cette fonction c'est le cursor moved
qui fait avancer le prog jusqu'au caractère suivant pour l'afficher.
Mais j'ai du mal à voir ce que font les fonctions sans le moved.
Ce qui nous interesse, c'est les attributs qui permettent de spécifier
la couleur du caractère. On va se restreindre aux fonctions avec
AL=1 et AL=3.
Fonction 1 : l'attribut est dans BL ce qui veut dire que la couleur est
la même pour toute la chaine.
Fonction 2 : la chaine contient tour à tour caractères puis
attributs donc chaque caractères à sa couleur perso ;-)
On met la video page à 0 (mov bh,0), les coordonnées en
dh,dl et la longueur de chaine en cx. L'adresse de la chaine est placée
en bp.
Pour ce qui est des attributs, on les écrits en hexa (on met 0x
avant le chiffre). Je vous ai fait un super tableau avec couleur de caractère/couleur
de fond. Par exemple la colonne 1X et la ligne XF donne le code couleur
1F : caractère blanc sur fond foncé.
mov ah,13h ; service 13
mov al,1 ; couleur pour la string entière
mov bh,0 ; page 0
mov bl,0x1F ; la couleur
mov cx,14 ; on écrit 14 caractères
mov dh,4 ; 5ème ligne
mov dl,2 ; 3ème colonne
push cs
pop es
mov bp,string ; adresse de la chaine
int 10h ; interruption 10
Pour l'autre mode c'est simple, on définit la chaine par "un caractère, sa couleur..." Vous trouverez l'exemple dans le fichier color.asm qui correspond au prog qui était avec lotfree#03.