Page 1 sur 5

FASMer un ASM

Publié : mar. 11/nov./2008 14:46
par Progi1984
Slt à tous,

travaillant sur mon projet de créateur d'userlibs multiplateforme, j'aurais besoin d'un coup de main coté FASM.

Quand j'essaie de compiler le fichier ASM suivant :

Code : Tout sélectionner

; 
; PureBasic x86 4.20 (Linux - x86) - generated code
; 
; (c) 2008 Fantaisie Software
; 
; The header must remain intact for Re-Assembly
; 
; :System
; :Import
; 
format ELF
; 
extrn exit
; 
extrn memset
extrn SYS_FastAllocateString
extrn SYS_FreeString
extrn _PB_StringBase
extrn PB_StringBase
extrn SYS_InitString
; 
extrn PB_StringBasePosition

macro pb_public symbol
{
_#symbol:
symbol:
}

; 
; 
section '.text' executable
; 
public PB_FunctionTest
public PB_FunctionTest_bis
public PB_FunctionTest_tris

macro MP0{
_Procedure0:
FunctionTest:
  PS0=4                                                                                                                                                                                                                                                     
; ProcedureReturn PrimParam
  MOV    eax,dword [esp+PS0+0]
  JMP   _EndProcedure1
; EndProcedure
  XOR    eax,eax
_EndProcedure1:
  RET    4
}
; ProcedureDLL FunctionTest_bis(PrimParam.l, TestSecundo.s)
macro MP2{
_Procedure2:
FunctionTest_bis:
  PS2=8
  XOR    eax,eax
  PUSH   eax                                                                                                                                                                                                                             
  MOV    edx,dword [esp+PS2+4]
  LEA    ecx,[esp+0]
  CALL   SYS_FastAllocateString
; ProcedureReturn PrimParam
  MOV    eax,dword [esp+PS2+0]
  JMP   _EndProcedure3
; EndProcedure
  XOR    eax,eax
_EndProcedure3:
  PUSH   dword [esp]
  CALL   SYS_FreeString
  ADD    esp,4
  RET    8
}
; Procedure PrivFunctionTest(PrimParam.l)
macro MP4{
_Procedure4:
  PS4=4                                                                                                                                                                                                                                                     
; ProcedureReturn PrimParam
  MOV    eax,dword [esp+PS4+0]
  JMP   _EndProcedure5
; EndProcedure
  XOR    eax,eax
_EndProcedure5:
  RET    4
}
; ProcedureDLL FunctionTest_tris(PrimParam.l, TestSecundo.s, ThirdParam.b)
macro MP6{
_Procedure6:
FunctionTest_tris:
  PS6=8
  XOR    eax,eax
  PUSH   eax                                                                                                                                                                                                                             
  MOV    edx,dword [esp+PS6+4]
  LEA    ecx,[esp+0]
  CALL   SYS_FastAllocateString
; ProcedureReturn PrimParam
  MOV    eax,dword [esp+PS6+0]
  JMP   _EndProcedure7
; EndProcedure
  XOR    eax,eax
_EndProcedure7:
  PUSH   dword [esp]
  CALL   SYS_FreeString
  ADD    esp,4
  RET    12
}
_PB_EOP:
_PB_EOP_NoValue:
  CALL   PB_EndFunctions
  PUSH   dword [PB_ExitCode]
  CALL   exit
PB_EndFunctions:
  RET
; 
MP0
MP2
MP6
section '.data' writeable
PB_DEBUGGER_LineNumber: dd -1
PB_DEBUGGER_IncludedFiles: dd 0
_SYS_StaticStringStart:
pb_public PB_NullString
  db     0
_SYS_StaticStringEnd:
align 4
align 4
s_s:
  dd     0
  dd     -1
align 4
; 
_PB_BSSSection:
align 4
; 
I_BSSStart:
PB_MemoryBase:  rd 1
PB_ArgC:  rd 1
PB_ArgV:  rd 1
PB_ExitCode:  rd 1
align 4
PB_DataPointer rd 1
align 4
align 4
align 4
align 4
I_BSSEnd:
section '.data' writeable
SYS_EndDataSection:
Avec la ligne de commande :

Code : Tout sélectionner

fasm  "/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/Moebius_Sample_00.asm" "/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/Sample_00.o"
Cela me retourne un code d'erreur que je n'arrive pas à régler et cela me bloque car malheureusement cela ne génère aucun fichier .O :

Code : Tout sélectionner

flat assembler  version 1.67.18  (16384 kilobytes memory)
/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/Moebius_Sample_00.asm [34]:
public PB_FunctionTest
error: undefined symbol.
Pourriez vous m'aider ?
Merci d'avance

Publié : mar. 11/nov./2008 15:28
par Anonyme2
Je n'ai pas vraiment travailler Fasm pour linux mais les conventions PB doivent être les mêmes entre windows et linux.

Je pense que ton problème vient de la :

Tu as 3 déclarations public ce qui veut dire que les 3 fonctions seront accessibles de l'extérieur, c'est le principe des librairies.

Elles sont déclarées comme ceci dans ton code :
public PB_FunctionTest
public PB_FunctionTest_bis
public PB_FunctionTest_tris
Tu doit donc retrouver 3 étiquettes ou labels avec le même nom dans ton code. PB ajoute le sigle 'PB_' devant les noms de fonctions pour éviter les problèmes avec des libs utilisateur, c'est la convention PB en asm mais la fonction en PB ne comportera pas le 'PB_'

Corrige déjà ceci, après la ligne
_Procedure0:
change
FunctionTest:
par
PB_FunctionTest:
Fait de même pour les 2 autres fonctions public respectivent après les lignes
_Procedure2:
et
_Procedure6:

Publié : mar. 11/nov./2008 16:13
par Progi1984
Nickel, parfait !

Ca tombe nickel et j'arrive quasiment à la fin !

Publié : mar. 11/nov./2008 17:32
par Progi1984
Petite interrogation :
Peux tu m'en expliquer un peu plus sur ce point :
Tu doit donc retrouver 3 étiquettes ou labels avec le même nom dans ton code. PB ajoute le sigle 'PB_' devant les noms de fonctions pour éviter les problèmes avec des libs utilisateur, c'est la convention PB en asm mais la fonction en PB ne comportera pas le 'PB_'
Dois je ou non mettre 'PB_' devant les noms des fonctions ou pas ?

Publié : mar. 11/nov./2008 17:42
par Anonyme2
Si ta fonction que tu vas appeler en PB s'appelle par exemple

Code : Tout sélectionner

Fonction1
en assembleur, elle sera déclarée comme ceci en Public

Code : Tout sélectionner

PB_Fonction1
et ensuite dans le fichier asm, il faudra écrire le code de cette fonction.

le compilateur retrouvera le début de la fonction avec l'étiquette

Code : Tout sélectionner

PB_Fonction1 :
C'est la convention PB telle que décrite dans le fichier Readme.txt du dossier Purebasic Library SDK
General notes:

- A PureFunction name declaration begin always by 'PB_' (ex: PB_Right, PB_Left...)

Publié : mar. 11/nov./2008 17:52
par Progi1984
Nickel, cela a réglé un de mes problèmes. Merci beaucoup :)

Par contre, j'ai un autre problème à régler :
Le fichier ASM :

Code : Tout sélectionner

;
;
;
; PureBasic x86 4.20 (Linux - x86) - generated code
;
; (c) 2008 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; :System
; :Import
;
format ELF
;
extrn exit
;
extrn memset
extrn SYS_FastAllocateString
extrn SYS_FreeString
extrn _PB_StringBase
extrn PB_StringBase
extrn SYS_InitString
;
extrn PB_StringBasePosition

macro pb_public symbol
{
_#symbol:
symbol:
}

;
;
section '.text' executable
;
public PB_FunctionTest
public PB_FunctionBis
public PB_FunctionTrisTest

macro MP0{
_Procedure0:
PB_FunctionTest:
PS0=4
; ProcedureReturn PrimParam
MOV    eax,dword [esp+PS0+0]
JMP   _EndProcedure1
; EndProcedure
XOR    eax,eax
_EndProcedure1:
RET    4
}
; ProcedureDLL FunctionBis(PrimParam.l, TestSecundo.s)
macro MP2{
_Procedure2:
PB_FunctionBis:
PS2=8
XOR    eax,eax
PUSH   eax
MOV    edx,dword [esp+PS2+4]
LEA    ecx,[esp+0]
CALL   SYS_FastAllocateString
; ProcedureReturn PrimParam
MOV    eax,dword [esp+PS2+0]
JMP   _EndProcedure3
; EndProcedure
XOR    eax,eax
_EndProcedure3:
PUSH   dword [esp]
CALL   SYS_FreeString
ADD    esp,4
RET    8
}
; Procedure FunctionTestPriv(PrimParam.l)
macro MP4{
_Procedure4:
PS4=4
; ProcedureReturn PrimParam
MOV    eax,dword [esp+PS4+0]
JMP   _EndProcedure5
; EndProcedure
XOR    eax,eax
_EndProcedure5:
RET    4
}
; ProcedureDLL FunctionTrisTest(PrimParam.l, TestSecundo.s, ThirdParam.b)
macro MP6{
_Procedure6:
PB_FunctionTrisTest:
PS6=8
XOR    eax,eax
PUSH   eax
MOV    edx,dword [esp+PS6+4]
LEA    ecx,[esp+0]
CALL   SYS_FastAllocateString
; ProcedureReturn PrimParam
MOV    eax,dword [esp+PS6+0]
JMP   _EndProcedure7
; EndProcedure
XOR    eax,eax
_EndProcedure7:
PUSH   dword [esp]
CALL   SYS_FreeString
ADD    esp,4
RET    12
}
; IDE Options = PureBasic 4.20 (Linux - x86)
; CursorPosition = 6
; Folding = -
; EnableXP
;
_PB_EOP:
_PB_EOP_NoValue:
CALL   PB_EndFunctions
PUSH   dword [PB_ExitCode]
CALL   exit
PB_EndFunctions:
RET
;
MP2
MP0
MP6
section '.data' writeable
PB_DEBUGGER_LineNumber: dd -1
PB_DEBUGGER_IncludedFiles: dd 0
_SYS_StaticStringStart:
pb_public PB_NullString
db     0
_SYS_StaticStringEnd:
align 4
align 4
s_s:
dd     0
dd     -1
align 4
;
_PB_BSSSection:
align 4
;
I_BSSStart:
PB_MemoryBase:  rd 1
PB_ArgC:  rd 1
PB_ArgV:  rd 1
PB_ExitCode:  rd 1
align 4
PB_DataPointer rd 1
align 4
align 4
align 4
align 4
I_BSSEnd:
section '.data' writeable
SYS_EndDataSection:
L'erreur :
Titre : Linker error

Code : Tout sélectionner

Sample_00.o: In function 'PB_FunctionTest':
(.text+0x36): multiple definition of 'PB_FunctionTest'

Publié : mar. 11/nov./2008 18:12
par Anonyme2
Cette erreur, c'est lorsque tu compiles avec PB ?

Si c'est le cas, as-tu utilisé Tailbite pour linux ? Si oui, il es possible qu'une librairie existe déjà (peut-être sous un nom différent) avec cette fonction déclarée.

Ou tu as peut-être créé un lib avec un nom de fonction identique.

Si ce n'est pas le cas, je sèche pour l'instant.

Publié : mar. 11/nov./2008 18:36
par Progi1984
Cette erreur, c'est lorsque j'essaie de compiler ce code suivant sous PureBasic :

Code : Tout sélectionner

Debug FunctionTest(2345)
En fait, je travaille sur un Tailbite pour Linux & Windows.

Publié : mar. 11/nov./2008 18:53
par Anonyme2
Je ne vois pas pour l'instant mis à part un librairie existante avec les mêmes noms de commande.

Juste une idée comme ça

essaie de recompiler en supprimant les 3 lignes de déclaration (avec le mot public) et de mettre le mot Public devant chaque étiquette.
et fait de nouveaux essais.

As-tu regardé dans le dossier des libs utilisateurs si tu avais une lib que tu aurais créée pendant tes essais et qui pourrait contenir le même nom de commande ?

Sous linux, il existe un fichier descripteur .desc comme sous WIndows ?

Publié : mar. 11/nov./2008 19:25
par Progi1984
Denis a écrit :Je ne vois pas pour l'instant mis à part un librairie existante avec les mêmes noms de commande.

As-tu regardé dans le dossier des libs utilisateurs si tu avais une lib que tu aurais créée pendant tes essais et qui pourrait contenir le même nom de commande ?
Je n'ai pas d'autres libs a part celle là : Sample_00.
Denis a écrit :Juste une idée comme ça

essaie de recompiler en supprimant les 3 lignes de déclaration (avec le mot public) et de mettre le mot Public devant chaque étiquette.
et fait de nouveaux essais.?

Quand j'essaie ca, un message d'erreur apparait :

Code : Tout sélectionner

Can't open the main .o : /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/Sample_00.o
J'ai meme essayé sans aucune déclaration 'public', mais en laissant l'étiquette :
Message d'erreur

Code : Tout sélectionner

purebasic.o: In function 'main':
(.text+0x40): undefined reference to PB_FunctionTest' 
Denis a écrit :Sous linux, il existe un fichier descripteur .desc comme sous WIndows ?
Oui

Code : Tout sélectionner

ASM
0
OBJ
0
Sample_00
FunctionTest, Long (PrimParam.l) - 
Long | StdCall
FunctionBis, Long, String (PrimParam.l,TestSecundo.s) - 
Long | StdCall
FunctionTrisTest, Long, String, Byte (PrimParam.l,TestSecundo.s,ThirdParam.b) - 
Long | StdCall

Publié : mar. 11/nov./2008 20:24
par Anonyme2
Je viens de parcourir le code et de réfléchir à l'erreur.

Places les 3 déclarations Public avant la ligne définissant la section de code executable, je pense que l'erreur se situe là (c'est des déclaration et pas du code) , ce qui donne ça
public PB_FunctionTest
public PB_FunctionBis
public PB_FunctionTrisTest


section '.text' executable

Publié : mar. 11/nov./2008 21:41
par Progi1984
Malheureusement cela ne change rien :( au niveau du message d'erreur.

Voici l'ASM :

Code : Tout sélectionner

;
;
;
; PureBasic x86 4.20 (Linux - x86) - generated code
;
; (c) 2008 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; :System
; :Import
;
format ELF
;
extrn exit
;
extrn memset
extrn SYS_FastAllocateString
extrn SYS_FreeString
extrn _PB_StringBase
extrn PB_StringBase
extrn SYS_InitString
;
extrn PB_StringBasePosition

macro pb_public symbol
{
_#symbol:
symbol:
}

;
;
public PB_FunctionTest
public PB_FunctionBis
public PB_FunctionTrisTest

section '.text' executable
;
macro MP0{
_Procedure0:
PB_FunctionTest:
PS0=4
; ProcedureReturn PrimParam
MOV    eax,dword [esp+PS0+0]
JMP   _EndProcedure1
; EndProcedure
XOR    eax,eax
_EndProcedure1:
RET    4
}
; ProcedureDLL FunctionBis(PrimParam.l, TestSecundo.s)
macro MP2{
_Procedure2:
PB_FunctionBis:
PS2=8
XOR    eax,eax
PUSH   eax
MOV    edx,dword [esp+PS2+4]
LEA    ecx,[esp+0]
CALL   SYS_FastAllocateString
; ProcedureReturn PrimParam
MOV    eax,dword [esp+PS2+0]
JMP   _EndProcedure3
; EndProcedure
XOR    eax,eax
_EndProcedure3:
PUSH   dword [esp]
CALL   SYS_FreeString
ADD    esp,4
RET    8
}
; Procedure FunctionTestPriv(PrimParam.l)
macro MP4{
_Procedure4:
PS4=4
; ProcedureReturn PrimParam
MOV    eax,dword [esp+PS4+0]
JMP   _EndProcedure5
; EndProcedure
XOR    eax,eax
_EndProcedure5:
RET    4
}
; ProcedureDLL FunctionTrisTest(PrimParam.l, TestSecundo.s, ThirdParam.b)
macro MP6{
_Procedure6:
PB_FunctionTrisTest:
PS6=8
XOR    eax,eax
PUSH   eax
MOV    edx,dword [esp+PS6+4]
LEA    ecx,[esp+0]
CALL   SYS_FastAllocateString
; ProcedureReturn PrimParam
MOV    eax,dword [esp+PS6+0]
JMP   _EndProcedure7
; EndProcedure
XOR    eax,eax
_EndProcedure7:
PUSH   dword [esp]
CALL   SYS_FreeString
ADD    esp,4
RET    12
}
; IDE Options = PureBasic 4.20 (Linux - x86)
; CursorPosition = 6
; Folding = -
; EnableXP
;
_PB_EOP:
_PB_EOP_NoValue:
CALL   PB_EndFunctions
PUSH   dword [PB_ExitCode]
CALL   exit
PB_EndFunctions:
RET
;
MP2
MP0
MP6
PB_DEBUGGER_LineNumber: dd -1
PB_DEBUGGER_IncludedFiles: dd 0
_SYS_StaticStringStart:
pb_public PB_NullString
db     0
_SYS_StaticStringEnd:
align 4
align 4
s_s:
dd     0
dd     -1
align 4
;
_PB_BSSSection:
align 4
;
I_BSSStart:
PB_MemoryBase:  rd 1
PB_ArgC:  rd 1
PB_ArgV:  rd 1
PB_ExitCode:  rd 1
align 4
PB_DataPointer rd 1
align 4
align 4
align 4
align 4
I_BSSEnd:
SYS_EndDataSection:

Publié : mar. 11/nov./2008 21:45
par Anonyme2
Ha :cry:

Je regarderais encore demain

Publié : mar. 11/nov./2008 21:48
par Anonyme2
TU as une idée de ce que fait la macro symbol ?

Elle doit changer un symbol par un autre

supprimes la pour voir et recompile

Publié : mar. 11/nov./2008 21:54
par Progi1984
Si je la supprime, lors de la compilation de FASM->O

Code : Tout sélectionner

franklin@novatux-laptop:~$ fasm  "/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/Moebius_Sample_00.asm" "/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/Sample_00.o"
flat assembler  version 1.67.18  (16384 kilobytes memory)
/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/Moebius_Sample_00.asm [121]:
pb_public PB_NullString
error: illegal instruction.
Encore merci de ton aide :)