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 fcartegnie . É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 popcorn . Évalué à 1.
Selon quelle logique ?
[^] # Re: args
Posté par Kerro . Évalué à 3.
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 fcartegnie . É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 David Marec . Évalué à 2.
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 David Marec . É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 cosmoff . É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.