codefordumm!ies: the cool logo

J'apprends la programmation avec l'assembleur x86, partie 2

Après avoir écrit un incroyable programme qui ne fait rien (voir la partie 1), nous allons maintenant afficher du texte dans notre console MS-DOS.

Ça l'affiche mal...

Pour effectue cette prouesse technique, nous allons toujours utiliser une interruption du MS-DOS, mais cette fois-ci on utilise le service 0x09 qui permet d'afficher un text dont l'adresse est dans le registre dx.

L'adresse est dans le registre dx ? Mais quezaco ce charabia ?

Bin c'est assez simple : l'adresse correspond à l'endroit dans la mémoire de notre ordinateur où se trouve une donnée.

Données, c'est données...

Ainsi, notre chaine de caractères va être définie dans la partie données de notre programme, qui commence par :

section .data

Sous MS-DOS, un texte est constitué de caractères dont la valeur se situe entre 0 et 255, soit un octet de mémoire.

Les valeurs des caractères correspondent à ce que l'on appelle la table ASCII mise au point, selon certaines sources, par Jean-Michel Notic. Les spécialistes parlent ainsi de l'ASCII Notic.

Dans la table ASCII, le caractère A a ainsi la valeur 65 ou 0x41, B est 66 ou 0x42, etc...

On n'a cependant pas besoin de connaitre ces valeurs, si on écrit un caractère entre deux quotes, 'A' par exemple, l'assembleur va l'interpréter tout seul commme étant la valeur 65.

Petite subtilié de l'interruption MS-DOS : il faut que notre texte se termine par le caractère '$'.
Si on oublie ce petit détail, le programme écrira des caractères jusqu'à ce qu'il tombe en mémoire sur un '$' ou qu'il dépasse la capacité mémoire de la machine. Autant dire que c'est un beau bug !

Dans notre programme on va écrire :

msg db 'coucou !$'

Et pour que le registre dx reçoive l'adresse de msg, on écrira :

mov dx, msg

Le code source de coucou.asm

; ======
; coucou
; ======
;
; C:\nasm -fbin coucou.asm -o coucou.com

org 0x100

global main

section .text

main:
    mov ah, 0x09        ; fonction 0x09 : écrire un texte
    mov dx, msg         ; adresse du message à écrire
    int 0x21

    mov ax, 0x4c00      ; on quitte le programme sans erreur
    int 0x21

section .data           ; partie du programme réservé aux données

msg db 'coucou !$'      ; notre message suivi du $ de fin 

On compile :

C:\nasm -fbin coucou.asm -o coucou.com

On exécute :

C:\coucou

Et voici le résultat :

coucou !
C:\_

Pour m'entrainer

Essayez d'afficher le même message mais seulement à partir de la deuxième lettre, mais sans modifier le texte :

oucou !
C:\_

TIPS : je peux additionner ou soustraire des valeurs aux adresses

Solution

Et après...

Dans la partie 3, on va afficher l'alphabet comme un vrai programmeur !