Moebius - Bug de chaîne

Pour discuter de l'assembleur
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Moebius - Bug de chaîne

Message 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

Code : Tout sélectionner

PureBasic_Compilation0
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 : Tout sélectionner

Debug GetFilePartWE(ProgramFilename())
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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Moebius - Bug de chaîne

Message 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
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Moebius - Bug de chaîne

Message par Progi1984 »

Ouaip, j'avais vu (mais pas dit :?). Par contre, dés que l'on passe sous Moebius, cela ne marche pas.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Moebius - Bug de chaîne

Message 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 ... ;)
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: Moebius - Bug de chaîne

Message par Droopy »

tailbite a le même soucis, la question a déjà été posée sur le forum us, sans réponse :x :(
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Moebius - Bug de chaîne

Message 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 ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Moebius - Bug de chaîne

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: Moebius - Bug de chaîne

Message 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 :wink:
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Moebius - Bug de chaîne

Message 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.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: Moebius - Bug de chaîne

Message par Droopy »

je plussoie aussi (ça veut dire quoi au fait ?) :lol:
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Moebius - Bug de chaîne

Message 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
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Moebius - Bug de chaîne

Message par Progi1984 »

Quelqu'un a une idée ?
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Moebius - Bug de chaîne

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Moebius - Bug de chaîne

Message par Backup »

Tu vas devoir les donner a Fred , car a part lui
je vois pas comment on va pouvoir trouver une solution ... :wink:
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Moebius - Bug de chaîne

Message 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.
Répondre