C'est la première fois que j'écris du code assembleur. Au premier début, j'ai écrit
#include<stdio.h>
int main(){
int x,y;
asm("movl $2,%eax");
asm volatile(
"movl $1,%0\n\t"
"movl %0,%%ebx\n\t"
"leal 2(%%ebx,%%eax,$2),%1"
:"=m"(x),"=r"(y)
);
printf("x is %d, y is %d\n",x,y);
return 0;
}
Le compilateur gcc 5.4.0 donne un message d'erreur:
test.c: Assembler messages:
test.c:7: Error: bad or irreducible absolute expression
test.c:7: Error: expecting scale factor of 1, 2, 4, or 8: got `$2'
Puis-je changer le
"leal 2(%%ebx,%%eax,$2),%1"
à
"leal 2(%%ebx,%%eax,2),%1"
C'est o k. Cependant, est-ce que 2 $ n'est pas égal à 2?
Dans cette syntaxe, le nombre doit être sans $, c'est la façon dont il est défini. Normalement $ signifierait une constante, mais puisque vous ne pouvez pas avoir autre chose qu'une constante spécifique dans le mode d'adressage, il n'utilise pas de préfixe pour dire que c'est une constante. –
FYI, en claquant '% ebx' sans dire le compilateur (avec une contrainte de clobber) entraînera des résultats imprévisibles. (Eh bien, prévisible si vous lisez la sortie finale asm du compilateur avec 'gcc -O2 -S'). Voir https://stackoverflow.com/tags/inline-assembly/info –