Page 1 sur 2
Moebius - Bug de chaîne
Publié : ven. 01/juil./2011 11:17
par Progi1984
Bonjour, j'ai un petit bug en ASM avec Droopy.
Lorsque je génère avec Moebius une userlib, le résultat escompté n'est pas le résultat fourni.
Ainsi j'attends
Et j'obtiens
Code : Tout sélectionner
C:\Documents and Settings\flefevre\Local Settings\Temp\PureBasic_Compilation0.exePureBasic_Compilation0
Code de la librairie
Code : Tout sélectionner
ProcedureDLL.s GetFilePartWE(file.s) ; Return only file part without extension
file.s=ReverseString(GetFilePart(file))
file=Right(file,Len(file)-FindString(file,".",1))
file=ReverseString(file)
ProcedureReturn file
EndProcedure
Code de test
Code ASM
Code : Tout sélectionner
format MS COFF
public PB_GetFilePartWE
extrn _PB_FindString2@12
extrn _PB_GetFilePart@8
extrn _PB_Len@4
extrn _PB_ReverseString@8
extrn _PB_Right@12
extrn _PB_StringBasePosition
extrn _S1
extrn _SYS_AllocateString4@8
extrn _SYS_CopyString@0
extrn _SYS_FreeString@4
extrn PB_StringBase
extrn SYS_FastAllocateString
_Procedure0:
PB_GetFilePartWE:
PUSH ebx
PS0=12
XOR eax,eax
PUSH eax
MOV edx,dword [esp+PS0+0]
LEA ecx,[esp+0]
CALL SYS_FastAllocateString
MOV eax,[_PB_StringBasePosition]
PUSH eax
PUSH eax
MOV eax,[_PB_StringBasePosition]
PUSH eax
PUSH eax
PUSH dword [esp+16]
CALL _PB_GetFilePart@8
MOV edx,[PB_StringBase]
ADD [esp+0],edx
CALL _PB_ReverseString@8
LEA eax,[esp+4]
PUSH eax
CALL _SYS_AllocateString4@8
MOV eax,[_PB_StringBasePosition]
PUSH eax
PUSH eax
PUSH dword [esp+8]
CALL _PB_Len@4
MOV ebx,eax
PUSH dword 1
PUSH dword _S1
PUSH dword [esp+16]
CALL _PB_FindString2@12
SUB ebx,eax
PUSH ebx
PUSH dword [esp+12]
CALL _PB_Right@12
LEA eax,[esp+4]
PUSH eax
CALL _SYS_AllocateString4@8
MOV eax,[_PB_StringBasePosition]
PUSH eax
PUSH eax
PUSH dword [esp+8]
CALL _PB_ReverseString@8
LEA eax,[esp+4]
PUSH eax
CALL _SYS_AllocateString4@8
MOV edx,dword [esp]
PUSH dword [_PB_StringBasePosition]
CALL _SYS_CopyString@0
POP eax
ADD eax,[PB_StringBase]
JMP _EndProcedure1
MOV eax,[_PB_StringBasePosition]
ADD eax,[PB_StringBase]
MOV byte [eax],0
_EndProcedure1:
PUSH dword [esp]
CALL _SYS_FreeString@4
ADD esp,4
POP ebx
RET 4 + 4
Package de test :
http://dl.free.fr/e43Aimr7D
Testé avec PB 4.6 B3
Merci d'avance de votre aide pour faire avancer Moebius.
Re: Moebius - Bug de chaîne
Publié : ven. 01/juil./2011 11:52
par Backup
sous XP ça fonctionne !
a partir de l'editeur .. (sans utiliser Moebius)
Code : Tout sélectionner
ProcedureDLL.s GetFilePartWE(file.s) ; Return only file part without extension
file.s=ReverseString(GetFilePart(file))
file=Right(file,Len(file)-FindString(file,".",1))
file=ReverseString(file)
ProcedureReturn file
EndProcedure
Debug GetFilePartWE(ProgramFilename())
retourne :
Purebasic10
Re: Moebius - Bug de chaîne
Publié : ven. 01/juil./2011 14:00
par Progi1984
Ouaip, j'avais vu (mais pas dit
). Par contre, dés que l'on passe sous Moebius, cela ne marche pas.
Re: Moebius - Bug de chaîne
Publié : ven. 01/juil./2011 16:14
par Backup
Progi1984 a écrit :Ouaip, j'avais vu (mais pas dit
). Par contre, dés que l'on passe sous Moebius, cela ne marche pas.
t'a testé avec Tailbite ??
si ça marche avec Tailbite faudrai regarder l'assembleur generé par Tailbite
et voir ou ça peche ...
Re: Moebius - Bug de chaîne
Publié : ven. 01/juil./2011 20:50
par Droopy
tailbite a le même soucis, la question a déjà été posée sur le forum us, sans réponse
Re: Moebius - Bug de chaîne
Publié : ven. 01/juil./2011 21:18
par Backup
cette procedure
Code : Tout sélectionner
ProcedureDLL.s GetFilePartWE(file.s) ; Return only file part without extension
file.s=ReverseString(GetFilePart(file))
file=Right(file,Len(file)-FindString(file,".",1))
file=ReverseString(file)
ProcedureReturn file
EndProcedure
donne
Code : Tout sélectionner
;
; PureBasic 4.51 (Windows - x86) generated code
;
; (c) 2010 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; String
; FileSystem
; Date
; Object
; SimpleList
; :System
; KERNEL32
; :Import
;
format MS COFF
;
extrn _ExitProcess@4
extrn _GetModuleHandleA@4
extrn _HeapCreate@12
extrn _HeapDestroy@4
;
extrn _PB_FindString@12
extrn _PB_GetFilePart@8
extrn _PB_Len@4
extrn _PB_ReverseString@8
extrn _PB_Right@12
extrn _memset
extrn _SYS_CopyString@0
extrn _SYS_AllocateString4@8
extrn SYS_FastAllocateString
extrn _SYS_FreeString@4
extrn _PB_StringBase
extrn PB_StringBase
extrn _SYS_InitString@0
;
extrn _PB_StringBasePosition
public _PB_Instance
public _PB_ExecutableType
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public _PB_EndFunctions
macro pb_public symbol
{
public _#symbol
public symbol
_#symbol:
symbol:
}
macro pb_align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro pb_bssalign value { rb (value-1) - ($-_PB_BSSSection + value-1) mod value }
public PureBasicStart
;
section '.code' code readable executable align 8
;
;
PureBasicStart:
;
PUSH dword I_BSSEnd-I_BSSStart
PUSH dword 0
PUSH dword I_BSSStart
CALL _memset
ADD esp,12
PUSH dword 0
CALL _GetModuleHandleA@4
MOV [_PB_Instance],eax
PUSH dword 0
PUSH dword 4096
PUSH dword 0
CALL _HeapCreate@12
MOV [PB_MemoryBase],eax
CALL _SYS_InitString@0
;
; ProcedureDLL.s GetFilePartWE(file.s) ; Return only file part without extension
macro MP0{
_Procedure0:
PUSH ebx
PS0=12
XOR eax,eax
PUSH eax
MOV edx,dword [esp+PS0+0]
LEA ecx,[esp+0]
CALL SYS_FastAllocateString
; file.s=ReverseString(GetFilePart(file))
MOV eax,[_PB_StringBasePosition]
PUSH eax
PUSH eax
MOV eax,[_PB_StringBasePosition]
PUSH eax
PUSH eax
PUSH dword [esp+16]
CALL _PB_GetFilePart@8
MOV edx,[PB_StringBase]
ADD [esp+0],edx
CALL _PB_ReverseString@8
LEA eax,[esp+4]
PUSH eax
CALL _SYS_AllocateString4@8
; file=Right(file,Len(file)-FindString(file,".",1))
MOV eax,[_PB_StringBasePosition]
PUSH eax
PUSH eax
PUSH dword [esp+8]
CALL _PB_Len@4
MOV ebx,eax
PUSH dword 1
PUSH dword _S1
PUSH dword [esp+16]
CALL _PB_FindString@12
SUB ebx,eax
PUSH ebx
PUSH dword [esp+12]
CALL _PB_Right@12
LEA eax,[esp+4]
PUSH eax
CALL _SYS_AllocateString4@8
; file=ReverseString(file)
MOV eax,[_PB_StringBasePosition]
PUSH eax
PUSH eax
PUSH dword [esp+8]
CALL _PB_ReverseString@8
LEA eax,[esp+4]
PUSH eax
CALL _SYS_AllocateString4@8
; ProcedureReturn file
MOV edx,dword [esp]
PUSH dword [_PB_StringBasePosition]
CALL _SYS_CopyString@0
POP eax
ADD eax,[PB_StringBase]
JMP _EndProcedure1
; EndProcedure
MOV eax,[_PB_StringBasePosition]
ADD eax,[PB_StringBase]
MOV byte [eax],0
_EndProcedure1:
PUSH dword [esp]
CALL _SYS_FreeString@4
ADD esp,4
POP ebx
RET 4
}
;
;
_PB_EOP_NoValue:
PUSH dword 0
_PB_EOP:
CALL _PB_EndFunctions
PUSH dword [PB_MemoryBase]
CALL _HeapDestroy@4
CALL _ExitProcess@4
_PB_EndFunctions:
RET
;
MP0
;
section '.data' data readable writeable
;
_PB_DataSection:
pb_public PB_DEBUGGER_LineNumber
dd -1
pb_public PB_DEBUGGER_IncludedFiles
dd 0
pb_public PB_DEBUGGER_FileName
db 0
_PB_ExecutableType: dd 0
public _SYS_StaticStringStart
_SYS_StaticStringStart:
_S1: db ".",0
pb_public PB_NullString
db 0
public _SYS_StaticStringEnd
_SYS_StaticStringEnd:
align 4
align 4
s_s:
dd 0
dd -1
align 4
;
section '.bss' readable writeable
_PB_BSSSection:
align 4
;
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rd 1
_PB_Instance:
PB_Instance: rd 1
;
align 4
PB_DataPointer rd 1
align 4
align 4
align 4
align 4
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:
par Purebasic
y a t'il des differences par rapport a ton code Ass de Moebius ?
Re: Moebius - Bug de chaîne
Publié : ven. 01/juil./2011 22:40
par Le Soldat Inconnu
Salut, essai en séparant bien toutes tes commandes sur les strings, c'est souvent la cause, TailBite compris, comme cela :
Code : Tout sélectionner
ProcedureDLL.s GetFilePartWE(file.s) ; Return only file part without extension
file.s = GetFilePart(file)
file = ReverseString(file)
file = Right(file, Len(file) - FindString(file, ".", 1))
file = ReverseString(file)
ProcedureReturn file
EndProcedure
Re: Moebius - Bug de chaîne
Publié : sam. 02/juil./2011 9:03
par Droopy
Ce problème se produit sur ce type de fonctions :
- Fonctions (compilées avec tailbite ou Moebius) qui acceptent une chaine en entrée et renvoient une chaine en sortie.
--> Ces fonctions ne peuvent en appeler d'autres (bug chaine entrée concaténée avec celle de sortie)
Comme le soldat l'indique, le contournement est d'utiliser une variable tampon qui stocke le retour de la première fonction, qui est ensuite utilisée comme entrée de la seconde fonction.
Ce bug est apparu avec PureBasic 4 (aucun bug avec la 3.94)
Si quelqu'un pouvait se pencher sur le code asm ce serait cool
Re: Moebius - Bug de chaîne
Publié : lun. 04/juil./2011 12:50
par Progi1984
@Dobro :
Je confirme la réponse de Droopy. Même problème avec TailBite.
@Le Soldat Inconnu :
Après tests, cela provoque toujours le même bogue.
@All :
Je plussoie Droopy pour la demande concernant la demande pour le bogue de concaténation de chaînes en ASM.
Re: Moebius - Bug de chaîne
Publié : lun. 04/juil./2011 21:30
par Droopy
je plussoie aussi (ça veut dire quoi au fait ?)
Re: Moebius - Bug de chaîne
Publié : mer. 06/juil./2011 16:02
par Progi1984
plussoyer : (Néologisme) Donner, signaler son accord. Abonder dans le sens de quelqu'un, souscrire à ses propos.
Lien :
http://fr.wiktionary.org/wiki/plussoyer
Lien :
http://fr.wiktionary.org/wiki/plussoir
Re: Moebius - Bug de chaîne
Publié : lun. 25/juil./2011 14:14
par Progi1984
Quelqu'un a une idée ?
Re: Moebius - Bug de chaîne
Publié : lun. 22/août/2011 8:35
par Progi1984
Je reviens vers vous, en essayant de motiver les foules.
Celui qui réussira à trouver une solution avec explication et aide pour intégration dans Moebius, qui aura été validé par Droopy & Moi, se verra récompensé de 10 € (des vrais...) de ma poche.
Re: Moebius - Bug de chaîne
Publié : lun. 22/août/2011 9:40
par Backup
Tu vas devoir les donner a Fred , car a part lui
je vois pas comment on va pouvoir trouver une solution ...
Re: Moebius - Bug de chaîne
Publié : lun. 22/août/2011 11:11
par Progi1984
On ne sait jamais si l'un des utilisateurs trouve une solution... , car Fred avait parlé d'une
solution mais pas de nouvelles depuis le 28/05/2008.