Mais si tu préfères, on peut finaliser la première version pour moebius pour windows et on verra aprés celle pour linux
FASMer un ASM
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Je ne sais pas si tu as vu le code de Moebius, mais tu as tout le code que j'utilise actuellement pour windows & linux 
Mais si tu préfères, on peut finaliser la première version pour moebius pour windows et on verra aprés celle pour linux
Mais si tu préfères, on peut finaliser la première version pour moebius pour windows et on verra aprés celle pour linux
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Tu peux tout récupérer via un
Code : Tout sélectionner
svn checkout http://moebius-pb.googlecode.com/svn/trunk/ moebius-pb-read-onlyLibrairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Oui, c'est indiqué ici : http://code.google.com/p/moebius-pb/source/checkout
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
Sous windows, plusieurs erreurs
1) j'ai corrigé ceci pour que ça marche chez moi mais il faudra écrire une fonction dynamique qui donne le chemin de PB quelque soit le dossier ou il est et quelque soit la version de PB
ensuite, des erreurs avec la ligne suivante
Il faut absolument tester lFile car il est possible que ça échoue. Ces tests sont vrais pour la plupart des choses, y compris la création de gadgets.
Puis,
Je n'ai jamais eu de fichier asm généré par ton code (Vista + PB 4.30 beta 4)
Avant d'aller plus loin, j'ai écrit une fonction qui semble bien fonctionner (j'ai fait des tests sous Vista/XP, PB 4.20 et PB 4.30 beta 4).
Dans tous mes tests, je n'ai jamais eu de fichier asm sans avoir mis le drapeau "/EXE", il faut aussi ajouter celui-ci "/INLINEASM " car le code PB peut comporter des lignes en asm
La voici, tu l'adaptes pour ton projet si tu veux.
Toujours sous windows, le fichier desc doit être au format LIB et pas OBJ car depuis la version 3 de PB, le format lib a été introduit, il permet de n'inclure que les fonctions nécessaires à l'éxécutable au contraire du format OBJ qui introduira l'ensemble des commandes même si elles ne sont pas utilisées.
Je vais continuer
1) j'ai corrigé ceci pour que ça marche chez moi mais il faudra écrire une fonction dynamique qui donne le chemin de PB quelque soit le dossier ou il est et quelque soit la version de PB
Code : Tout sélectionner
Global gConf_PureBasic_Path.s = #PB_Compiler_Home
Global gConf_Path_PBCOMPILER.s = #PB_Compiler_Home + "compilers\pbcompiler.exe"
Global gConf_Path_FASM.s = #PB_Compiler_Home + "compilers\fasm.exe"
Global gConf_Path_OBJ2LIB.s = #PB_Compiler_Home + "compilers\polib.exe"
Global gConf_Path_PBLIBMAKER.s = #PB_Compiler_Home + "Library SDK\LibraryMaker.exe"
ensuite, des erreurs avec la ligne suivante
Code : Tout sélectionner
;{ Create ASM Files
Protected lFile.l
ForEach LL_DLLFunctions()
lFile = CreateFile(#PB_Any, gConf_ProjectDir + "ASM" + #System_Separator + LL_DLLFunctions()\FuncName + ".asm")
Puis,
Je n'ai jamais eu de fichier asm généré par ton code (Vista + PB 4.30 beta 4)
Avant d'aller plus loin, j'ai écrit une fonction qui semble bien fonctionner (j'ai fait des tests sous Vista/XP, PB 4.20 et PB 4.30 beta 4).
Dans tous mes tests, je n'ai jamais eu de fichier asm sans avoir mis le drapeau "/EXE", il faut aussi ajouter celui-ci "/INLINEASM " car le code PB peut comporter des lignes en asm
La voici, tu l'adaptes pour ton projet si tu veux.
Code : Tout sélectionner
Procedure.l CreateAsmFile(FichierPureBasic$)
; Retourne #true si le fichier asm a correctement été créé sinon retourne une valeur négative
; qui dépend du lieu de l'erreur, permet de trouver rapidement ou se situe l'erreur
Protected extension$ = LCase(GetExtensionPart(FichierPureBasic$))
; mémorise le nom du fichier asm avec le chemein complet
Protected FichierAsm$ = ""
; mémorise le nom du fichier exe, mais en fait la variable est vide
Protected FichierExe$ = ""
; mémorise le chemin et le nom du fichier asm initial créé par PB
Protected FichierInitialAsm$ = ""
; mémorise la chaine retournée par le compilateur lors de la création du fichier asm
Protected Sortie$ = ""
; mémorise le résultat de la fonction Runprogram
Protected Compilateur
; on teste si le fichier se fini par "pb ou pbi"
; si oui on continue sinon on retourrne #False
Select extension$
Case "pb"
FichierAsm$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-2) + "asm"
; on fixe le nom du fiche executable
FichierExe$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-2) + "exe"
Case "pbi"
FichierAsm$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-3) + "asm"
; on fixe le nom du fiche executable
FichierExe$ + Mid(GetFilePart(FichierPureBasic$), 1, Len(GetFilePart(FichierPureBasic$))-3) + "exe"
Default
; ce n'est pas un fichier PB, on quitte
ProcedureReturn -1
EndSelect
; le fichier asm Prebasic.asm est créé dans le dossier de l'éxécutable qui le crée
FichierInitialAsm$ = GetCurrentDirectory() + "PureBasic.asm"
; on efface le fichier asm qui existerait éventuellement sous le même nom et sous le nom PureBasic.asm
; on efface éventuellement le fichier asm plus ancien
SetFileAttributes(FichierAsm$, #PB_FileSystem_Normal)
DeleteFile(FichierAsm$)
; on efface éventuellement le fichier Pb asm
SetFileAttributes(FichierAsm$, #PB_FileSystem_Normal)
DeleteFile(FichierInitialAsm$)
Compilateur = RunProgram(#PB_Compiler_Home + "\Compilers\pbcompiler", Chr(34) + FichierPureBasic$ + Chr(34) + " /INLINEASM /COMMENTED /EXE " + Chr(34) + FichierExe$ + Chr(34) , "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
If Compilateur
While ProgramRunning(Compilateur)
Sortie$ + ReadProgramString(Compilateur) + Chr(13)
Wend
EndIf
If ProgramExitCode(Compilateur) = 0
MessageRequester("", Sortie$, 16)
; on teste si le résultat est Ok
; la dernière ligne retournée vaut
; "- Feel the ..PuRe.. Power -"
; If FindString(Sortie$, "- Feel the ..PuRe.. Power -", Len(Sortie$)-28)
If FindString(Sortie$, "- Feel the ..PuRe.. Power -", 0)
; on efface le fichier executable créé
DeleteFile(FichierExe$)
; on renomme le fichier asm PureBasic.asm avec le nouveau nom
If RenameFile(FichierInitialAsm$, FichierAsm$)
ProcedureReturn #True
Else
ProcedureReturn -1
EndIf
Else
; on efface le fichier executable créé
DeleteFile(FichierExe$)
ProcedureReturn -2
EndIf
Else
; on efface le fichier executable créé
DeleteFile(FichierExe$)
ProcedureReturn -3
EndIf
EndProcedureToujours sous windows, le fichier desc doit être au format LIB et pas OBJ car depuis la version 3 de PB, le format lib a été introduit, il permet de n'inclure que les fonctions nécessaires à l'éxécutable au contraire du format OBJ qui introduira l'ensemble des commandes même si elles ne sont pas utilisées.
Je vais continuer
Il manque cette ligne après le endselect pour donner le bon chemin au fichier asm de destination
Code : Tout sélectionner
; donne le bon chemin au fichier asm
FichierAsm$ = GetPathPart(FichierPureBasic$) + FichierAsm$
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
J'ai mis à jour le svn grâce à tes modifications :
http://code.google.com/p/moebius-pb/source/detail?r=13
Bon boulot
http://code.google.com/p/moebius-pb/source/detail?r=13
Bon boulot
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
J'ai modifié le code pour la génération du fichier ASM et mis à jour le SVN (http://code.google.com/p/moebius-pb/source/detail?r=14)
Le fichier généré se trouve dans "Proj_Moebius\Lib_Source\"+gProject\Name+"\PureBasic.asm". Comme ca, il restera dans le dossier du projet.
Le fichier généré se trouve dans "Proj_Moebius\Lib_Source\"+gProject\Name+"\PureBasic.asm". Comme ca, il restera dans le dossier du projet.
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
J'ai corrigé la procedure GetInfoLib à l'arache car le programme plantait.
Je rabache, mais on ne peut pas déplacer un pointeur dans un fichier sans savoir si on ne va pas dépasser la fin de fichier, sinon ça plante.
C'est exactement la même chose lorsque l'on écrit en mémoire, avant d'écrire, on regarde si on ne dépasse pas la dernière adresse de la mémoire, sinon ça plante. Si tu veux un code éprouvé, il faut des tests partout.
Par exemple, ExamineDirectory doit être testé avec un if et lorsque l'on a fini, on utilise FinishDirectory (tu dois réécrire ces codes pour ne pas planter).
Les AllocateMemory aussi, dans la procedure PB_GetInfoUserLib, il faut absolument tester au retour que le pointeur soit <> de 0 etc
Idem avec FreeMemory, si on a fait un test, le FreeMemory est dans le if donc normalement pas de problème, sinon on teste le pointeur.
Lorsque l'on alloue de la mémoire, toujours vérifier que la taille allouée est différente de 0 sinon ça plante.
Idem pour les Addelement() qui doivent être testés avant d'ajouter un élément.
Sinon, tu verras une fois que ça marche, pour les lib en mode unicode, treadsafe, il faut lire dans leur dossier respectif, je ne sais pas si ton code le fait mais pour l'instant c'est pas urgent.
Je rabache, mais on ne peut pas déplacer un pointeur dans un fichier sans savoir si on ne va pas dépasser la fin de fichier, sinon ça plante.
C'est exactement la même chose lorsque l'on écrit en mémoire, avant d'écrire, on regarde si on ne dépasse pas la dernière adresse de la mémoire, sinon ça plante. Si tu veux un code éprouvé, il faut des tests partout.
Par exemple, ExamineDirectory doit être testé avec un if et lorsque l'on a fini, on utilise FinishDirectory (tu dois réécrire ces codes pour ne pas planter).
Les AllocateMemory aussi, dans la procedure PB_GetInfoUserLib, il faut absolument tester au retour que le pointeur soit <> de 0
Code : Tout sélectionner
*MemLib_Header = AllocateMemory(LibSize)Idem avec FreeMemory, si on a fait un test, le FreeMemory est dans le if donc normalement pas de problème, sinon on teste le pointeur.
Lorsque l'on alloue de la mémoire, toujours vérifier que la taille allouée est différente de 0 sinon ça plante.
Idem pour les Addelement() qui doivent être testés avant d'ajouter un élément.
Sinon, tu verras une fois que ça marche, pour les lib en mode unicode, treadsafe, il faut lire dans leur dossier respectif, je ne sais pas si ton code le fait mais pour l'instant c'est pas urgent.
Code : Tout sélectionner
Procedure PB_GetInfoLib(FileName.s)
Protected LibName.s = GetFilePart(FileName)
Protected hFile = ReadFile(#PB_Any, FileName)
Protected Ndx.l
Protected Filesize.q = FileSize(FileName)
Debug FileName
If hFile
If Filesize>0
Ndx = 2
While ((Ndx>0) And ((Loc(hFile) + 1)<Lof(hFile)))
If ReadByte(hFile) = 0
Ndx-1
EndIf
Wend
If (Loc(hFile)<(Lof(hFile)-2))
FileSeek(hFile, Loc(hFile) + 2)
EndIf
While Eof(hFile) = 0
If AddElement(LL_PBFunctions())
LL_PBFunctions()\FuncName = ReadString(hFile)
; Debug LL_PBFunctions()\FuncName
LL_PBFunctions()\LibContaining = LibName
If (Loc(hFile)<(Lof(hFile)-2))
FileSeek(hFile, Loc(hFile) + 2)
Else
; erreur
CloseFile(hFile)
ProcedureReturn -1 ; erreur sur le déplacement dans le fichier
EndIf
Else
; erreur
CloseFile(hFile)
ProcedureReturn -1 ; erreur sur Addelement
EndIf
Wend
CloseFile(hFile)
Else
CloseFile(hFile)
ProcedureReturn -1 ; erreur sur le fichier (taille ou inexsistant)
EndIf
Else
ProcedureReturn -1 ; erreur sur l'ouverture du fichier
EndIf
EndProcedure
Dernière modification par Anonyme2 le dim. 16/nov./2008 15:34, modifié 1 fois.
Dans la procedure Moebius_Compile_Step2, j'ai adapté pour PB 4.30
Code : Tout sélectionner
CompilerIf #PB_Compiler_Version<430
; Type of the Return Value
If Mid(LL_DLLFunctions()\FuncName, Len(LL_DLLFunctions()\FuncName)-1, 1) = "."
Select Mid(LL_DLLFunctions()\FuncName, Len(LL_DLLFunctions()\FuncName), 1)
Case "b" : LL_DLLFunctions()\FuncRetType = "Byte"
Case "c" : LL_DLLFunctions()\FuncRetType = "Character"
Case "d" : LL_DLLFunctions()\FuncRetType = "Double"
Case "f" : LL_DLLFunctions()\FuncRetType = "Float"
Case "q" : LL_DLLFunctions()\FuncRetType = "Quad"
Case "s" : LL_DLLFunctions()\FuncRetType = "String"
Case "w" : LL_DLLFunctions()\FuncRetType = "Word"
Default : LL_DLLFunctions()\FuncRetType = "Long"
EndSelect
Else
LL_DLLFunctions()\FuncRetType = "Long"
EndIf
; Type of Parameters
For IncA = 1 To CountString(LL_DLLFunctions()\Params, ",") + 1
Select Right(Trim(StringField(LL_DLLFunctions()\Params, IncA, ",")), 1)
Case "b" : LL_DLLFunctions()\ParamsRetType + ", Byte"
Case "c" : LL_DLLFunctions()\ParamsRetType + ", Character"
Case "d" : LL_DLLFunctions()\ParamsRetType + ", Double"
Case "f" : LL_DLLFunctions()\ParamsRetType + ", Float"
Case "q" : LL_DLLFunctions()\ParamsRetType + ", Quad"
Case "s" : LL_DLLFunctions()\ParamsRetType + ", String"
Case "w" : LL_DLLFunctions()\ParamsRetType + ", Word"
Default : LL_DLLFunctions()\ParamsRetType + ", Long"
EndSelect
Next
CompilerElse
; Type of the Return Value
If Mid(LL_DLLFunctions()\FuncName, Len(LL_DLLFunctions()\FuncName)-1, 1) = "."
Select Mid(LL_DLLFunctions()\FuncName, Len(LL_DLLFunctions()\FuncName), 1)
Case "b" : LL_DLLFunctions()\FuncRetType = "Byte"
Case "c" : LL_DLLFunctions()\FuncRetType = "Character"
Case "d" : LL_DLLFunctions()\FuncRetType = "Double"
Case "f" : LL_DLLFunctions()\FuncRetType = "Float"
Case "l" : LL_DLLFunctions()\FuncRetType = "Long"
Case "q" : LL_DLLFunctions()\FuncRetType = "Quad"
Case "s" : LL_DLLFunctions()\FuncRetType = "String"
Case "w" : LL_DLLFunctions()\FuncRetType = "Word"
Default : LL_DLLFunctions()\FuncRetType = "Integer"
EndSelect
Else
LL_DLLFunctions()\FuncRetType = "Integer"
EndIf
; Type of Parameters
For IncA = 1 To CountString(LL_DLLFunctions()\Params, ",") + 1
Select Right(Trim(StringField(LL_DLLFunctions()\Params, IncA, ",")), 1)
Case "b" : LL_DLLFunctions()\ParamsRetType + ", Byte"
Case "c" : LL_DLLFunctions()\ParamsRetType + ", Character"
Case "d" : LL_DLLFunctions()\ParamsRetType + ", Double"
Case "f" : LL_DLLFunctions()\ParamsRetType + ", Float"
Case "l" : LL_DLLFunctions()\ParamsRetType + ", Long"
Case "q" : LL_DLLFunctions()\ParamsRetType + ", Quad"
Case "s" : LL_DLLFunctions()\ParamsRetType + ", String"
Case "w" : LL_DLLFunctions()\ParamsRetType + ", Word"
Default : LL_DLLFunctions()\ParamsRetType + ", Integer"
EndSelect
Next
CompilerEndIf- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Dans la release r15 :
IMPROVED : Verification of If, AddElement, AllocateMemory, ExamineDirectory
IMPROVED : Function PB_GetInfoLib
Dans la release r16 :
IMPROVED : Type of Variable Detection for PureBasic 4.30
On devrait déjà bosser sur une version pour PB 4.20 sans Unicode sans ThreadSafe. On verra quand on pourra compiler une userlib pour un code simple.
Encore merci de ton aide
IMPROVED : Verification of If, AddElement, AllocateMemory, ExamineDirectory
IMPROVED : Function PB_GetInfoLib
Dans la release r16 :
IMPROVED : Type of Variable Detection for PureBasic 4.30
On devrait déjà bosser sur une version pour PB 4.20 sans Unicode sans ThreadSafe. On verra quand on pourra compiler une userlib pour un code simple.
Encore merci de ton aide
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
Tout à fait d'accord
Pour ta fonction non reconnue, change dans ton code ceci, procedure Moebius_Compile_Step2()
remplace
par
car la fonction n'est jamais déclarée dans le fichier descripteur, avec cette modif, la déclaration y est (pour un exemple à une seule proceduredll pour l'instant, lorsque j'en déclare 2, le nom de la deuxième n'y est pas, le problème est là pour le descripteur, à creuser.
Pour ta fonction non reconnue, change dans ton code ceci, procedure Moebius_Compile_Step2()
remplace
Code : Tout sélectionner
LL_DLLFunctions()\FuncName = StringField(TrCodeField, 1, " ")
Code : Tout sélectionner
LL_DLLFunctions()\FuncName = StringField(TrCodeField, 2, " ")