Pour moi, la syntaxe Intel est beaucoup plus facile à lire. Si je parcours la forêt d'assemblage en me concentrant uniquement sur la syntaxe Intel, est-ce que je vais manquer quelque chose? Y a-t-il une raison pour laquelle je voudrais passer à AT&T (en dehors de pouvoir lire l'assemblage AT&T des autres)? Mon premier indice est que gdb utilise AT&T par défaut.
Si cela compte, je me concentre uniquement sur toute relation d'assemblage et de syntaxe avec Linux / BSD et le langage C.
Réponses:
Il n'y a vraiment aucun avantage à l'un sur l'autre. Je conviens cependant que la syntaxe d'Intel est beaucoup plus facile à lire. Gardez à l'esprit que, AFAIK, tous les outils GNU ont également la possibilité d'utiliser la syntaxe Intel.
Il semble que vous puissiez faire en sorte que GDB utilise la syntaxe Intel avec ceci:
GCC peut utiliser la syntaxe Intel avec
-masm=intel
.la source
lea -0x30(%rcx,%rax,8),%eax
est ATT alambiqué pourlea eax,[rcx+rax*8-0x30]
. L'utilisation de + et * aide vraiment dans le style Intel.La syntaxe principale de l'assembleur GNU (GAS) est AT&T. La syntaxe Intel est un ajout relativement récent. L'assembly x86 dans le noyau Linux est dans la syntaxe AT&T. Dans le monde Linux, c'est la syntaxe courante. Dans le monde MS, la syntaxe Intel est plus courante.
Personnellement, je déteste la syntaxe AT&T . Il existe de nombreux assembleurs gratuits (NASM, YASM) ainsi que GAS qui prennent également en charge la syntaxe Intel, il n'y aura donc aucun problème à faire la syntaxe Intel sous Linux.
Au-delà, c'est juste une différence syntaxique. Le résultat des deux sera le même code machine x86.
la source
Il n'y a vraiment aucun avantage à l'un sur l'autre. Je ne suis pas d'accord avec le fait que la syntaxe Intel est beaucoup plus facile à lire, car personnellement, je déteste la syntaxe Intel . Gardez à l'esprit que, AFAIK, tous les outils GNU ont également la possibilité d'utiliser la syntaxe Intel.
... et cela se complique avec des instructions plus complexes
dit Nuff.
PS: Cette réponse existe principalement pour mettre en évidence les faiblesses (IMHO) de certaines autres réponses, qui ne sont en fait pas des réponses, mais des opinions. Et bien sûr, cette réponse n'est en réalité que mon humble avis.
PPS: Je ne déteste pas la syntaxe Intel, je m'en fiche.
la source
SOMEWORD PTR[]
si la taille de l'opérande est claire du contexte. Mais vous en avez besoin en cas de déplacement d'un immédiat vers un emplacement mémoire (à la foisl
du AT&T et du DWORD PTR d'Intel). Et oui, mon exemple est assez artificiel - mais le vôtre aussi. Au cas où vous ne voyez toujours pas pourquoi: vous avez omis les tailles de mots inutiles sur Intel, mais les avez dans AT&T. Vous choisissez les opérandes de manière à ce qu'ils s'alignent bien dans Intel, mais ne le faites pas dans AT&T.-4(ebp,edx,4)
que c'est mieux que ça[4*edx+ebp-4]
? Je trouve ce dernier plus intuitif.C'est le "même langage", en ce sens qu'il se compile avec le même code machine, a les mêmes opcodes, etc. D'un autre côté, si vous utilisez du tout GCC, vous voudrez probablement apprendre la syntaxe AT&T, simplement parce que c'est la valeur par défaut - aucune modification des options du compilateur, etc. pour l'obtenir.
Moi aussi, je me suis fait les dents sur Intel-syntax x86 ASM (également sous DOS) et je l'ai trouvé plus intuitif au départ lors du passage à C / UNIX. Mais une fois que vous aurez appris AT&T, cela vous semblera tout aussi simple.
Je n'y penserais pas beaucoup - il est facile d'apprendre AT&T une fois que vous connaissez Intel, et vice-versa. Le langage réel est beaucoup plus difficile à saisir que la syntaxe. Donc, par tous les moyens, concentrez-vous simplement sur l'un et apprenez ensuite l'autre quand il se présente.
la source
C'est un signe de professionnalisme que vous êtes prêt à vous adapter à tout ce qui est utilisé. Il n'y a aucun avantage réel pour l'un ou l'autre. La syntaxe Intel est courante dans le monde Microsoft, AT&T est la norme sous Linux / Unix. Puisqu'il n'y a aucun avantage ni pour l'un ni pour l'autre, les gens ont tendance à s'imprimer sur ce qu'ils ont vu en premier. Cela dit, un programmeur professionnel soulève des choses comme ça. Utilisez tout ce qu'ils utilisent au travail ou dans le domaine dans lequel vous travaillez.
la source
La syntaxe d'Intel couvre tout (en supposant que l'assembleur / désassembleur soit à jour avec le dernier Intel indésirable ajouté à son jeu d'instructions). Je suis sûr que chez & t c'est pareil.
... et cela se complique avec des instructions plus complexes
dit Nuff.
la source
Mon premier langage d'assemblage était MIPS, qui, j'ai remarqué, est très similaire à la syntaxe ATT. Je préfère donc la syntaxe ATT, mais cela n'a pas vraiment d'importance tant que vous pouvez la lire.
la source
lea -0x30(%rcx,%rax,8),%eax
etlea eax,[rcx+rax*8-0x30]
jørgensen posté ci-dessus. Et contrairement à AT&T, MIPS utilise toujours le format de destination d'abord comme tous les autres. En outre, le numéro MIPS n'a pas besoin d'être préfixé par $, et les noms de registre dans MIPS sont courts, il n'est donc pas très inconfortable d'avoir% tout le chemin comme AT&T