Gibt es ein kanonisches Buch zum Thema x86-Assembly? [geschlossen]

25

Es gibt viele Bücher über die Montage. Sie befassen sich jedoch normalerweise mit ISAs, die mir egal sind, wie MIPS oder ARM. Ich beschäftige mich nicht mit diesen Architekturen; Es gibt keinen Grund für mich, sie zu lernen.

Aber x86-Assemblybücher scheinen ... nicht vorhanden zu sein.

Angenommen, ich versuche zum Beispiel, einen Toy-Compiler zu erstellen, der Windows Portable Executable-Dateien generiert.

Gibt es ein Buch, das de facto als Standard für die Beschreibung von Best Practices, Entwurfsmethoden und anderen hilfreichen Informationen zur x86-Assembly gilt? Was macht dieses Buch so besonders?

Billy ONeal
quelle
Wie viel Montageerfahrung haben Sie? Haben Sie jemals versucht, GCC ohne Optimierung zu verwenden, um einfache C-Programme in Assembler zu kompilieren, und dann den Code zurück in ein C-Programm umzuwandeln?
Brian
10
@Brian: Ich müsste die Montage kennen, bevor ich das tun kann.
Billy ONeal
Ich habe eine Kopie des x86-Befehlssatzes gesehen. Es ist 2 Bände und wahrscheinlich das größte Buch, das ich je gesehen habe. Viel Spaß :)
AngryBird
2
Billy, wenn du überhaupt keine Versammlung kennst, wäre es ziemlich gut, wenn du von einer dieser Versammlungen ausgehen würdest, um die allgemeinen Ideen zu bekommen. Die Montage ist der Architektur sehr ähnlich, sodass die Montageanweisungen stark architekturspezifische Entwürfe widerspiegeln. Ich habe mit x86-Assembler begonnen und Kip Irvines "Assemblersprache für Intel-basierte Computer" gelesen. Das Buch wurde tatsächlich mit einem Online-Kurs an einem Community College gepaart. Ich bin mir nicht sicher, welche Art von Lernenden Sie sind, aber ich finde, dass geführter Unterricht am besten zum Lernen geeignet ist.
Brian
@ Brian: Was meinst du mit "einem von ihnen"? Ich verstehe nicht, was "sie" sind - irgendein Buch? Irgendein Assembler? Irgendeine ISA? Ich habe bereits mit MIPS Assembler gespielt. Auf x86 kann ich jedoch nichts finden.
Billy ONeal

Antworten:

18

Ich habe Assembler für x86-Prozessoren als Lehrbuch verwendet, als ich am College war, und fand es sehr einfach zu verstehen. Ich habe die ältere vierte Ausgabe und habe sie mit der sechsten Ausgabe verglichen und habe keine großen Veränderungen bemerkt, so dass Sie wahrscheinlich ein älteres Exemplar billig kaufen könnten. Die Leute beschweren sich über die Verwendung seiner eigenen Bibliothek für E / A, aber er erklärt Ihnen, wie Sie dies in den letzten Kapiteln auf "harte" Weise tun.

dboss
quelle
1
Sehr gutes Buch!
Coder
Ich habe die fünfte Ausgabe von Irvines Buch mit dem Titel "Assemblersprache für Intel-basierte Computer" gelesen. :)
Brian
1
Ich halte dies für einen ziemlich schlechten Vorschlag, da der größte Teil der zweiten Ausgabe für das esoterische System High Level Assembly des Autors bestimmt ist, bei dem es sich im Wesentlichen um eine bastardisierte Version von C handelt. Ich habe die veröffentlichte erste Ausgabe nie gelesen. Die Dos-Version, die Sie auf seiner Website kostenlos finden und die noch nie veröffentlicht wurde, ist jedoch eine gute Lektüre. Es ist auch ungefähr 50% länger und es fehlt etwas an HLA (was eine totale Zeitverschwendung ist).
Evan Carroll
1
@EvanCarroll Ich bin verwirrt. Sie haben den Link zum falschen Buch geändert und dann das Buch kritisiert, zu dem Sie den Link geändert haben. War das ungewollt?
Merlyn Morgan-Graham
1
total mein fehler. @ MerlynMorgan-Graham gut zu dir, dass du es aufgefangen und korrigiert hast.
Evan Carroll vor
9

Die Art of Assembly Programming ist eine hervorragende Ressource, die sich mit x86-Programmierung befasst.

Die x64-ABI-Dokumentation ist ebenfalls hilfreich. Ich habe versucht, einen Link zu der Version zu finden, die sich auf der AMD-Website befindet, aber ich kann ihn anscheinend nicht mehr finden. Ich denke, dieser muss es tun.

Etwas, das beim Lernen ziemlich hilfreich sein kann, ist, anstatt zu versuchen, eine komplette App von Grund auf in Assembler zu schreiben, das meiste davon in C (oder einer anderen kompilierten Sprache) zu schreiben und dann einen Teil des Assembler-Codes von aufzurufen Das. Wenn Sie das getan haben, kehren Sie es um, schreiben Sie ein Assemblerprogramm und rufen Sie einige C-Funktionen auf.

Bearbeiten: Ein Tippfehler wurde behoben.

Orclev
quelle
1
Ein weiterer Vorschlag: Schreiben Sie ein einfaches Programm in C, kompilieren Sie es zur Assembly, bereinigen Sie es, damit Ihr Assembler es zusammenbauen kann, und erweitern Sie dann die Assembly-Version. Dies ist ein guter Weg, um eine Mindestfunktionalität (von der Tastatur lesen, auf die Konsole schreiben) schnell zum Laufen zu bringen.
TMN
4

Ein sehr gutes Buch zum Erlernen von x86-Assembly sind die Pentium Processor Optimization Tools . Während das Hauptaugenmerk des Buches auf der Optimierung des Assembler-Codes liegt, wird die Pentium-Assemblierung auf diesem Weg vermittelt, und es ist auch ein gutes Nachschlagewerk.

Es ist lange vergriffen, aber nicht schwer zu finden.

Es wird mit einer Diskette geliefert, die einen "Assembler-Code-Optimierer" enthält. Es optimiert Ihren Code nicht wirklich, sondern erstellt stattdessen eine kommentierte Liste, die darauf hinweist, wo Ineffizienzen wie Pipeline-Stillstände liegen.

Das Tool, das mit einem Buch geliefert wird, ist eine limitierte Version eines eher merkwürdigen Produkts, das die Firma des Autors früher verkaufte. Ich weiß nicht warum - ich würde denken, ein solches Tool würde sich wie ein heißer Kuchen verkaufen.

x86 ist im Allgemeinen ein sehr komplexes Thema, da es viele Varianten gibt, die von verschiedenen Mikroprozessormodellen unterstützt werden. Sobald Sie die Grundlagen kennen, sollten Sie die Datenbücher von Intel oder AMD nach dem genauen Chip durchsuchen, auf den Sie abzielen. Leider ist Code, der auf einem CPU-Modell schnell ausgeführt wird, auf einem anderen Chip möglicherweise nicht so schnell.

Mike Crawford
quelle
Nicht wirklich auf Leistung aus; Ich möchte nur in der Lage sein, Binärdateien zu generieren. Werde immer noch einen Blick darauf werfen :)
Billy ONeal
2
Sie müssen auch lernen, wie Sie einen bestimmten Assembler verwenden, nicht nur die Assembler-Opcodes. Jeder Assembler macht das ganz anders. Wenn Sie eine Menge Assembler-Code schreiben möchten, verwenden Sie masm, da es für menschliche Programmierer entwickelt wurde. Wenn Sie nur kleine Ausschnitte aus der Inline-Assembly schreiben möchten, können Sie gcc mit GNU als (auch als Gas-) Inline-Assembly verwenden. Die Syntax von GNU as unterscheidet sich grundlegend von der von masm. Wie in erster Linie für die Verwendung als Back-End für gcc geschrieben, um die Generierung von ausführbarem Code durchzuführen, und bietet daher nicht viele der Funktionen, die menschliche Programmierer wünschen.
Mike Crawford
1

Probieren Sie das Wikibook aus - http://en.wikibooks.org/wiki/X86_Assembly . Es gibt einen guten Einstieg in die Assemblersprache.

Das Schwierige an der Montage ist, zu erkennen, wie einfach sie ist und dass Sie bei dieser Einfachheit bleiben müssen.

Philip Oakley
quelle