Einschränkungen der Intel Assembly Syntax im Vergleich zu AT & T [geschlossen]

85

Für mich ist die Intel-Syntax viel einfacher zu lesen. Wenn ich durch die Assembly-Struktur gehe und mich nur auf die Intel-Syntax konzentriere, vermisse ich dann etwas? Gibt es einen Grund, warum ich zu AT & T wechseln möchte (außerhalb der Möglichkeit, die AT & T-Assembly anderer zu lesen)? Mein erster Hinweis ist, dass gdb standardmäßig AT & T verwendet.

Wenn dies wichtig ist, konzentriere ich mich nur auf die Zusammenstellung und Syntax von Beziehungen zu Linux / BSD und der C-Sprache.

oevna
quelle
11
Ich liebe nicht konstruktive Fragen, die mehr als 50 Stimmen erhalten.
Ceving

Antworten:

78

Es gibt wirklich keinen Vorteil gegenüber dem anderen. Ich stimme jedoch zu, dass die Intel-Syntax viel einfacher zu lesen ist. Beachten Sie, dass alle GNU-Tools, AFAIK, die Option haben, auch die Intel-Syntax zu verwenden.

Es sieht so aus, als könnten Sie GDB dazu bringen, die Intel-Syntax folgendermaßen zu verwenden:

Disassemblierungsgeschmacksinformationen einstellen

GCC kann mit Intel-Syntax arbeiten -masm=intel.

Zifre
quelle
18
Auch Echo Set Dis Intel >> ~ / .gdbinit
Oevna
9
Wie ist die AT & T-Syntax weniger lesbar? Ich finde Größensuffixe auf Operanden konsistenter als "dword". Fehlt mir noch etwas?
Hawken
53
lea -0x30(%rcx,%rax,8),%eaxist gewunden ATT für lea eax,[rcx+rax*8-0x30]. Die Verwendung von + und * hilft im Intel-Stil wirklich.
Jørgensen
9
Ich sehe ihre "Faltung" als gleich, aber nicht identisch: Wenn ATT undurchsichtig ist, ist Intel mehrdeutig. Obwohl die Infix-Arithmetik Algebra-Schülern besser bekannt ist, ist aus der Syntax nicht ersichtlich, dass die Operation genau 4 Argumente enthält oder dass nur eines davon multipliziert werden kann, und in keinem Fall ist klar, dass der Multiplikator a sein muss Potenz von 2.
Fehler
10
@ Hawken Ich finde die Suffixe von AT & T viel besser als die von Intel "ptr", weil Sie sie immer angeben und die Anzahl der Fehler (zumindest für mich) wirklich reduziert. Über den Rest (zum Beispiel die Symbole $ und%) .. ja .. sie sind nicht angenehm, und das ist der Punkt, aber sie haben einen Vorteil: Es ist explizit und reduziert erneut Fehler. Ich würde sagen, dass einer zum Lesen (Intel) und der zweite zum Schreiben (AT & T) geeignet ist.
MasterMastic
42

Die primäre Syntax für den GNU-Assembler (GAS) lautet AT & T. Die Intel-Syntax ist eine relativ neue Ergänzung. Die x86-Assembly im Linux-Kernel erfolgt in AT & T-Syntax. In der Linux-Welt ist dies die übliche Syntax. In der MS-Welt ist die Intel-Syntax üblicher.

Ich persönlich hasse die AT & T-Syntax . Neben GAS gibt es viele kostenlose Assembler (NASM, YASM), die auch die Intel-Syntax unterstützen, sodass die Linux-Syntax unter Linux problemlos funktioniert.

Darüber hinaus ist es nur ein syntaktischer Unterschied. Das Ergebnis von beiden ist der gleiche x86-Maschinencode.

Mehrdad Afshari
quelle
24
Einverstanden und zugestimmt. Es sollte ein Verbrechen sein, die AT & T-Syntax zu verwenden. Es ist kontraintuitiv und hässlich. Warum sollten Sie jeder einzelnen Zahl ein Präfix voranstellen und sich mit $ und% registrieren und die relative Adressierung in umgekehrter SIB-Notation angeben, für die ich die Intel-Syntax verwendet habe? zwei Jahre und kann immer noch nicht sehen, warum AT & T überhaupt existiert.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
11
Wenn Sie es fett ausdrücken wollen, geben Sie zumindest einige Beweise dafür, warum Intel so viel besser ist.
Hawken
8
@ Hawken Hasser werden hassen
Gunther Piez
7
@ Hawken Schlagen Sie vor, dass er, weil er kühne Schrift verwendet hat, seine Meinung irgendwie als Tatsache ausdrückt, wie er es nicht gewesen wäre, wenn er die kühne einfach in Ruhe gelassen hätte? Die Frage hat diese Art von meinungsgeleiteter "Debatte" sowieso praktisch eingeladen, vermutlich warum sie jetzt geschlossen ist!
Elliott
1
Wie wäre es mit Intel-Syntax für ARM?
Ceving
32

Es gibt wirklich keinen Vorteil gegenüber dem anderen. Ich bin jedoch anderer Meinung, dass die Intel-Syntax viel einfacher zu lesen ist, weil ich persönlich die Intel-Syntax hasse . Beachten Sie, dass alle GNU-Tools, AFAIK, die Option haben, auch die Intel-Syntax zu verwenden.

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]

... und es wird komplizierter mit komplexeren Anweisungen

'nuff sagte.

PS: Diese Antwort existiert hauptsächlich, um (IMHO) Schwachstellen in einigen anderen Antworten hervorzuheben, bei denen es sich eigentlich nicht um Antworten, sondern um Meinungen handelt. Und natürlich ist diese Antwort in Wirklichkeit nur meine bescheidene Meinung.

PPS: Ich hasse die Intel-Syntax nicht, es ist mir einfach egal.

Gunther Piez
quelle
18
Ich bin furchtbar verwirrt. Wollen Sie damit sagen, dass die at & t-Syntax die Wortgröße niemals explizit angeben muss? Warum haben Sie mein Beispiel kopiert und Wortgrößen und das nutzlose PTR-Ding hinzugefügt? Warum haben Sie meine Differenzen in Summen mit einem negativen linken Operanden geändert? Liegt es daran, dass die Anweisung auf diese Weise tatsächlich codiert wird? Der Benutzer muss sich selten wirklich darum kümmern. In jedem Assembler, den ich verwendet habe, können Sie den DWORD PTR weglassen, da der linke Operand 32-Bit ist und der rechte Operand eckige Klammern hat.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
12
Darüber hinaus produziert IDA / ollydbg nicht einmal so etwas wie das, was Sie geschrieben haben. Ich bin mir also ziemlich sicher, dass es kein Problem gibt, vom Maschinencode zur "netten" Intel-Syntax zu wechseln. Ihr Beispiel scheint also ziemlich ausgeklügelt zu sein und etwas, das ich nur in der trivialsten Implementierung eines Assemblers oder Disassemblers sehen würde. Andererseits stammen die at & t-Anweisungen, die ich verspotte, direkt aus einem der ersten Absätze eines Tutorials, in dem at & t-Syntax unterrichtet wird.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
8
Ich bin zu dem Schluss gekommen, dass Sie eine Maschine sind, daher bevorzugen Sie eine Syntax, die die Bitcodierung des Befehls direkt widerspiegelt. (was die at & t-Syntax tut). Ich habe auch den Verdacht, dass die Leute mehr 1337 fühlen, wenn sie die & t-Syntax verwenden, da sie dunkler ist, obwohl das nicht wirklich ein Vorteil ist ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
7
@Longpoke Nein, die AT & T-Syntax muss die Wortgröße nicht explizit angeben, wenn dies aus dem Kontext hervorgeht. Genauso wie bei Intel: Sie brauchen nicht, SOMEWORD PTR[]wenn die Operandengröße aus dem Kontext hervorgeht. Sie benötigen es jedoch, wenn Sie eine lDatei sofort an einen Speicherort verschieben möchten (sowohl von AT & T als auch von DWORD PTR von Intel). Und ja, mein Beispiel ist ziemlich erfunden - aber dein Beispiel auch. Für den Fall, dass Sie immer noch nicht verstehen, warum: Sie haben die nicht benötigten Wortgrößen bei Intel weggelassen, haben sie aber in AT & T. Sie wählen die Operanden so aus, dass sie in Intel gut ausgerichtet sind, in AT & T jedoch nicht.
Gunther Piez
6
Wollen Sie damit sagen -4(ebp,edx,4), dass etwas besser ist als [4*edx+ebp-4]? Letzteres finde ich intuitiver.
Calmarius
22

Es ist die "gleiche Sprache", da sie bis zum gleichen Maschinencode kompiliert wird, die gleichen Opcodes hat usw. Wenn Sie dagegen überhaupt GCC verwenden, möchten Sie wahrscheinlich die AT & T-Syntax lernen, nur weil es so ist die Standardeinstellung - keine Änderung der Compileroptionen usw., um sie zu erhalten.

Auch ich habe mir bei Intel-Syntax x86 ASM (auch unter DOS) die Zähne geschnitten und fand es anfangs intuitiver, wenn ich zu C / UNIX wechselte. Aber sobald Sie AT & T gelernt haben, wird es genauso einfach aussehen.

Ich würde nicht so viel darüber nachdenken - es ist einfach, AT & T zu lernen, wenn Sie Intel kennen und umgekehrt. Die eigentliche Sprache ist viel schwieriger in den Kopf zu bekommen als die Syntax. Konzentrieren Sie sich also auf jeden Fall auf das eine und lernen Sie dann das andere, wenn es auftaucht.

Jacob B.
quelle
14
Was? Da GCC standardmäßig at & t verwendet, ist dies kein Grund, die at & t-Syntax zu lernen. Vor allem, wenn Sie einfach auf die intuitivere Intel-Syntax umschalten können.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
6
@longpoke Das Erlernen der Intel-Syntax, nur weil sie von allen als "intuitiver" bezeichnet wird, ist kein besserer Grund. Eigentlich ist es überhaupt kein Grund.
Hawken
1
Sie haben beide Recht, aus den gleichen Gründen, aus denen sowohl Verilog als auch VHDL geblieben sind.
Fehler
20

Es ist ein Zeichen von Professionalität, dass Sie bereit sind, sich auf alles einzustellen, was verwendet wird. Es gibt keinen wirklichen Vorteil für den einen oder anderen. Die Intel-Syntax ist in der Microsoft-Welt üblich, AT & T ist der Standard in Linux / Unix. Da es für beide keinen Vorteil gibt, prägen die Leute das ein, was sie zuerst gesehen haben. Das heißt, ein professioneller Programmierer erhebt sich über solche Dinge. Verwenden Sie alles, was sie bei der Arbeit oder in der Domäne verwenden, in der Sie arbeiten.

phorgan1
quelle
5
Wie wäre es, ein "professioneller" Benutzer der Tools zu sein und zu wissen, wie man sie ändert, um Sie produktiver zu machen? +1 für Intel-Syntax.
Jonathon Reinhart
5
Nun, obwohl ich auch die Intel-Syntax bevorzuge, hat er einen Punkt - erwägen Sie beispielsweise die Wartung des vorhandenen AT & T-Codes. Es schadet definitiv nicht, sich in beiden Bereichen zurechtzufinden.
Elliott
7
Ich würde zwar auch befürworten, beides zu lernen, aber ich werde Devil's Advocate spielen und vorschlagen, dass Sie vim einfach in automatisch konvertierende * .s-Dateien in die Syntax Ihrer Wahl schreiben können.
Fehler
2
Da die Intel-Syntax leichter zu lesen ist, hat die Intel-Syntax einen Vorteil. "lea eax, [eax * 4 + 8]" hat eine viel bessere objektive Lesbarkeit als "leal 8 (,% eax, 4),% eax"
Lucio M. Tato
2
@ Bug Heh, Sie haben Emacs falsch geschrieben; D
GDP2
12

Die Intel-Syntax deckt alles ab (vorausgesetzt, der Assembler / Disassembler ist auf dem neuesten Stand und enthält den neuesten Junk-Intel, der dem Befehlssatz hinzugefügt wurde). Ich bin mir sicher, dass es bei & t genauso ist.

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]

... und es wird komplizierter mit komplexeren Anweisungen

'nuff sagte.

L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
quelle
17
Nein, nicht genug gesagt.
Gunther Piez
2
Auf dem Poster wurde bereits angegeben, dass sie die Intel-Syntax bevorzugen. gut für sie; Also, wen versuchst du zu überzeugen?
Hawken
2
@ Hawken Es ist nicht nur das Poster, das die Antworten lesen wird.
Flügelspieler Sendon
Mir gefällt, wie er Beispiel mit Wortlänge erwähnt. Bitte schreiben Sie einen Speicheroperanden auf Einzelbyte oder kurz.
Ajay Brahmakshatriya
2

Meine erste Assemblersprache war MIPS, die der ATT-Syntax sehr ähnlich ist. Ich bevorzuge die ATT-Syntax, aber es spielt keine Rolle, solange Sie sie lesen können.

gsk
quelle
3
Die MIPS-Assembly ähnelt nur der AT & T-Syntax im Adressformat der Lade- / Speicheranweisung. MIPS verfügt jedoch nur über einen einfachen Adressierungsmodus zum Laden / Speichern, während Intel über viel mehr verfügt, was dies komplexer macht. Betrachten Sie lea -0x30(%rcx,%rax,8),%eaxund lea eax,[rcx+rax*8-0x30]jørgensen oben gepostet. Und im Gegensatz zu AT & T verwenden MIPS wie alle anderen immer noch das Ziel-First-Format. Außerdem muss der MIPS-Nummer kein $ vorangestellt werden, und die Registernamen in MIPS sind kurz, so dass es nicht sehr unangenehm ist,% wie AT & T zu haben
phuclv