Initiation à l'assembleur x64 sous Windows

par | 2 Avr 2015

Tout d’abord, si vous n’avez pas d’assembleur 64 bits, je vous propose d’utiliser NASM (ML64.EXE) livré gratuitement avec Windows Software Development Kit (SDK) .

Ensuite je vous propose de tester ce petit programme, sorte d’hello world :

; Sample x64 Assembly Program
; Chris Lomont 2009 www.lomont.org
extrn ExitProcess: PROC ; external functions in system libraries
extrn MessageBoxA: PROC
.data
caption db '64-bit hello!', 0
message db 'Hello World!', 0
.code
Start PROC
 sub rsp,28h ; shadow space, aligns stack
 mov rcx, 0 ; hWnd = HWND_DESKTOP
 lea rdx, message ; LPCSTR lpText
 lea r8, caption ; LPCSTR lpCaption
 mov r9d, 0 ; uType = MB_OK
 call MessageBoxA ; call MessageBox API function
 mov ecx, eax ; uExitCode = MessageBox(...)
 call ExitProcess
Start ENDP
End

2 fonctions externes relatives à l’API Windows sont référencées: ExitProcess et MessageBoxA. La première permet de terminer le programme proprement, et la seconde d’afficher une boite de dialogue avec un message.
Pour lancer la compilation et le linkage:

ml64 hello.asm /link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib /entry:Start

Voici les paramètres pour exécuter ML64 en ligne de commande. Si le linkage ne fonctionne pas, recherchez sur votre ordinateur kernel32.lib et user32.lib et copiez les dans le répertoire de votre fichier ASM.

Capture d'écran 2015-03-17 22.02.25Si vous avez du mal avec l’install et les librairies, je vous ai tout mis dans cette archive zip (47Ko).

 Ce qui est intéressant dans ce programme, c’est qu’on ne fait pas appel à des macros externes pour s’adresser directement aux fonctions de l’API. On ne pousse pas non plus les paramètres dans la pile, non… directement, on met les paramètres dans les bons registres. Encore faut-il les connaitre ?

En fait, il s’agit d’une convention d’appel:
Capture d'écran 2015-04-02 08.28.33Ainsi, si nous reprenons la fonction MessageBoxA:

int WINAPI MessageBox(
  _In_opt_  HWND hWnd,
  _In_opt_  LPCTSTR lpText,
  _In_opt_  LPCTSTR lpCaption,
  _In_      UINT uType
);

Elle prend 4 paramètres en entrée: Hwnd (dans rcx), lpText (dans rdx), lpCaption (dans r8) et uType (dans r9).

Voilà, si vous voulez utiliser l’assembleur dans vos programme C, je vous conseille cet article d’intel. Si cela vous intéresse, faites moi signe, je ferai d’autres articles sur l’assembleurx64 et notamment sur l’utilisation des fonctions accélératrices des processeurs modernes pour le calcul parallèle (SIMD) dans les moteurs 3D par exemple.

 
 

Découvrez nos derniers numéros !

0 commentaires

Laisser un commentaire

Ces articles pourraient aussi vous intéresser …