Hello World console assembleur x86


Pour concevoir un petit “Hello World” en invite de commandes en assembleur x86, on peut utiliser le couple NASM-GoLink

  • nasm pour compiler
  • golink pour lier

Il faut donc d’une manière ou d’une autre trouver sur la Toile Électronique Géante et télécharger les fichiers nasm.exe et golink.exe, et les installer sur le disque dur.

Pour afficher Hello sur la console i.e. sous invite de commandes, on peut utiliser le code assembleur suivant. Il suffit de faire un copier-coller de ce programme dans le petit Notepad et de le sauvegarder avec l’extension .asm (hello.asm) dans un répertoire préalablement créé à cet effet e.g. asm1.

bits 32
extern GetStdHandle
extern WriteConsoleA
extern ExitProcess

STD_OUTPUT_HANDLE equ -11

section .data
    msg     db "Hello", 13, 10
    msglen  equ $ - msg
    written dd 0

section .text
global start

start:
    push    STD_OUTPUT_HANDLE
    call    GetStdHandle

    push    0
    push    written
    push    msglen
    push    msg
    push    eax
    call    WriteConsoleA

    push    0
    call    ExitProcess

On se rend maintenant sous invite de commandes dans le répertoire asm1, ce qui se fait par la commande cd (change directory).

cd C:\chemin\vers\asm1

Si certains noms intermédiaires comportent des espaces, le chemin doit alors être écrit entre guillemets, ce qui donne quelque chose de ce genre.

cd "C:\chemin vers\asm1"

On est maintenant dans le répertoire asm1 où se trouve le fichier hello.asm, ce qu’on peut vérifier par la commande dir qui affiche le contenu du dossier courant. Pour compiler le programme hello.asm, on entre ceci sous invite de commandes dans ce répertoire de travail asm1

C:\chemin\vers\nasm -f win32 hello.asm 

étant supposé que nasm.exe se situe dans le répertoire

C:\chemin\vers

ce qui a pour effet de créer le fichier hello.obj, ce qu’on peut vérifier par la commande dir.

Pour lier ce fichier .obj, on écrit ceci, toujours dans ce répertoire de travail asm1

C:\chemin\vers\golink /entry:start /console hello.obj kernel32.dll

ce qui va créer l’exécutable hello.exe qui affichera Hello en mode console. Pour exécuter hello.exe, on entre simplement hello c’est-à-dire le nom de l’exécutable sans son extension .exe, ce qui va donner ceci.

C:\chemin\vers\asm1>hello
Hello

C:\chemin\vers\asm1>
Autre exemple de programme en assembleur x86

Pour écrire bonjour dans un fichier texte, on peut utiliser le code assembleur suivant. Appelez par exemple ce fichier bonjour.asm et placez-le dans un autre répertoire e.g. asm2 que vous aurez préalablement créé sous Windows pour le distinguer du premier.

BITS 32
GLOBAL start

EXTERN  CreateFileA
EXTERN  WriteFile
EXTERN  CloseHandle
EXTERN  ExitProcess

%define GENERIC_WRITE        0x40000000
%define CREATE_ALWAYS        2
%define FILE_ATTRIBUTE_NORMAL 0x80
%define INVALID_HANDLE_VALUE 0xFFFFFFFF

SECTION .data
    filename    db "texte.txt",0
    msg         db "bonjour",13,10
    msg_len     equ $ - msg
    written     dd 0
    hFile       dd 0

SECTION .text
start:
    push dword 0                    
    push dword FILE_ATTRIBUTE_NORMAL 
    push dword CREATE_ALWAYS         
    push dword 0                    
    push dword 0                    
    push dword GENERIC_WRITE        
    push dword filename              
    call CreateFileA

    mov [hFile], eax
    cmp eax, INVALID_HANDLE_VALUE
    je  .quit

    push dword 0
    push dword written
    push dword msg_len
    push dword msg
    push dword [hFile]
    call WriteFile

    push dword [hFile]
    call CloseHandle

.quit:
    push dword 0
    call ExitProcess

Compilez et liez dans ce nouveau répertoire de travail asm2 en remplaçant hello par bonjour des commandes précédentes, ce qui donne ceci.

C:\chemin\vers\nasm -f win32 bonjour.asm 
C:\chemin\vers\golink /entry:start /console bonjour.obj kernel32.dll

Puis exécutez le .exe en entrant bonjour, toujours sous invite de commandes, dans le répertoire où a été réalisé ce développement, en l’occurrence

C:\chemin\vers\asm2 

dans notre exemple. Le fichier texte.txt a été créé, il contient le mot bonjour, ce qui peut se vérifier en utilisant la commande type, ce qui donne ceci.

C:\chemin\vers\asm2>type texte.txt
bonjour

C:\chemin\vers\asm2>

Notez que le petit Notepad enregistre le fichier, en l’absence d’extension exprimée, avec l’extension .txt qui est celle par défaut de cet utilitaire, mais crée le fichier avec extension si celle-ci est précisée au moment de sa sauvegarde, ce qui explique la possibilité d’avoir eu immédiatement hello.asm et bonjour.asm précédemment. Si vous ne le sauvegardez sous Notepad que sous le nom simple hello, vous obtiendrez hello.txt. Il faudrait alors modifier son extension, et donc le renommer par la commande ren sous invite de commandes, ce qui donnerait ceci.

ren hello.txt hello.asm

Car le compilateur nasm ne prend en charge qu’un fichier texte d’extension .asm (assembleur). Pour éviter ces détours, on enregistre directement sous Notepad le programme assembleur avec son extension .asm pour qu’il puisse être ensuite traité par le compilateur nasm.exe.


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *