gas vs. nasm: die assembler produziert den besten code?
Beide tools übersetzen Montageanleitung direkt in Maschinen-code, aber ist es möglich, zu bestimmen, die erzeugt man am schnellsten und saubersten code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim schreiben in assembler, Sie genau beschreiben, die Anweisungen zu generieren also es hängt nicht von den assembler. Es hängt von Ihnen ab. Es gibt eine eins-zu-eins-Korrespondenz zwischen den mnemonischen Codes, den Sie schreiben, und die eigentlichen Anweisungen in Maschinencode.
int3
undint 3
) oder verwenden Sie ein paar Hinweise, um zu wählen, welche zu generieren. Diese Sachen sind in der Regel dokumentiert für jeden assembler. Ich denke, für die Zwecke dieser Frage, ist es vernünftig zu ignorieren diese Probleme, da theoretisch, Sie sind wirklich unterschiedliche Anweisungen und der assembler erlauben könnte, Sie zu wählen Sie aus.Ich weiß nicht, über diese zwei spezifischen tools, aber es gibt einige Anweisungen, die kodiert werden können, anders:
ADD AX,1
ist entweder05 01
oder81 c0 01
oderfe c0
INT 3
ist entwedercc
odercd 03
Dies sind nur ein paar Beispiele aus der Spitze von meinem Kopf, wie Assembler codieren kann das gleiche Anweisung anders, so die Frage, macht in der Tat Sinn machen.
cc
undcd 03
sind zwei verschiedene Anleitungen aus der Sicht der CPU. Es ist vollständig im Namen der assembler um Sie nicht zu bieten, einen Weg zu erzeugen, eine Anleitung.INC AX
codiert, wiefe c0
ist genau das gleiche wieADD AX, 1
codiert, wie05 01
so weit wie Funktionalität und Anleitung Länge betroffen sind, obwohl Sie in der Tat separat dekodiert der CPU.ADD AX,1
(d.h.05 01
) undINC AX
(d.h.FE C0
) sind sehr verschiedene Anleitungen: der ehemalige wirkt sich auf alle Arithmetik-bezogene flags, während die letzteren nicht aufCF
. Ein assembler, der den Austausch für eine andere ist eine schlechte assembler. Ich würde sein überrascht, wenn ich schriebadd ax,1; jc carried
und der Sprung tatsächlich erschienen abhängen vorherigen Zustand desCF
statt das Ergebnis der addition.Nebenbei auf die syntax-Frage. Sie können GAS-Arbeit völlig in Ordnung, mit Intel-syntax, indem Sie die folgende Zeile an der Spitze der Quellcode-Datei:
Ich verwende die Intel-syntax auch für alle meine assmebly muss. So scheint es weit natürlicher, als die AT&T-syntax. Und es spart einige Tastenanschläge :-).
Es ist assember... es wird nicht optimiert code. Es nur übersetzt ist. Also die Schnellste und sauberste code, der erzeugt wird durch Programmierer oder compiler
Offensichtlich nasm, weil die Intel-syntax sieht viel sauberer aus, als AT&T-syntax.
@Brian: das war nicht die Frage ...
@cyber98834:
Gut, ein assembler, der tut, was jeder assembler tun müssen : übersetzen Sie jede Anweisung an seine opcode .
Gibt es keine Optimierung .
Ach und außerdem, es gibt nicht so etwas wie einen "schnellsten code" ... Kann ich Ihnen eine Frage stellen ? Die CPU-Geschwindigkeit ist statisch, nicht wahr ?
So, man kann nicht einen code schneller laufen, weil Sie nicht ändern können, die CPU-Geschwindigkeit .
Aber, können Sie Sie verkleinern Sie den code so, dass die CPU-Griffe weniger Menge von Anweisungen, und nimmt so weniger Zeit zu laufen .
Ich hoffe, Sie verstehen, was ich versuche zu sagen .
Schlage ich vor, Sie zu kaufen ( oder zu suchen, einige pdf 's, aber ich weiß nicht, ob das legal ist ) Michael Abrash' s Graphics Programming Black Book umfasst viele Optimierungs-Unterricht .
ve already got Michael Abrash
s Graphics Programming Black Book bereit (gamedev.net/reference/articles/article1698.asp) für später 🙂