FASMer un ASM

Pour discuter de l'assembleur
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Progi1984,

en regardant le code, je viens seulement de percuter, j'ai vu que toutes les fonctions et le reste était dans le même fichier asm. Ca ne doit pas être comme ça pour une lib.

Il y a quelques années, PB ne supportait pas des fichiers asm séparés pour les fonctions. Aujourd'hui oui, car avant même si on utilisait pas toutes les fonctions, elles se retrouvaient toutes dans le fichier exe.

Avant de demander à Fred, tu devrais séparer les commandes comme ceci.

4 fichiers asm, un par commande public (3) et un pour la commande privée, nommes les avec le nom de la fonction, c'est plus pratique (pour le code suivant c'est FunctionTest.asm

Code : Tout sélectionner

format ELF

public PB_FunctionTest


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
le suivant FunctionBis.asm

Code : Tout sélectionner

format ELF

public PB_FunctionBis

; 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
}
Je te laisse faire le troisième.

Au début tu donnes le format (format ELF sous linux et format MS COFF sous Windows)

Tu déclares ensuite en public le nom de la fonction avec la règle PB_

Puis tu mets le code de la procedure, tu ne prends vraiment que la fonction qui commence par le mot macro et qui se termine par }

Pour la procedure privée, celle qui ne sera pas connue de l'extérieur, tu la déclares dans le fichier descripteur, tu fais un fichier asm comme ceux ci-dessus sauf que tu ne mets pas de ligne Public suivit du nom de la fonction justement pour qu'elle soit encapsulée dans ta librairie.

Il faut comprendre que cette procedure "privée" sera certainement appelée par une au moins des autres procedures public voire par une procedure privé de cette même librairie.
Pour qu'elle soit reconnue par exemple dans la procedure FunctionTes, il faut qu'elle soit déclarée dans le fichier asm de la fonction FunctionTes comme une commande externe avec le mot extrn

Code : Tout sélectionner

extrn _Procedure4
car PB la nommée _Procedure4, ton Tailbite devra la reconnaître et générer la ligne extrn _Procedure4 pour chaque commande qui l'utilise.

Il faut créer un fichier d'initialisation, qui initialise les chaines même si aucune commande ne l'utilise, ça ne mange pas de pain :D

voilà par exemple le fichier généré par Tailbite dans un exemple que j'ai fait

Code : Tout sélectionner

format MS COFF

extrn _SYS_InitString@0

Public PB_essaiasm_Init

section '.text' code readable executable

PB_essaiasm_Init:
call _SYS_InitString@0

RET
La fonction d'initialisation est public, elle est déclarée dans le desc en Init fonction

Code : Tout sélectionner

essaiasm_Init 
InitFunction | StdCall
Tailbite génère un code "shared", c'est la section data, les déclarations et les macro du début utilisées par PB. Regarde sous windows comme c'est fait.
Il reste enfin le cas des variables globales, elle sont situées dans la section data lorsque l'on fait sa propre librairie. Dans le cas d'un tailbite, elles se retrouve dans le fichier shared car elles sont en datasection mais elle ne seront pas utilisable dans le code PB utilisant la lib.


Avance doucement, recompile et on regarde ensemble ou ça coince.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

[EDIT] Je travaille dessus !!! Et j'essaie d'abord de comprendre !
Dernière modification par Progi1984 le mer. 12/nov./2008 18:55, modifié 2 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Alors ça fonctionne sous linux ?

Si oui c'était ou le problème ?
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Voilà, où j'en suis en faisant le point :

Code : Tout sélectionner

Première boucle
lister tous les proceduredll & procedure
==============================================================
Pour les procedureDLL

Créer un fichier asm avec le nom
mettre 
"format ELF"
"public PB_<nomdelafonction>"
coller la fonction (la fonction qui commence par le mot macro et qui se termine par } )

regarder tous les "call" et faire un extrn de chq fonction

==============================================================
Pour les procedure (privées)
Créer un fichier asm avec le nom
mettre 
"format ELF"
"public <nomduprojet>_<nomdelafonction>"
coller la fonction (la fonction qui commence par le mot macro et qui se termine par } )

regarder tous les "call" et faire un extrn _PB_Nomdelafonctionasm

==============================================================
Faire un fichier NomProjet_Init

format MS COFF

extrn _SYS_InitString@0

Public PB_essaiasm_Init

section '.text' code readable executable

PB_NameProjet_Init:
call _SYS_InitString@0

RET 
===============================================================
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

...
Dernière modification par flaith le jeu. 13/nov./2008 21:59, modifié 1 fois.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Salut Denis, bon j'avance coté code :

Quand je fais un fasm

Code : Tout sélectionner

fasm "/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/ASM/FunctionTest.asm" "/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Sample_00 Project/ASM/FunctionTest.o"
Du fichier suivant :

Code : Tout sélectionner

format ELF

public PB_FunctionTest

macro MP0{
_Procedure0:
PB_FunctionTest:
  PS0=4
; ProcedureReturn PrimParam
  MOV    eax,dword [esp+PS0+0]
; EndProcedure
  XOR    eax,eax
_EndProcedure1:
  RET    4
}
J'ai ce message d'erreur :

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/ASM/FunctionTest.asm [3]:
public PB_FunctionTest
error: undefined symbol.
Pourtant bien déclaré avec public (pas comme au début)

[EDIT] Problème réglé ! Deux solutions :
- soit on supprime la ligne contenant la macro ("macro MP0{") et le "{"
- soit on ajoute tout à la fin un MP0 pour déclarer la macro
J'apprends ptit à ptit certaines techniques, c'est cool :)

PS : Plus de problème avec Linux ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Progi1984 a écrit :
Pourtant bien déclaré avec public (pas comme au début)

[EDIT] Problème réglé ! Deux solutions :
- soit on supprime la ligne contenant la macro ("macro MP0{") et le "{"
- soit on ajoute tout à la fin un MP0 pour déclarer la macro
J'apprends ptit à ptit certaines techniques, c'est cool :)

PS : Plus de problème avec Linux ?
La deuxième solution (soit on ajoute tout à la fin un MP0 pour déclarer la macro) est à proscrire, le fait de mettre MP0 exécutera la macro, ce n'est pas une déclaration.
La première solution est la bonne. Il me semble que tailbite supprime la notation macro, je n'ai d'ailleurs pas compris pourquoi, un jour, Fred a utilisé les macros pour son code, avant il faisait sans.

Linux, c'est quoi au fait :roll:

Non, je n'ai pas encore retravaillé l'install de PB qui ne fonctionne pas.
J'ai installé ça pour t'aider dans tes codes asm, mais pour l'instant PB nunux sommeille :D
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Cool, c'est la première solution que j'ai mis en place :p

Pour Linux, hésite pas à me contacter samedi par msn pour que l'on travaille sur ton problème :)

Je continue. J'ai réussi à générer des fichiers ASMs distincts. Manque la génération du "_Init'. Et je continue...
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

J'arrive à générer les fichiers ASM au complet, et leurs petits frères d'extension O, les objets.

Par contre, quand j'essaie de créer le fichier Library (.A sous Linux, .Lib sous Windows), je n'arrive pas à générer le fichier. En ligne de commande, à la mano, aucun problème.

Code : Tout sélectionner

RunProgram("/usr/bin/ar rvs "+Chr(34)+"/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o", "", "", #PB_Program_Wait)
ou

Code : Tout sélectionner

RunProgram("ar rvs "+Chr(34)+"/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o", "", "", #PB_Program_Wait)
ou

Code : Tout sélectionner

RunProgram("/usr/bin/ar", " rvs "+Chr(34)+"/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o", "", #PB_Program_Wait)
ou

Code : Tout sélectionner

RunProgram("ar", " rvs "+Chr(34)+"/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o", "", #PB_Program_Wait)
Aucun fichier généré !...

Un bug dans PB 4.2 ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je suis surpris que sous linux on utilise le Chr(34) car sous windows c'est un reste du dos. Je n'ai pas la doc de PB sous linux mais si on doit mettre le chr(34) la règle que j'applique c'est un nombre pair de chr(34) qui représente le '".

Un chr(34) devant la chaine et un à la fin de la chaine.
Tous les problèmes de ligne de commande sous windows pour créer un asm ou un fichier lib venait pratiquement toujours de problème de Chr(34).

Voici deux de tes exemples corrigés (avec des variantes) et dis moi tout

Code : Tout sélectionner

RunProgram("/usr/bin/ar rvs", Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o"+Chr(34), "", #PB_Program_Wait)


RunProgram("/usr/bin/ar rvs", Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o"+Chr(34), "", #PB_Program_Wait)



RunProgram("/usr/bin/ar", Chr(34)+ " rvs "+Chr(34)+"/home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a"+Chr(34)+" /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o" +Chr(34), "", #PB_Program_Wait)


RunProgram("/usr/bin/ar", Chr(34)+ " rvs /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/LIB/Sample_00.a /home/franklin/Bureau/DD_PureBasic/Proj_Moebius/Lib_Source/Samples00/OBJ/*.o" +Chr(34), "", #PB_Program_Wait)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Aucun résultat :'(

J'ai fait un paquet avec juste la ligne de commande qui ne fonctionne pas et les fichiers objets pour faire l'archive.
File:1->Test_AR.zip
Image

Peut etre qu'un autre testeur linux pourra tester :)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Moi je me demande si le Chr(34) a lieu d'être mis car c'est un reste du dos.

Dans le fichier SDK de PB, il n'y a pas d'exemple de ligne de commande ?

Parce que moi linux, rien de rien même avec le tuto de SCRAT, il ne trouve pas un des paket que d'ailleurs je ne trouvais pas moi non plus.

J'ai désinstallé linux (celle que j'ai installé depuis Wndows avec ton lien car il me semble que c'est la version 64 qui s'est installé (j'ai regardé dans la faq) car ma bécane doit supporté certaines instructions.

J'ai voulu installer linux depuis le fichier iso converti sur DVD (les liens de Comtois), tout s'est bien passé sauf qu'il a été incapable de redimensionner la partition choisie, j'ai stoppé car il me proposais des choses que je ne comprenais pas.

Je vais monter cet après-midi un ancien disque dur, je vais débranché les autres et je vais bouter sur le DVD et installer sur l'ensemble du disque, on verra bien ce qu'il va se passer.

Je raffole de ces problèmes

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

Message par Progi1984 »

As tu essayé un outil de Virtualisation genre VirtualBox ?

Tu m'étonnes ces problèmes, ce sont ceux qui nous amusent le plus !

Si t'as installé la version X64; sure que cela va poser quelques problèmes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Pour le bug de génération des objets, cela venait de RunProgram. Le bug est ici :
http://www.purebasic.fr/english/viewtop ... 396#267396

Si tu veux le dernier code source du projet :
http://code.google.com/p/moebius-pb/

Je sais que j'avance sur les problèmes, grace à toi.
Merci.

Allez je continue... :)
Toujours le bug avec la version r12 du code :

Code : Tout sélectionner

[COMPILER]FunctionTest() is not a function, array, macro or linked list

Et pourtant une userlib est générée.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Pour l'instant, avec fasm j'ai un fichier o avec le code suivant

Code : Tout sélectionner

RunProgram("/home/jj/purebasic/compilers/fasm",  "/home/jj/purebasic/LIbrairie_Asm/FunctionTest.asm /home/jj/purebasic/LIbrairie_Asm/FunctionTest.o","",#PB_Program_Wait)
Bon, je met le chemin complet de fasm car sinon il n'est pas reconnu

mon fichier .bashrc contient ces lignes à la fin
alias pb=/home/jj/purebasic/compilers/purebasic
export PATH=$PATH:/home/jj/purebasic/compilers
Pour la lib je continue mes tests sous linux, je finirais par y arriver.

SI t'as des problèmes sous windows, je t'expliquerais les lignes de commandes que j'utilise.
Répondre