GCC extended asm, encodage de décalage d’élément struct

J’essaie d’écrire une petite partie de mon code dans le style GCC étendu asm (cible x86-64) et j’ai des difficultés à coder les décalages de structure.

J’ai une struct s avec un membre size_t a[] , un pointeur sur une telle structure et un index qui sont générés dans le bloc asm.

Maintenant, je dois aborder cet élément dans asm

 asm ( "mov %[displ](%[s], %[index], 8), %%rbx" : [s] "+r" (s) , [index] "+r" (i) : "memory", "cc", "rax", "rbx" ); 

Comment puis-je encoder dans le bloc asm? Passer offsetof(struct s, a) comme préfixe immédiat lui vaut $ et génère un assembly invalide.

 asm ( "mov %[displ](%[s], %[index], 8), %%rbx" : [s] "+r" (s) , [index] "+r" (i) : [displ] "i" (offsetof(struct s, a)) : "memory", "cc", "rax", "rbx" ); 

C’est en fait possible en utilisant le modificateur d’opérande %c... :

 #include  #include  struct s { int a, b; }; int foo (struct s *s, int i) { int r; asm ( "movl %c[displ](%[s],%[index],8), %[r]\n\t" : [r] "=r" (r) : [s] "r" (s) , [index] "r" ((uintptr_t)i), [displ] "e" (offsetof(struct s, b)) : ); return r; } 

Merci où merci est dû – trouvé que ici . Une liste de diffusion gcc fait également référence à cette liste ; les mots-clés il y a “substitution de sortie”.
L’écriture stackoverflow Que signifie% c dans le code d’assemblage en ligne de GCC? a également une explication sur %c en particulier.

Votre seule option est d’utiliser la syntaxe Intel. Bien sûr, GCC peut générer des insn like like mov off(base, index, scale) , mais le fait au niveau des expressions MEM RTL entières, c’est-à-dire qu’il n’a pas de décalage, de base, etc. comme des opérandes individuels.

Donc, syntaxe Intel, comstackz ce qui suit avec gcc -c -masm=intel xc :

 #include  struct s { int a, b; }; int foo (struct s *s, int i) { int r; asm ( "mov %[r], dword ptr [%[s]+%[index]*8 + %[displ]] " : [r] "=r" (r) : [s] "r" (s) , [index] "r" (i), [displ] "e" (offsetof(struct s, b)) : ); return r; }