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.