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