Limitations de la syntaxe de l'assemblage Intel par rapport à AT&T [fermé]

88

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.

oevna
la source
11
J'adore les questions non constructives qui obtiennent plus de 50 votes.
ceving

Réponses:

80

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:

définir l'intel de désassemblage-saveur

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

Zifre
la source
18
ainsi, echo set dis intel >> ~ / .gdbinit
oevna
9
En quoi la syntaxe AT&T est-elle moins lisible? Je trouve qu'avoir des suffixes de taille sur les opérandes est plus simple que d'avoir "dword". Y a-t-il autre chose qui me manque?
Hawken
54
lea -0x30(%rcx,%rax,8),%eaxest ATT alambiqué pour lea eax,[rcx+rax*8-0x30]. L'utilisation de + et * aide vraiment dans le style Intel.
jørgensen
9
Je vois leur «convolution» comme égale mais non identique: si ATT est opaque, alors Intel est ambigu. Bien que l'arithmétique infixe soit plus familière aux étudiants en algèbre, il n'est pas évident d'après la syntaxe qu'il y a exactement 4 arguments à l'opération, ou qu'un seul d'entre eux peut être multiplié, et dans aucun des cas il n'est clair que le multiplicateur doit être un puissance de 2.
bug du
10
@Hawken Je trouve les suffixes d'AT & T bien meilleurs que les "ptr" d'Intel parce que vous le spécifiez toujours et cela réduit vraiment le nombre d'erreurs (du moins pour moi). A propos du reste (par exemple les symboles $ et%) .. ouais .. ils ne sont pas agréables, et c'est le point, mais ils ont un avantage: c'est explicite et encore une fois réduit les erreurs. Je dirais que l'un est confortable pour lire (Intel) et le second pour écrire (AT&T).
MasterMastic
43

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.

Mehrdad Afshari
la source
25
D'accord et d'accord. Ce devrait être un crime d'utiliser la syntaxe AT&T, c'est contre-intuitif et moche, pourquoi voudriez-vous préfixer chaque nombre et vous inscrire avec $ et%, et spécifier un adressage relatif en notation SIB inversée, j'ai utilisé la syntaxe Intel pour deux ans et je ne vois toujours pas pourquoi AT&T existe même.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
11
Si vous voulez le dire en gras, fournissez au moins quelques preuves de la raison pour laquelle Intel est tellement meilleur.
Hawken
8
@Hawken Haters va détester
Gunther Piez
8
@Hawken Êtes-vous en train de suggérer que parce qu'il a utilisé des caractères gras, il déclare en quelque sorte son opinion comme un fait d'une manière qu'il n'aurait pas été s'il avait simplement laissé l'audacieux seul? La question invitait pratiquement ce genre de «débat» d'opinion de toute façon, sans doute pourquoi il est maintenant fermé!
Elliott
1
Qu'en est-il de la syntaxe Intel pour ARM?
ceving
33

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.

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 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.

Gunther Piez
la source
19
Je suis terriblement confus. Êtes-vous en train de dire que la syntaxe at & t n'a jamais besoin de rendre la taille du mot explicite? Pourquoi avez-vous copié mon exemple et ajouté des tailles de mots et la chose inutile PTR? Aussi pourquoi avez-vous changé mes différences en sommes avec un opérande gauche négatif? Est-ce parce que c'est ainsi que l'instruction est réellement encodée? L'utilisateur doit rarement s'en soucier vraiment. Dans chaque assembleur que j'ai utilisé, vous pouvez omettre le DWORD PTR car l'opérande gauche est 32 bits et l'opérande droit est entouré de crochets.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
12
De plus, IDA / ollydbg ne produit même pas quelque chose comme ce que vous avez écrit, donc, je suis presque sûr qu'il n'y a pas de problème pour passer du code machine à la "belle" syntaxe Intel. Donc, votre exemple semble assez artificiel et quelque chose que je ne verrais jamais sauf dans l'implémentation la plus triviale d'un assembleur ou d'un désassembleur. Par contre, les instructions at & t dont je me moque proviennent directement de l'un des premiers paragraphes d'un tutoriel enseignant la syntaxe at & t.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
8
J'en suis venu à la conclusion que vous êtes une machine, donc vous préférez une syntaxe qui reflète directement le codage binaire de l'instruction. (c'est ce que fait la syntaxe at & t). Je soupçonne également que les gens se sentent plus 1337 lorsqu'ils utilisent la syntaxe at & t car elle est plus obscure, bien que ce ne soit pas vraiment un avantage ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
7
@Longpoke Non, la syntaxe AT&T n'a pas besoin de rendre la taille du mot explicite si elle est claire dans le contexte. Tout comme avec Intel: vous n'avez pas besoin 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 fois ldu 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.
Gunther Piez
7
Alors tu dis -4(ebp,edx,4)que c'est mieux que ça [4*edx+ebp-4]? Je trouve ce dernier plus intuitif.
Calmarius
24

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.

Jacob B
la source
16
Quelle? Parce que GCC utilise at & t par défaut, il n'y a aucune raison d'apprendre la syntaxe at & t. Surtout lorsque vous pouvez simplement passer à la syntaxe Intel plus intuitive.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
7
@longpoke Apprendre la syntaxe d'Intel simplement parce que tout le monde l'appelle "plus intuitive" n'est pas vraiment une meilleure raison. En fait, ce n'est pas du tout une raison.
Hawken
1
Vous avez tous les deux raison, pour les mêmes raisons que Verilog et VHDL sont restés.
bug du
@Hawken: Vrai. La vraie raison d'apprendre la syntaxe d'Intel est que c'est ce qu'utilisent les manuels d'Intel et d'AMD. Il n'y a pas de manuels de référence ISA utilisant la syntaxe AT&T aussi détaillée que les manuels du fournisseur, par exemple felixcloutier.com/x86/cmppd (extrait des PDF d'Intel). Aussi des informations sur les performances telles que uops.info et agner.org/optimize . Je pense avoir lu que certains fournisseurs Unix ont fait une référence AT&T ISA à un moment donné, mais c'est certainement obsolète maintenant et ne couvrira pas les instructions AVX. 100% d'accord avec cette réponse: même code machine, syntaxe différente pour l'exprimer, pas de problème.
Peter Cordes
20

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.

phorgan1
la source
5
Que diriez-vous d'être un utilisateur «professionnel» des outils et de savoir comment les modifier pour vous rendre plus productif? +1 pour la syntaxe Intel.
Jonathon Reinhart
5
Eh bien, même si je suis également favorable à la syntaxe Intel, il a un point - envisagez la maintenance du code AT&T existant, par exemple. Il n'y a certainement aucun mal à connaître votre chemin à la fois.
Elliott
7
Bien que je préconise également d'apprendre les deux, je jouerai à Devil's Advocate et je suggérerai que vous puissiez simplement script vim en fichiers * .s à conversion automatique à la syntaxe de votre choix.
bug du
2
puisque la syntaxe d'Intel est plus facile à lire, la syntaxe d'Intel présente un avantage. "lea eax, [eax * 4 + 8]" a une bien meilleure lisibilité objective que "leal 8 (,% eax, 4),% eax"
Lucio M. Tato
2
@bug Heh, vous avez mal orthographié emacs; D
GDP2
12

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.

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 cela se complique avec des instructions plus complexes

dit Nuff.

L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
la source
17
Non, pas assez dit.
Gunther Piez
2
L'affiche a déjà déclaré qu'ils préféraient la syntaxe Intel; bien pour eux; alors qui essayez-vous de convaincre?
Hawken
2
@Hawken, ce n'est pas seulement l'affiche qui va lire les réponses.
Ailier Sendon
J'aime la façon dont il mentionne l'exemple avec une longueur de dword. Veuillez écrire un opérande de mémoire sur un octet ou court.
Ajay Brahmakshatriya
2

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.

gsk
la source
3
L'assemblage MIPS est uniquement similaire à la syntaxe AT&T dans le format d'adresse de l'instruction de chargement / stockage. Mais MIPS n'a qu'un seul mode d'adressage simple pour le chargement / stockage tandis qu'Intel en a beaucoup plus, ce qui rend cela plus complexe. Considérerlea -0x30(%rcx,%rax,8),%eax et lea 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
phuclv