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

C Discussion :

Probleme code asm dans .c


Sujet :

C

  1. #1
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut Probleme code asm dans .c
    Salut, j'aimerais intégrer des bouts de code assembleur dans mon .c mais j'ai des soucis au niveau des variables...
    j'ai fais un .c test qui ne contient que de l'assembleur (pour le moment donc) et qui affiche un message à l'écran
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
       _asm
       {
          msg db "salut",'$'
     
          mov ah,09h
          mov dx,offset msg
          int 21h
       }
       return 0;
    }
    Je compile sous visualC++ et il me sort 2 erreurs :
    main.c(6)error C2400: erreur de syntaxe d'assembleur inline dans 'opcode' ; trouvé 'db'
    main.c(8)error C2443: conflit de taille d'opérande
    je pense que cela vient de
    car si je fais simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <...>
    _asm
    {
       push ax
       pop bx
    }
    <...>
    return 0;
    }
    ça compile très bien
    Voila, j'espere que vous allez pouvoir m'aider
    Merci pour vos réponses

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Probleme code asm dans .c
    Citation Envoyé par sorry60
    Salut, j'aimerais intégrer des bouts de code assembleur dans mon .c
    Euh, t'es sûr ? Parce que c'est quand même la dernière des choses à faire...
    mais j'ai des soucis au niveau des variables...
    j'ai fais un .c test qui ne contient que de l'assembleur (pour le moment donc) et qui affiche un message à l'écran
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
       _asm
       {
          msg db "salut",'$'
     
          mov ah,09h
          mov dx,offset msg
          int 21h
       }
       return 0;
    }
    Je compile sous visualC++ et il me sort 2 erreurs :
    main.c(6)error C2400: erreur de syntaxe d'assembleur inline dans 'opcode' ; trouvé 'db'
    main.c(8)error C2443: conflit de taille d'opérande
    Je pense que les variables (DB : Define Byte) doivent être placées dans un autre segment. Détails sur le forum 'assembleur'.

    Le mieux encore est d'utiliser les variables du C...

    Ceci fonctionne chez moi (Borland C++ 3.1 mode 8086 réel modèles SMALL et LARGE)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main (void)
    {
       static char msg[] = "Hello world\n\r$";
     
       asm mov ah, 09h
       asm mov dx, offset msg
       asm int 21h
     
       return 0;
    }
    Le 'static' assure un référencement par rapport à DS...

  3. #3
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    sorry60 a écrit:
    Salut, j'aimerais intégrer des bouts de code assembleur dans mon .c

    Euh, t'es sûr ? Parce que c'est quand même la dernière des choses à faire...
    pourquoi dis tu ça ? je viens de coder une fonction asm permettant d'afficher un sprite, c'est plus marrant de l'utiliser plutot que d'utiliser le draw_sprite() (bien que largement meilleur je pense) fournit avec allegro.
    c'est juste pour le fun.
    non?
    Je pense que les variables (DB : Define Byte) doivent être placées dans un autre segment. Détails sur le forum 'assembleur'.
    tout à fait, sur le segment de données, mais quand je le mettais, le compilateur s'exitait encore plus

    merci pour ton aide, c'est vrai que c'est plus pratique de mettre les variables en C, je ne savais pas comment faire, maintenant oui, merci à toi

  4. #4
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    sous VisualC++, je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(void)
    {
       static char chaine[] = "Salut !\n\r$";
       _asm
       {
          mov ah,09h
          mov dx,offset chaine
          int 21h
       }
       return 0;
    }
    mais le compilateur me sort 1 erreur :
    main.c(6) : error C2443: conflit de taille d'opérande
    je ne comprend pas , pourtant le code asm est bon, il y a bien les balises

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sorry60
    sous VisualC++, je fais ça :
    <...>
    main.c(6) : error C2443: conflit de taille d'opérande
    Tu es en 32 bits. Ca n'a aucune chance de fonctionner (probablement pas d'int 21h) De plus, il faudrait utiliser les registres étendus (EAX, EDX etc.)

    Ce genre de bidouille ça se fait en MS-DOS mode réel, c'est tout... Sous XP, laisse tomber...

  6. #6
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Ce genre de bidouille ça se fait en MS-DOS mode réel, c'est tout... Sous XP, laisse tomber...
    ok merci pour ton aide

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

Discussions similaires

  1. Inclusion de code asm dans C++ : récuperation d'un label
    Par stc074 dans le forum Assembleur
    Réponses: 0
    Dernier message: 06/01/2013, 19h02
  2. Probleme code iframe dans variable php
    Par thildouille dans le forum Langage
    Réponses: 3
    Dernier message: 21/05/2011, 10h21
  3. Code asm dans une macro C
    Par progfou dans le forum C
    Réponses: 11
    Dernier message: 01/03/2006, 18h50
  4. [PHP-JS] Probleme de javascript dans un code php
    Par stomerfull dans le forum Langage
    Réponses: 20
    Dernier message: 12/01/2006, 13h41
  5. [TP]code asm dans une procedure
    Par M.Dlb dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 17/08/2002, 20h43

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