begin process at 2008 08 20 19:22:09
1 229 053 membres
410 nouveaux aujourd'hui
14 260 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : NASM et DEVCPP - fonction assembleur appellee en C/C++ [ Archives / c, c++ et asm ] (jean84)

NASM et DEVCPP - fonction assembleur appellee en C/C++ le 21/03/2006 10:31:12

jean84
Salut a tous !
Et bien comme le titre l'indique, je souhaiterai creer des fonctions en assembleur et pouvoir les appeller en C/C++ dans le meme projet. J'utilise devcpp 5 (beta) et nasm 0.98. J'ai vu divers tuto sur le net comme quoi il faut declarer la fonction global en asm, puis creer un fichier obj avec nasm mais tout ce que j'ai pu tester jusqu'a present c'est revele infructueux.... j'aimerai beaucoup pouvoir utilise ces 2 langages car je suis sur un moteur de jeux en 2D (genre zelda sur super nes) et je souhaiterai faire appelle a l'assembleur pour certains traitements... je precise que je suis completement novice en assembleur et que je ne souhaite pas changer de compilo (j'ai deja teste Visual C 6.O avec l'assembleur mais c'est vraiment trop limite).

En vous remerciant


"Avant même de fonctionner, tout programme est déjà obsolète."

Re : NASM et DEVCPP - fonction assembleur appellee en C/C++ le 21/03/2006 12:14:59

jean84
Alors apres quelques tours sur divers forums, j'ai trouve une syntaxe pour nasm... il faut assembler mon fichier avec les paramatres suivants : nasm -f win32 fichier.asm
Cependant, j'ai toujours mon probleme avec dev... lorsque je link ma fonction pas de probleme je n'ai aucune erreur par contre lorsque je l'utilise, rien ne va plus ...

Voila le code de mon fichier.asm :

[section .text]
    GLOBAL Function
   
; La fonction prend comme parametre un pointeur sur int
    Function :
        xor eax, eax
     
        mov eax, [esp+4]
        add eax, 1
    ret 4

[section .data]

et voici mon code sous dev :

#include <stdio.h>
#include <stdlib.h>

extern void Function( int * );

int main( void )
{
    int x = 0;
   
    while ( x <= 10 )
    {
        Function(&x);
        printf("Valeur de x : %d.\n", x);
    }
    system("pause");
    return 0;   
}

C'est un exemple bateau mais si j'arrive deja a utilise sa, je ne pense plus avoir de gros probleme apres.... voici le code d'erreur transmis par dev :

  [Linker error] undefined reference to `Function(int*)'
  ld returned 1 exit status
 C:\Documents and Settings\jean\Bureau\test\Makefile.win [Build Error]  [Project1.exe] Error 1

Merci pour vos eventuelles reponse
@+

"Avant même de fonctionner, tout programme est déjà obsolète."

Re : NASM et DEVCPP - fonction assembleur appellee en C/C++ le 21/03/2006 18:08:11

patatalo
Membre Club
(Admin CS)
salut, desassemble ton code sous dev, a mon avis, le parametre passé à la fonction est dépilé 2 fois. dans le fichier C, il faut préciser __fastcall ou un truc dans le genre. @++

Re : NASM et DEVCPP - fonction assembleur appellee en C/C++ le 21/03/2006 18:12:46

patatalo
Membre Club
(Admin CS)
re, si tu utilise un pointeur vers un int, ta fonction asm devrait etre: Function : mov eax, [esp+4] add dword [eax],1 ret 4 il faut peut etre mettre un underbarre aussi dans la déclaration de la fonction asm ou C. @++

Re : NASM et DEVCPP - fonction assembleur appellee en C/C++ le 21/03/2006 20:38:43

BruNews
(Admin CS)

Jean84 > en quoi c'est limite l'asm dans VC++ ???
On insère direct les fichiers ASM dans le projet donc en PUR ASM, je ne vois pas en quoi on serait donc limité.

Fichier ASM dans Visual Studio
Clic droit sur fichier, Settings et mettre
ml.exe -c -coff -Cx -Fo$(IntDir)\$(InputName).obj $(InputName).asm
$(IntDir)\$(InputName).obj

VS 2005:
Clic drot propriétés sur fichier ASM:
General: Custom Build Tool
Command Line: ml64.exe -c -Cx /nologo -Fo$(IntDir)\$(InputName).obj $(InputName).asm
Outputs: $(IntDir)\$(InputName).obj

ciao...
[ Lien ]
BruNews, MVP VC++


Re : NASM et DEVCPP - fonction assembleur appellee en C/C++ le 23/03/2006 15:06:35

jean84

BruNews => Heu en fait il y a quelque temps ne possedant pas de compilateur asm, je me suis tourne vers Visual C 6.0 pour ecrire des routines en assembleur car je savais que cet edi gere la fonction asm{} mais helas il y a quelques fonctions en assembleur qui n'etait pas parfaite comme par exemple si tu utilise un offset + la valeur d'un registre pour te deplacer, Visual C me repondait que l'instruction n'etait pas reconnu (maintenant, sachant que je suis un debutant et que je n'ai pas la science infuse, c'est possible que j'ai pu me tromper dans la redaction de mon code mais j'ai quand meme essaye pas mal de fois et de differente manieres ...) et puis par rapport a mon probleme actuel, je n'aime pas trop utilise Visual C car deja ma license n'est pas la mienne a proprement parle  (merci le net) et que je trouve que c'est une usine a gaz par rapport a dev (mais bon la on s'eloigne du sujet). Je vais bien entendu tester ta solution et je te remercie d'avoir pris le temps de me repondre.

 
Patatalo => je savais bien que je faisait une erreur en ne mettant que add eax, 1 au lieu de add dword[eax] , 1 mais c'est encore trop nouveau pour moi, j'ai un peu de mal... Et quand tu parles de "underbarre", j'imagine que tu veux dire "underscore" a la place non ? Et ou le mettre ? Dans la decalration de la fonction en C ou dans le fichier asm a cote de GLOBAL ?? J'ai egalement essaye de linker avec Visual C mais pareille, quand je ne mettais que obj a la place de win32 dans les parametres de nasm, Visual me disais carrement que mon fihcier obj etait corrompu mais depuis le nouveau parametre, la il me dit simplement qu'il n'arrive pas a linker la fonction demande....

Au secours SVP !!! J'ai vraiment besoin d'y parvenir mais la je seche completement !!!
@++

"Avant même de fonctionner, tout programme est déjà obsolète."


Re : NASM et DEVCPP - fonction assembleur appellee en C/C++ le 27/03/2006 08:46:40

Nasman

Bonjour jean84,

En regardant la déclaration de ta fonction sous Nasm, je me demande s'il ne manque pas la directive export pour définir le nom de ta fonction.

Essaie la déclaration suivante:

[section .text]
    GLOBAL Function
    Export Function

C'est le type de déclaration à mettre lorsque l'on créé une dll avec Nasm. Est-t-elle nécessaire si l'on lie le fichier objet au projet lors de l'édition de liens, je ne sais pas.

Autre chose : est-ce que le nom de "Function" (si c'est réellement le nom que tu as déclaré) ne correspond pas déjà avec un autre type d'objet ?

A+


Re : NASM et DEVCPP - fonction assembleur appellee en C/C++ le 27/03/2006 10:52:06

jean84
Oh merci pour l'astuce... je n'y avais pas pense... et c'est vrai que sa parait logique.... je vais essaye sa des ce soir et je te dirais si cela focntionne... Pour le nom 'Function', c'etait uniquement un nom generique que j'ai mis lorsque j'ai code l'exemple pour le forum mais meme avec d'autre nom sa ne passe pas (exemple : MyFunction() et DetectColision() - je fais un moteur 2d avec SDL- ), j'obtiens toujours la meme erreur... je verrais ce soir sans faute...
Merci a toi  Nasman !

"Avant même de fonctionner, tout programme est déjà obsolète."

Re : NASM et DEVCPP - fonction assembleur appellee en C/C++ le 27/03/2006 11:23:22

jean84
Alors sa y est j'ai tester et je viens d'avoir une nouvelle erreur (la 4e exactement). Dev me repond avec un  " symbol not found " est rien d'autre (pas de numero de ligne, pas de fichier particuliers mis en cause....). Sniff je suis decu.... .... pas d'autre idee...

"Avant même de fonctionner, tout programme est déjà obsolète."

Re : NASM et DEVCPP - fonction assembleur appellee en C/C++ le 30/03/2006 10:56:06

Nasman

Bonjour jean84,

En relisant ma doc sur Nasm j'ai trouvé une raison qui pourrait expliquer le message d'erreur
[Linker error] undefined reference to `Function(int*)'
Sauf erreur de ma part:
Lorsque l'on compile un programme en C avec une fonction appelée Function, le nom exporté est _Function.
Lorsque l'appel provient d'un programme écrit en C (appel de Function), le programme compilé recherchera le nom de _Function.

Pour que ta routine écrite avec Nasm puisse être appelée avec un programme en C, il faut que son nom soit _Function.

Soit
[section .text]
    GLOBAL _Function
   
; La fonction prend comme parametre un pointeur sur int
    _Function :
        xor eax, eax
     
        mov eax, [esp+4]
        add eax, 1
    ret 4

Remarque: l'instruction  xor eax, eax est inutile ici

A+



[Page 1 Page 2]
Classé sous : fonction, assembleur, devcpp, nasm, appellee

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
extraction dinformatio...
Budget : 300€
campagne Adwords
Budget : 5 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS