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 !$'
- msg est le nom du texte qui sera utilisé pour passer l'adresse à dx
- db nous permet de préciser que les donnés à suivre sont de type byte (octet dans la langue des Sex Pistols)
- 'coucou !$' notre texte entre deux quotes pour éviter qu'il interprète la valeur ASCII d'un caractère comme une instruction
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 !