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).
programming-languages
assembly
nasm
ApprenticeHacker
quelle
quelle
Antworten:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Das Wissen um ASM ist auch beim Debuggen hilfreich, da Sie manchmal nur "ASM-Dump des Fehlers" haben.
quelle
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.
quelle
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.
quelle