Forum Programmation.c mettre de l'assembleur dans du C

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
16
août
2019

Bonjour à tous,

dans le seul but de m'amuser j'aimerai afficher du texte sur mon terminal via de l'assembleur dans du C.

Voici mon code :
#include

int main(int argc, char const *argv[])
{   
    const char *str = "coucou\n";
    asm("movq str,%rsi");
    asm("movq $7,%rdx");
    asm("movq $1,%rdi");
    asm("movq $1,%rax");
    asm("syscall");
    return 0;
}

le probleme est ma ligne : asm("movq str,%rsi");
Le terminal me renvoie :
réadressage R_X86_64_32S vers non défini symbole « str » ne peut pas être utilisé en créant un objet PIE

j'ai essayé d'ajouter dans gcc -fPIC mais ca ne change rien. J'ai un peu de mal avec la synthaxe AT&T donc le probleme vient peut etre de la.

Merci d'avance pour votre aide

  • # args

    Posté par  . Évalué à 3. Dernière modification le 16 août 2019 à 13:24.

    c'est juste pas comme ça qu'on passe les args aux registres.

    -> InputOperands

    https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

    En plus movq c'est inter registres..

    • [^] # Re: args

      Posté par  . Évalué à 1.

      En plus movq c'est inter registres..

      Selon quelle logique ?

    • [^] # Re: args

      Posté par  . Évalué à 3.

      En plus movq c'est inter registres

      Je n'ai pas regardé le reste, mais ça c'est sûr que non.
      Exemple : https://c9x.me/x86/html/file_module_x86_id_201.html

      • [^] # Re: args

        Posté par  . Évalué à 2. Dernière modification le 17 août 2019 à 17:35.

        Oui, j'ai merdé.
        Je voyais ça comme pas possible dans ton code parce que pas aligné, mais l'arch s'en fout.

    • [^] # Re: args

      Posté par  . Évalué à 2.

      En plus movq c'est inter registres..

      Surtout, movq fonctionne comme toutes les fonctions de copie: le premier argument est la destination(cible).
      Là, j'ai l'impression que l'auteur veut faire l'inverse.
      En fait, je comprend pas trop ce qu'est sensé faire ce code.

      • [^] # Re: args

        Posté par  . Évalué à 2.

        Au temps pour moi, on est en syntaxe GNU (ou AT&T), où le sens est contraire de la syntaxe INTEL.
        Ceci dit, pour accéder au registre, il faut doubler le "%":

        En bref, vu que je n'ai pas trop compris ce voulais faire l'OP:

        __asm("movq %%rsi,%0" : "=r" (str));
        __asm("movq $7,%rdx \n\
        movq $1,%rdi \n\
        movq $1,%rax \n\
        syscall");

        • [^] # Re: args

          Posté par  . Évalué à 1.

          merci pour vos réponses.

          Ca marche avec le code :

          char *str = "coucou\n";

          asm("movq %0, %%rsi" : "=r" (str));

          asm("movq $8,%rdx");
          asm("movq $1,%rdi");
          asm("movq $1,%rax");
          asm("syscall");

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.