Invoke comme dans Masm pour Yasm & Nasm :)

Oui je sais, le titre va en faire fuir plus d’un, d’autres vont encore me dire que j’ai définitivement sombré… Mais regardez ma belle macro :

%macro invoke 2-*
  extern %1
  %rotate %0-1
  %rep  %0-1
    push    %1
    %rotate -1
  %endrep
  %rotate %0
  call	%1
%endmacro

Traduisons; M/Y/Nasm sont tous les 3 des assembleurs x86. M pour Microsoft, Y pour ?? je ne sais pas et N pour Netwide. Ces derniers temps je me suis remis à l’assembleur et j’ai jeté mon dévolus sur Yasm (dispo sur Cygwin). C’est un rewrite de Nasm sous licence BSD. Ce dernier comprend la syntaxe de Nasm, Gas (le Gnu Assembleur) et même un peu de Tasm (Feu l’assembleur de Borland ou j’ai passé du bon temps). Le soucis c’est que j’ai aussi de vagues relents de Masm appris dans ma  folle jeunesse et ce dernier est fort utile pour Windows. Masm dispose de la commande Invoke et il connait toutes les librairies Microsoft, cela permet de rapidement et clairement faire un call à une librairie quelquonque. Si on ne dispose pas d’Invoke, pour appeler une api windows il suffit de poser sur la pile les arguments en sens inverse à la documentation. Je m’explique, par exemple pour un simple popup sous Windows la documentation Microsoft dit :

http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

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

Sans Invoke dans Yasm, pour faire un programme qui popup et quitte c’est comme cela :

global _start ; Addresse de départ

extern ExitProcess, MessageBoxA ; Déclaration des Externals calls 

section .data
	boxtitle db "Box Title",0
	boxtext db "Hello World", 0 
section .code
_start:
	push	0			; Type O, okbox
	push 	boxtitle	; Caption
	push 	boxtext 	; Title
	push 	0			; Handle Optionnal
	call 	MessageBoxA	; Appel API
	push 	0			; Error Code
	call 	ExitProcess	; Appel API

Sous Masm (M pour Microsoft) il y a une convention d’appel bien sympa, qui remet les paramètres dans le bon sens et qui clarifie le code, le fameux Invoke Et bien sur en contrepartie il y a un tombereau d’includes et de fichiers à se trainer.

.model flat,stdcall 

include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 
include \masm32\include\user32.inc 
includelib \masm32\lib\user32.lib

.data 
	boxtitle db "Box Title",0
	boxtext db "Hello World", 0 
.code 
_start: 
	invoke MessageBox, NULL, addr boxtext, addr boxtitle, MB_OK 
	invoke ExitProcess, NULL

Mais grâce à c’te macro, c’est le meilleur des deux mondes :

%include "mymacro.mac"
global _start ; Addresse de départ

section .data
	boxtitle db "Box Title",0
	boxtext db "Hello World", 0 
section .code
_start:
	invoke	MessageBoxA, 0, boxtext, boxtitle, 0
	invoke	ExitProcess, 0

Bon après pour les fondus de macro qui aiment les includes il y a bien NasmX mais je ne veux pas mettre le doigt dans des includes qui sont pas à moi et je ne sais pas si ca marche bien avec Yasm ;)

A+

Ps: Pour compiler Yasm et pour Linker Golink

John@ACME1482138535 ~/code/
$ yasm toto.asm -f win32 -o toto.obj

John@ACME1482138535 ~/code/
$ golink /entry _start toto.obj  kernel32.dll user32.dll

GoLink.Exe Version 0.28.0.0 - Copyright Jeremy Gordon 2002/12 - JG@JGnet.co.uk
Output file: toto.exe
Format: win32 size: 2,048 bytes
This entry was posted in Coding and tagged , , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

AlphaOmega Captcha Classica  –  Enter Security Code