IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Error C2415: type d'opérande incorrect


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 44
    Points : 0
    Points
    0
    Par défaut Error C2415: type d'opérande incorrect
    Bonjour,

    j'ai trois erreurs : là ou j'utilise les push offset et je comprends pas pourquoi j'ai ces erreurs
    j'ai indiqué dans mon code en commentaire l'endroit ou j'ai une erreur du compilateur visual c++ 2010 express
    ça serait possible de m'expliquer pourquoi merci pour votre aide
    le programme est une boucle for de 0 à 4 : i=0,i<4;i++
    je fais un scanf d'un nombre ival et je fais la somme et en dehors de la boucle for j'affiche la somme
    exemple je fais quatre scanf pour demander d'entrer un nombre
    et si j'entre 1 2 3 4
    j'affiche la somme est egale à 10


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    #include <stdio.h>
    void
    	main()
    {
    	int iVal;
    	int isomme;
    	int nbl=4;
    	int i =0;
    	char acFormatSaisie[]="%d";
    	char acTxtSaisie1[]="Entrez le nombre iVal : ";
    	char acFormatAffichage[]="La somme est egale a : %d ";
    	_asm
    	{
    		        mov i,0
    		   debutbcl:
     
    			    mov eax,i
    			    cmp eax,nbl
    			    jnb finbcl
     
    			    push  offset acTxtSaisie1//le compilateur me met une erreur ici 
    			    call dword ptr printf
    				add esp,4
     
    				push  iVal
    				push  offset acFormatSaisie//le compilateur me met une erreur ici
    				call dword ptr scanf
    				add esp,8
     
    				mov eax,iVal
    				mov ebx,isomme
    				add ebx,eax
    				mov isomme,ebx
     
    				inc i
    				jmp debutbcl
     
    	       finbcl:
    			    push isomme
    				push offset acFormatAffichage//le compilateur me met une erreur ici
    				call dword ptr printf
    				add esp,8
     
    	}
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    acFormatSaisie, acTxtSaisie1 et acFormatAffichage sont trois chaines définies comme variables locales.
    A l'exécution, elles seront placées sur la pile.
    Mais au moment de la compilation, il est impossible de prévoir leur adresse : où sera le sommet de la pile à l'entrée dans la fonction ?
    Il n'est donc pas possible de connaître l'offset de ces variables au moment de la compilation.

    Heureusement, il existe une instruction assembleur qui permet de résoudre ce problème: lea, acronyme de "Load Effectif Adress".
    Cette instruction place dans un registre l'adresse d'une variable au moment de l'exécution.

    Il suffit donc de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     push  offset acTxtSaisie1
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     lea  eax,acTxtSaisie1
     push eax
    et idem pour les deux autres variables.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 44
    Points : 0
    Points
    0
    Par défaut
    quand je compile ça met une erreur avec lea/ j'ai essayé de faire des push et lea dans des registres differents genre ecx mais ça marche pas non plus
    j'utilise les registres eax et ebx pour comparer i et nbl pour voir si j'arrive à la fin de la boucle et pour mettre en mémoire une somme

    Exception non gérée à 0x0f3de42e (msvcr100d.dll) dans ex2assembleur.exe*: 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0xcccccccc.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <stdio.h>
    void
    	main()
    {
    	int iVal;
    	int isomme;
    	int nbl=4;
    	int i =0;
    	char acFormatSaisie[]="%d";
    	char acTxtSaisie1[]="Entrez le nombre iVal : ";
    	char acFormatAffichage[]="La somme est egale a : %d ";
    	_asm
    	{
    		        mov i,0
    		   debutbcl:
     
    			    mov eax,i
    			    cmp eax,nbl
    			    jnb finbcl
     
    			   // push  offset acTxtSaisie1 met une erreur ça a été placé au sommet de la pile mais à  la compilation opeut pas prévoir leur adresse
    			    lea  eax,acTxtSaisie1
                    push eax
    			    call dword ptr printf
    				add esp,4
     
    				push  iVal
    				//push  offset acFormatSaisie met une erreur ça a été placé au sommet de la pile mais à  la compilation opeut pas prévoir leur adresse
    				 lea  ebx,acFormatSaisie
                     push ebx
    				call dword ptr scanf
    				add esp,8
     
    				mov eax,iVal
    				mov ebx,isomme
    				add ebx,eax
    				mov isomme,ebx
     
    				inc i
    				jmp debutbcl
     
    	       finbcl:
    			    push isomme
    			//	push offset acFormatAffichage met une erreur ça a été placé au sommet de la pile mais à  la compilation opeut pas prévoir leur adresse
    				 lea  ecx,acFormatAffichage
                     push ecx
    			    call dword ptr printf
    				add esp,8
     
    	}
    }

  4. #4
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    quand je compile ça met une erreur avec lea/ j'ai essayé de faire des push et lea dans des registres differents genre ecx mais ça marche pas non plus
    j'utilise les registres eax et ebx pour comparer i et nbl pour voir si j'arrive à la fin de la boucle et pour mettre en mémoire une somme
    Le compilateur refuse l'instruction lea ?

    Pourtant, la phrase
    Exception non gérée à 0x0f3de42e (msvcr100d.dll) dans ex2assembleur.exe*: 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0xcccccccc.
    indique que le programme a été lancé, ce qui n'est possible que si la compilation a réussi.

    Tout cela n'est pas clair ...

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 44
    Points : 0
    Points
    0
    Par défaut
    Essaie de le compiler tu verras bien que ça ne marche pas... et comme ça tu verras exactement ce qui se passe.
    Quand je compile, il y a input.c qui s'ouvre et l'instruction se bloque là >>>>>>>>>>>>>>>>>>>
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    assign_num:
                                    if ( integer64 )
                                        *(__int64 UNALIGNED *)pointer = (unsigned __int64)num64;
                                    else
                                    if (longone)
     >>>>>>>>>>>>         *(long UNALIGNED *)pointer = (unsigned long)number;
                                    else
                                        *(short UNALIGNED *)pointer = (unsigned short)number;
     
                                } else /*NULL*/;
                            else
                                goto error_return;
     
                            break;

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Si c'est le code C qui te bloque peut être que la question doit être au forum C est non ici.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 44
    Points : 0
    Points
    0
    Par défaut asm
    Je compile sous Visual C++ 2010 Express et quand je compile mon code assembleur ça ouvre le fichier input.c ?
    Je ne vois pas pourquoi tu dis langage C.
    Peut-être que tu n'as pas lu tous les messages ? C'est quand je compile que ça met une erreur et ça ouvre un fichier C où s'est arrretée l'instruction.
    Le fichier input.c n'est pas écrit par moi mais c'est un fichier de Visual C++ 2010.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 40
    Points : 63
    Points
    63
    Par défaut
    Bonjour

    Je vais surement poser une question con mais

    C'est quoi l'utilité de faire ça en asm?
    Bros

  9. #9
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    C'est une bonne question mais je suppose que c'est une demande d'un prof ou un exercice de cours.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 44
    Points : 0
    Points
    0
    Par défaut asm
    bonjour

    ça va j'ai trouvé mon erreur j'avais pas mis push offset iVal (j'avais mis push iVal)
    et les deux solutions marchent avec lea et celle que j'avais mis au début
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include <stdio.h>
    # define nbl 4
     
    int iVal;
    	int isomme;
    	int i =0;
    	char acFormatSaisie[]="%d";
    	char acTxtSaisie1[]="Entrez le nombre iVal : ";
    	char acFormatAffichage[]="La somme est egale a : %d ";
    void main()
    {
     
    	_asm
    	{
    		        mov i,0
    		   debutbcl:
     
     
    			    cmp i,nbl
    			    jnb finbcl
     
    			   push  offset acTxtSaisie1 
    		//	   lea  ecx,acTxtSaisie1
                //   push ecx
    			    call dword ptr printf
    				add esp,4
     
    				push  offset iVal
    				push  offset acFormatSaisie
    			//	 lea  ecx,acFormatSaisie
                 //   push ecx
    				call dword ptr scanf
    				add esp,8
     
    				mov eax,iVal
    				mov ebx,isomme
    				add ebx,eax
    				mov isomme,ebx
     
    				inc i
    				jmp debutbcl
     
    	       finbcl:
    			    push isomme
    			push offset acFormatAffichage 
    				//lea  ecx,acFormatAffichage
                   //  push ecx
    			    call dword ptr printf
    				add esp,8
     
    	}scanf("%d",&i);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Status: 500 Internal Server Error Content-Type: text/html
    Par hackiles dans le forum Ruby on Rails
    Réponses: 3
    Dernier message: 22/01/2008, 21h33
  2. Réponses: 8
    Dernier message: 07/01/2008, 17h47
  3. run time error 13, type mismatch
    Par robert_trudel dans le forum Access
    Réponses: 6
    Dernier message: 27/10/2006, 02h30
  4. error: incompatible types in assignment
    Par panda31 dans le forum C
    Réponses: 2
    Dernier message: 13/06/2006, 10h46
  5. opérateur non applicable à ce type d'opérande
    Par Amon dans le forum Langage
    Réponses: 3
    Dernier message: 11/06/2003, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo