Initiation à l’assembleur x64 sous Windows

Tout d’abord, si vous n’avez pas d’assembleur 64 bits, je vous pro­pose d’utiliser NASM (ML64.EXE) livré gra­tu­ite­ment avec Win­dows Soft­ware Devel­op­ment Kit (SDK) .

Ensuite je vous pro­pose de tester ce petit pro­gramme, 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 fonc­tions externes rel­a­tives à l’API Win­dows sont référencées: Exit­Process et Mes­sage­BoxA. La pre­mière per­met de ter­min­er le pro­gramme pro­pre­ment, et la sec­onde d’afficher une boite de dia­logue avec un mes­sage.

Pour lancer la com­pi­la­tion et le link­age:

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 com­mande. Si le link­age ne fonc­tionne pas, recherchez sur votre ordi­na­teur kernel32.lib et user32.lib et copiez les dans le réper­toire de votre fichi­er 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éres­sant dans ce pro­gramme, c’est qu’on ne fait pas appel à des macros externes pour s’adresser directe­ment aux fonc­tions de l’API. On ne pousse pas non plus les paramètres dans la pile, non… directe­ment, on met les paramètres dans les bons reg­istres. Encore faut-il les con­naitre ?

En fait, il s’agit d’une con­ven­tion d’appel:

Capture d'écran 2015-04-02 08.28.33Ain­si, si nous reprenons la fonc­tion Mes­sage­BoxA:

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), lpCap­tion (dans r8) et uType (dans r9).

Voilà, si vous voulez utilis­er l’assembleur dans vos pro­gramme C, je vous con­seille cet arti­cle d’intel. Si cela vous intéresse, faites moi signe, je ferai d’autres arti­cles sur l’assembleurx64 et notam­ment sur l’utilisation des fonc­tions accéléra­tri­ces des processeurs mod­ernes pour le cal­cul par­al­lèle (SIMD) dans les moteurs 3D par exem­ple.

 

 

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.