Je pompe mes infos de PB dans le fichier fait par Fred qui se situe dans le dossier PureBasic \SDK, le fichier est un fichier texte en anglais qui se nomme Readme.txt
Il faut que tu le lises car il est plein d'infos (et en particulier les registres à sauvegarder)
La gestion des floattant/double utilise le registre STO
Voici ce que je sais pour la version 32 bits, pour les 64 il faut que tu lises un post de Fred sur le forum anglais qui explique comment calculer les empilemets.
Pour ta procedure en 32 bits
Code:
Procedure.d ExecuteFunction(*this.Function, *param)
ProcedureReturn CallFunctionFast(*this\ptr, blablabla)
EndProcedure
tu mets sur la pile (tu empiles) en commençant par le dernier paramètre soit param qui est un pointeur c''est donc une valeur sur 32 bits
Ensuite tu empiles le premier paramètre (*This) qui est un pointeur, idem c'est une valeur sur 32 bits
Pour accéder aux différents éléments de ta structure, tu charges dans un registre ton pointeur et tu lui ajoutes l'offset correspondant (c'est pour chaque élément la valeur retournée par les commande PB offsetOf().
Le code ASM devient (créé par mon générateur de squelette ASM pour PB qui est en cours de développement), je n'ai pas fait de sauvegarde des registres PB , alors à toi de savoir ce que tu dois sauvegarder.
Pour retourner un double, utilises le registre STO, je te conseille à partir de ton fichier PB de ta procedure, de créer le fichier asm avec le compilateur PB et de regarder comment Fred a fait, c'est en général comme ça que j'avance.
Dans le code qui suit, tu accèdes aux paramètres avec le registre esp alors prudence pour éviter les crash, PB fait de même.
Code:
format MS COFF
public PB_ExecuteFunction
; -------------------------------------------;
; Paramètres d'entrée
; -------------------------------------------;
; This.l
This equ dword esp+4
; Param.l
Param equ dword esp+8
; -------------------------------------------;
; Section code ;
; -------------------------------------------;
section '.text' code readable executable
PB_ExecuteFunction:
; **************************************************
; Mettez votre code asm perso après cette ligne
; fin de la zone de votre code asm perso
; **************************************************
; -------------------------------------------;
; un nombre flottant ou double doit être
; retourné avec ST0
; -------------------------------------------;
_Retour:
RET 8