Depuis que je suis très nouveau dans GCC, je suis confronté à un problème de code d’assemblage en ligne. Le problème est que je ne suis pas capable de comprendre comment copier le contenu d’une variable C (de type UINT32
) dans le registre eax
. J’ai essayé le code ci-dessous:
__asm__ ( // If the LSB of src is a 0, use ~src. Otherwise, use src. "mov $src1, %eax;" "and $1,%eax;" "dec %eax;" "xor $src2,%eax;" // Find the number of zeros before the most significant one. "mov $0x3F,%ecx;" "bsr %eax, %eax;" "cmove %ecx, %eax;" "xor $0x1F,%eax;" );
Cependant mov $src1, %eax;
ne fonctionne pas.
Quelqu’un pourrait-il suggérer une solution à cela?
Je suppose que ce que vous recherchez est un assemblage prolongé, par exemple:
int a=10, b; asm ("movl %1, %%eax; /* eax = a */ movl %%eax, %0;" /* b = eax */ :"=r"(b) /* output */ :"r"(a) /* input */ :"%eax" /* clobbered register */ );
Dans l’exemple ci-dessus, nous avons rendu la valeur de b
égale à celle de a
utilisant des instructions d’assemblage et un registre eax
:
int a = 10, b; b = a;
S’il vous plaît voir les commentaires en ligne.
Remarque:
mov $4, %eax // AT&T notation mov eax, 4 // Intel notation
Une bonne lecture sur l’ assemblage en ligne dans l’environnement GCC.