web-dev-qa-db-fra.com

Limitations de la syntaxe d'assemblage Intel par rapport à AT&T

Pour moi, la syntaxe Intel est beaucoup plus facile à lire. Si je parcourt la forêt d'assemblage en me concentrant uniquement sur la syntaxe Intel, vais-je manquer quelque chose? Y a-t-il une raison pour laquelle je voudrais passer à AT&T (en plus de pouvoir lire l'assemblage AT&T des autres)? Mon premier indice est que gdb utilise AT&T par défaut.

Si cela importe, je me concentre uniquement sur toute relation que l'assemblage et la syntaxe peuvent avoir avec Linux/BSD et le langage C.

78
oevna

Il n'y a vraiment aucun avantage l'un par rapport à l'autre. Je suis d'accord cependant que la syntaxe 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:

 définir les informations de désassemblage-saveur 

GCC peut faire la syntaxe Intel avec -masm=intel.

71
Zifre

La syntaxe principale de l'assembleur GNU (GAS) est AT&T. La syntaxe Intel est un ajout relativement nouveau. L'assemblage x86 dans le noyau Linux est en syntaxe AT&T. Dans le monde Linux, c'est le Syntaxe commune 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.

40
Mehrdad Afshari

Il n'y a vraiment aucun avantage l'un par rapport à l'autre. Je ne suis pas d'accord cependant sur 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.

at&t noprefix                   intel
mov eax, -4(ebp,edx,4)          mov DWORD PTR[-4 +ebp +edx *4], eax
mov eax, -4(ebp)                mov DWORD PTR[-4 +ebp], eax
mov edx, (ecx)                  mov DWORD PTR[ecx], edx
lea (   ,eax,4), eax            lea eax, DWORD PTR[8 + eax*4]
lea (eax,eax,2), eax            lea eax, DWORD PTR[eax*2+eax]

... et ça devient plus compliqué avec des instructions plus complexes

dit Nuff.

PS: Cette réponse existe principalement en raison de la mise en évidence (à mon humble avis) des faiblesses dans 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.

30
Gunther Piez

C'est le "même langage", en ce sens qu'il compile vers le même code machine, a les mêmes opcodes, etc. D'autre part, si vous utilisez GCC, vous voudrez probablement apprendre la syntaxe AT&T, juste parce que c'est la valeur par défaut - pas de modification des options du compilateur, etc. pour l'obtenir.

J'ai moi aussi coupé mes dents sur la syntaxe Intel x86 ASM (sur DOS aussi) 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 sera tout aussi simple.

Je n'y penserais pas trop --- il est facile d'apprendre AT&T une fois que vous connaissez Intel, et vice-versa. La langue réelle est beaucoup plus difficile à comprendre que la syntaxe. Donc, par tous les moyens, concentrez-vous sur l'un et apprenez l'autre quand il apparaît.

21
Jacob B

C'est un signe de professionnalisme que vous êtes prêt à adapter à tout ce qui est utilisé. Il n'y a aucun avantage réel pour l'un ou pour 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 pour l'un ou l'autre, les gens ont tendance à 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.

20
Patrick

La syntaxe Intel couvre tout (en supposant que l'assembleur/désassembleur est à jour avec le dernier indésirable Intel ajouté à leur jeu d'instructions). Je suis sûr qu'at & t est le même.

 AT&T intel 
 Movl -4 (% ebp,% edx, 4),% eax mov eax, [ebp-4 + edx * 4] 
 Movl -4 (% ebp ),% eax mov eax, [ebp-4] 
 movl (% ecx),% edx mov edx, [ecx] 
 leal 8 (,% eax, 4),% eax lea eax , [eax * 4 + 8] 
 leal (% eax,% eax, 2),% eax lea eax, [eax * 2 + eax] 

... et ça devient plus compliqué avec des instructions plus complexes

dit Nuff.

Mon premier langage d'assemblage était MIPS, que 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.

3
gsk