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)

mardi 21 mars 2006 à 10:31:12 | NASM et DEVCPP - fonction assembleur appellee en C/C++

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."

mardi 21 mars 2006 à 12:14:59 | Re : NASM et DEVCPP - fonction assembleur appellee en C/C++

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."

mardi 21 mars 2006 à 18:08:11 | Re : NASM et DEVCPP - fonction assembleur appellee en C/C++

patatalo

Membre Club Administrateur CodeS-SourceS
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. @++

mardi 21 mars 2006 à 18:12:46 | Re : NASM et DEVCPP - fonction assembleur appellee en C/C++

patatalo

Membre Club Administrateur CodeS-SourceS
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. @++

mardi 21 mars 2006 à 20:38:43 | Re : NASM et DEVCPP - fonction assembleur appellee en C/C++

BruNews

Administrateur CodeS-SourceS

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++


jeudi 23 mars 2006 à 15:06:35 | Re : NASM et DEVCPP - fonction assembleur appellee en C/C++

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."


lundi 27 mars 2006 à 08:46:40 | Re : NASM et DEVCPP - fonction assembleur appellee en C/C++

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+


lundi 27 mars 2006 à 10:52:06 | Re : NASM et DEVCPP - fonction assembleur appellee en C/C++

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."

lundi 27 mars 2006 à 11:23:22 | Re : NASM et DEVCPP - fonction assembleur appellee en C/C++

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."

jeudi 30 mars 2006 à 10:56:06 | Re : NASM et DEVCPP - fonction assembleur appellee en C/C++

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+



1 2

Cette discussion est classé dans : fonction, assembleur, devcpp, nasm, appellee


Répondre à ce message

Sujets en rapport avec ce message

rs232 & assembleur& c++ version microsoft [ par elbair32 ] bonjour;je n'arrive pas à ecrire une fonction sur c++ en utilisant dedant des mnemoniques Tasm pour gérer les ports série je sais comment sa se fait e Quel assembleur choisir ? [ par trinitacs ] J'aimerai savoir quel est le meilleur assembleur qui existe ou si il en faut mixer. Je début difficielment l'asm avec NASM. Faut-il choisir MASM, TASM mettre un son avec nasm [ par ricardvince ] bonjour je suis debutant en assembleur et jaurais aimais savoir s'il ete possible de mettre un son dans un programme en assembleur (avec nasm)???merci function et assembleur de delphi [ par barbichette ] Bonjour,j'ai un souci avec l'assembleur.J'ai un type TMyType=array[0..100] of byte;et une fonction :Function Calcul(a,b:TMyType):TMyType;assembler;asm [nasm] ligne de commande [ par Kevin68 ] Bonjour :),Je suis débutant en assembleur, j'utilise nasm sous linux.J'ai cherché partout un exemple de code source qui me permettrait de récupérer le Quel est l'assembleur le plus rapide ? [ par epineurien ] Salut à tous !Une nouvelle question , suite à quelques infos trouvées sur le net ...J'utilise MASM32 , mais de nombreux sites dises qu'il produit un c Fonction pour prendre la souris en assembleur. [ par nico20011caus ] Je fais de l'assembleur un peut et je voudrai savoir comment qu'on fait pour prendre la souris en assembleur.Moi je fait: mov ax,1                  &n Format d'assemblage win32 avec Nasm [ par Nasman ] Bonjour, En relisant la documentation de Nasm j'ai vu que pour obtenir un fichier win32 executable il était possible d'utiliser le format suivant: na cours assembleur 68000 [ par ofthechurch ] Bonjours, je cherche des tuoriels, des cours ou des livres portant sur la prorammation en assembleur sur 68000, j'ai trouvé quelque vague trucs sur go Directive Invoke [ par bazole ] BonjourJ'étudie la possibilité de créer un petit assembleur sous windows, et j'ai du mal à comprendre comment faire appel à une API windows.Sous Masm,


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

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



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.