Partage
  • Partager sur Facebook
  • Partager sur Twitter

Integrer de l'Assembleur à du C

Je sais que c'est possible mais je ne sais pas faire

Anonyme
    12 juillet 2007 à 20:55:43

    Bonsoir ou bonjour à vous ^^ ,

    J'ai beau chercher mais je ne trouve pas. J'aimerais intégrer un code Asembleur à un code C.

    Donc comment on créer des procédures carrément dans le code ?
    et
    comment on créer une librairie en ASM utilisable par du C ?

    Au fait, j'utilise Code Block :) sous Windows :(

    Si possible avec un petit exemple. Merci !

    Désolé encore si ça a déjà était dit mais j'ai pas trouvé. :-°
    • Partager sur Facebook
    • Partager sur Twitter
      12 juillet 2007 à 21:04:38

      euh tout simplement la fonction asm() non ?
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        12 juillet 2007 à 22:21:17

        Et comment ça marche ? ^^
        • Partager sur Facebook
        • Partager sur Twitter
          12 juillet 2007 à 23:26:34

          pour intégrer de l'ASM directement dans du code C y'a plusieurs technique en fonction du compilateur et c'est hyper moche (de mon point de vue).

          tu mets "global ta_fonction" dans ton fichier ASM et dans ton code C tu mets simplement la définition "void ta_fonction(params_si_besoin)"

          et tu link ensemble les fichiers .o, ex avec nasm
          nasm -o file.o file.asm
          gcc -c main.c -o main.o
          gcc main.o file.o -o prog
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            13 juillet 2007 à 9:13:35

            Merci !

            Je vais faire :
            asm
            {
                ;mes instructions asm
            }



            Parce que j'ai pas trop compris ton système avec linker l'objet. Tu link le fichier objet obtenu avec le compilateur C avec l'objet du compilateur ASM ?
            • Partager sur Facebook
            • Partager sur Twitter
              14 juillet 2007 à 19:01:03

              C'est des binaires donc ca devrait pas poser probleme.

              Pour integrer l'ASM directement dans le C ... pouah horrible avec GCC, asm{ } ne marche pas, c'est de l'ASM inline.

              Kurapix
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                14 juillet 2007 à 19:16:57

                Ben je fais comment MOI ? :p
                • Partager sur Facebook
                • Partager sur Twitter
                  14 juillet 2007 à 20:06:04

                  __asm__ __volatile__("xor %eax, %eax");

                  Chez moi, ce code passe.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    15 juillet 2007 à 11:46:47

                    a chaque instruction asm je tape _asm_ _volatile_("mon instruction") ? Ou je peut taper tout un code dans les parenthèses ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 juillet 2007 à 13:03:06

                      merci d'utiliser la fonction recherche du site : ici
                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 juillet 2007 à 17:51:51

                        hello
                        j'ai un code fait pour être compilé sous visual:

                        void WaitClockUp()
                        {
                        WCU:
                        __asm {
                        mov dx,adrs
                        inc dx // input adress = output adress+1
                        in al,dx // reads the LPT port
                        and al,clockmask // extracts the clock signal
                        jz WCU // jumps if clock=0
                        };
                        }

                        j'aimerais le compiler sous codeblock (sous XP)

                        Alors, j'essaye de suivre vos conseils, j'ai remplacé, par ex, __asm { mov dx,adrs par __asm__("mov dx,adrs"); ou __asm__ __volatile__("mov dx,adrs"); ou encore asm("mov dx,adrs"); mais ca me donne à la compil "too many references for mov"

                        un conseil?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 juillet 2007 à 20:23:42

                          __asm__ __volatile__("movl $0, %dx")


                          Ceci fonctionne.
                          Mais où est déclaré ton 'adrs' ?

                          Cadeau :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 juillet 2007 à 20:37:02

                            Citation : Max la menace

                            Ben je fais comment MOI ? :p


                            Au début le plus simple c'est de faire de l'ASM in-line mais ça t'impose la syntaxe du compilateur. Il n'y a pas de solution miracle, il faut voir dans la documentation.
                            Tu peux aussi assembler ta routine puis refiler le fichier objet au linker du C, mais il faut faire gaffe aux conventions d'appel. Tout est expliqué ici : http://beuss.developpez.com/tutoriels/pcasm/
                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 juillet 2007 à 21:07:05

                              D'ailleurs où est déclaré ton 'adrs' ?
                              #define adrs 0x378 // LPT1 port adress

                              précision: je connais très peu l'assembleur

                              je veux juste pouvoir utiliser dans codeblock des routines qui sont écrites (comme WaitClockUp) pour visual
                              je tape quoi alors?
                              __asm__ __volatile__("mov $adrs, %dx"); ? c'est pareil que mov dx,adrs ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 juillet 2007 à 10:09:43

                                Tu ne peux pas déclarer 'adrs' en C et l'introduire comme ça en ASM;
                                J'ai voulu faire:
                                __asm__ __volatile__("movl $adrs, %%dx"::"adrs" (adrs))

                                Mais le compilo s'en fiche: [Linker error] undefined reference to `adrs'

                                Alors, fait tout simplement:
                                __asm__ __volatile__("movl $0x378, %dx")
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  29 juillet 2007 à 11:58:11

                                  oui, je suis arrivé à la même conclusion (mais comme on peut pas répondre 2fois de suite...). Sinon, adrs est static, non? ne faudrait-il pas, selon ta doc, rajouter un _?
                                  en lisant ta doc, je vois que 0x378 est l'écriture AT&T de 378h? pourquoi n'est-il pas écrit "#define adrs 378h // LPT1 port adress" dans le prog visual que j'ai?

                                  in al,dx // reads the LPT port
                                  ensuite, je ne trouve pas la fonction "in" (ni dans ta doc ni dans celle de dap) et j'ai beau inverser al et dx, rajouter ou non des $ ou des %, rien n'y fait

                                  ce ne sont pas les seules lignes que je dois modifier, il y a aussi les instructions shl, add, je, cmp, jne, and, jmp, jnz, xor, rcl, shr, rcr et loop
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    29 juillet 2007 à 13:06:56

                                    Oui, tu dois tout modifier puisqu'en AT&T, pour:
                                    mov eax, 9

                                    Tu vas devoir écrire:
                                    movl $9, %eax


                                    Donc, tu as du boulot ^^
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      29 juillet 2007 à 13:09:33

                                      Tu ne pourrais pas utiliser un compilateur qui reconnaît la syntaxe Intel ? Ce serait beaucoup plus simple surtout si tu ne connais pas bien l'assembleur.
                                      Sinon tu peux trouver facilement des liens qui expliquent les différences de syntaxe :
                                      http://sig9.com/articles/att-syntax
                                      http://www.imada.sdu.dk/~kslarsen/dm18/Litteratur/IntelnATT.htm
                                      http://www.w00w00.org/files/articles/att-vs-intel.txt
                                      http://www.google.com/search?hl=fr&q=syntax+at%26t&btnG=Rechercher&lr=
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        29 juillet 2007 à 13:23:40

                                        Citation : PianoPâriss


                                        mov $9, %eax




                                        exactement c'est ca .

                                        movl $9 , %eax 
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          29 juillet 2007 à 14:44:46

                                          J'ai dis que je connaissais pas bien la syntaxe AT&T....
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Integrer de l'Assembleur à du C

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown