Lohnt es sich, Assemblersprache zu lernen? [geschlossen]

92

Lohnt es sich noch, ASM zu lernen ?

Ich weiß ein wenig davon, aber ich habe es nicht wirklich benutzt oder richtig gelernt, weil alles, was ich in Assembler lerne, ich in 1/10 der Zeit mit einer Sprache wie C oder C ++ machen kann. Soll ich also wirklich ASM lernen und anwenden? Wird es mir beruflich gut tun? Wird es meinen Einfallsreichtum erhöhen? Kurz gesagt, würde es mich zu einem besseren Programmierer machen?

Hinweis: Ich spreche von Low-Level-Assembly wie FASM oder NASM und nicht von HLA (High-Level Assembler).

ApprenticeHacker
quelle
2
Beachten Sie, dass die Assemblersprache an einen Prozessor / Controller gebunden ist.
rmflow
7
Du meinst, es ist nicht plattformübergreifend? !!
ApprenticeHacker
2
Ok, es gibt also für jeden Prozessor eine andere Assemblersprache ??? !!!!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker
3
Eine andere Assemblersprache für jede Familie von Prozessoren. 386-Code läuft auf jedem späteren x86-Prozessor, einschließlich der Angebote von Intel und AMD. Einige Funktionen sind jedoch proprietäre Erweiterungen. Die Sprache für diese zusätzlichen Anweisungen ist dieselbe, aber die resultierende Binärdatei ist nicht portierbar.
Spraff

Antworten:

107

Ich habe aus Kip Irvines Buch gelernt . Wenn Sie die (faire) Kritik an seinen (irrelevanten) Bibliotheken ignorieren, kann ich sie als gute Einführung in die Sprache selbst empfehlen - obwohl Sie für die wirklich interessanten Dinge im Internet nach Obsessiven suchen müssen.

Ich denke, es ist nützlich zu verstehen, was auf den unteren Ebenen passiert. Während Sie nach Assembler suchen, lernen Sie CPU-Pipelining, Verzweigungsvorhersage, Cache-Ausrichtung, SIMD, Neuordnung von Befehlen usw. kennen. Wenn Sie diese kennen, können Sie besseren Code auf hoher Ebene schreiben.

Darüber hinaus besteht die übliche Weisheit darin, die meiste Zeit nicht zu versuchen, die Assembly von Hand zu optimieren, sondern den Compiler sich darum kümmern zu lassen. Wenn Sie einige Beispiele für die verdrehten Dinge sehen, die Compiler erzeugen, werden Sie besser verstehen, warum die konventionelle Weisheit gilt.

Beispiel: LFSRs werden mit der Anweisung "Mit Übertrag drehen" schnell ausgeführt. In bestimmten Fällen wie diesem ist es genauso einfach, die Assembler-Version zu schreiben, wie festzustellen, ob der Compiler intelligent genug ist, um dies herauszufinden. Manchmal weiß man einfach etwas , was der Compiler nicht weiß.

Es verbessert auch Ihr Verständnis für Sicherheitsprobleme - Schreiben oder Ausführen, Stapelüberschreitungen usw.

Einige Parallelitätsprobleme treten erst auf, wenn Sie wissen, was auf Befehlsebene geschieht.

Es kann manchmal beim Debuggen hilfreich sein, wenn Sie nicht über den vollständigen Quellcode verfügen.

Da ist der Wert der Neugier. Wie werden virtuelle Funktionen überhaupt implementiert? Haben Sie jemals versucht, DirectX- oder COM-Programme in Assembler zu schreiben? Wie werden große Strukturen zurückgegeben, bietet die aufrufende Funktion einen Platz für sie oder umgekehrt?

Dann gibt es spezielle Assemblersprachen für Grafikhardware, obwohl Shader-Sprachen vor einigen Jahren auf hohem Niveau waren. Alles, was Sie über ein Problem auf andere Weise nachdenken lässt, ist gut.

Spraff
quelle
7
Gut geschriebene Antwort +1. Lernen und Verwenden sind zwei verschiedene Dinge. Lernen ist eine gute Idee, wenn / ob es mit Erfahrung verbunden ist.
old_timer
Zum Beispiel verwendet Linus Torvalds einen Disassembler, um seinen Code zu debuggen. Ich denke, er verfügt über gute Kenntnisse der x86-Assembly.
Ivanzinho
52

Ich finde es interessant, dass so viele Leute springen, um zu sagen, dass man Montage lernen muss / sollte. Für mich ist die Frage, wie viel Montage Sie wissen müssen? Ich denke nicht, dass Sie Assemblierung wie eine Programmiersprache kennen müssen, das heißt, ich glaube nicht, dass jeder in der Lage sein sollte, ein Programm in Assemblierung zu schreiben, aber andererseits, es lesen und verstehen zu können, was es tatsächlich ist Mittel (die möglicherweise mehr Kenntnisse der Architektur erfordern als der Assembler) sind ausreichend.

Ich kann sicher keine Assembly schreiben (dh keinen nicht trivialen Code in Assembly schreiben), aber ich kann ihn lesen und das zusammen mit dem Wissen über die tatsächliche Hardwarearchitektur und die verwendeten Aufrufkonventionen reicht aus, um die Leistung zu analysieren, und Identifizieren Sie, welcher Teil des C ++ - Codes die Quelle dieser Assembly war.

David Rodríguez - Dribeas
quelle
4
Du meinst, ich sollte nur die grundlegenden Push-, Pop-, Mov- und Invoke- Befehle lernen ?
ApprenticeHacker
10
Ich stimme zu, die Notwendigkeit, die Montage zu kennen, hängt stark davon ab, mit welchem ​​Programmierzweig Sie arbeiten. Web / Desktop / Datenbank? Assembler vergessen. Computerspiele und Grafiken? Es könnte etwas praktisch sein. Betriebssystementwicklung oder eingebettete Echtzeitsysteme? Es ist ein Muss. Und so weiter.
Lundin
1
Sie stellen die anderen Antworten falsch dar - niemand sagt, dass Sie Montage lernen müssen / sollten ; nur, dass es nützlich oder lohnenswert ist, gemäß der Frage. Ihre Antwort ist jedoch immer noch relevant.
Luc Danton
1
@burningprodigy: Meiner Meinung nach sollten Sie einige Grundkenntnisse darüber haben, wie die Anweisungen in dem von Ihnen verwendeten Assembler sind (dh wie die Reihenfolge der Argumente und dergleichen lautet), und ein sehr grundlegendes Verständnis einiger Befehle, was für eine Last oder ein Geschäft ist. Wenn Sie sich dann eine Baugruppe ansehen müssen, können Sie eine Referenz verwenden, um die einzelnen Anweisungen zu verstehen. Auf diese Weise lernen Sie die Grundlagen, die Sie benötigen.
David Rodríguez - Dribeas
1
Genau. Insbesondere wenn Sie nur die Montage kennen, können Sie die Effizienz moderner CPUs bestenfalls beurteilen. Wenn dies das Ziel ist, ist ein wenig Grundkenntnisse in der Montage mit einem angemessenen Anteil der Grundlagen der Computerarchitektur viel nützlicher. Die meiste Zeit, die ich für die Montage benötige, ist das Durchsuchen von Speicherauszügen optimierter Programme oder zum Spaß (z. B. Sicherheitsvorkehrungen, Schreiben eines Mini-Kernels usw.). Aber ich kann mich nicht erinnern, wann ich das letzte Mal eine Konstruktionsentscheidung aufgrund von Montagekenntnissen geändert habe.
Voo
27

Ja, der Hauptgrund für das Erlernen der Assemblierung für C- und C ++ - Entwickler besteht darin, zu verstehen, was unter der Haube von C- und C ++ - Code vor sich geht. Es ist nicht so, dass Sie tatsächlich Code in Assembly schreiben, aber Sie können sich die Code-Disassemblierung ansehen , um ihre Effizienz zu beurteilen, und Sie werden verstehen, wie verschiedene C- und C ++ - Funktionen viel besser funktionieren.

scharfer Zahn
quelle
23

Es lohnt sich, viele verschiedene Sprachen aus vielen verschiedenen Paradigmen zu lernen. Das Erlernen von Java, C ++, C # und Python zählt nicht, da sie alle Instanzen desselben Paradigmas sind.

Da Assemblierung die Wurzel (na ja, nahe an der Wurzel) aller Sprachen ist, sage ich, dass es sich lohnt, Assemblierung zu lernen.

Andererseits lohnt es sich, eine funktionale Programmiersprache, Logikprogrammierung, Skriptsprachen und mathematische Sprachen zu lernen. Sie haben nur so viel Zeit, dass Sie auswählen müssen.

David Hammen
quelle
Und dann, wenn man endlich gelernt haben sie alle und denken , Sie haben einen Blick auf , was los ist, entdecken Sie J .
Micha Wiedenmann
4

Das Wissen um ASM ist auch beim Debuggen hilfreich, da Sie manchmal nur "ASM-Dump des Fehlers" haben.

ain
quelle
2

Haben Sie eine Verwendung für das, was Sie vorhaben? Wird es Ihnen in irgendeiner Weise helfen, was Sie derzeit tun oder planen? Das sind die beiden Fragen, die Sie sich stellen sollten. Die Antwort auf diese Fragen ist die Antwort auf Ihre Frage.

Im Allgemeinen, ja, ich würde sagen, meiner Meinung nach lohnt es sich, asm zu lernen (so etwas wie x86 oder arm). Wie gut es Ihnen dient, hängt davon ab, was Sie programmieren und wie Sie es debuggen.

Necrolis
quelle
2

Hängt davon ab, welche Programmierstufe Sie erreichen möchten. Wenn Sie mit Debuggern arbeiten müssen, dann JA. Wenn Sie wissen möchten, wie Compiler funktionieren, dann JA. Jeder Assembler / Debugger ist CPU-abhängig, daher gibt es viel Arbeit. Überprüfen Sie einfach, wie groß und alt die x86-Familie ist.

GJ.
quelle
Vielleicht meinten Sie, dass die CPU-Familie abhängig ist?
Romeno