Frage

Ich bin ein überzeugter Anhänger der Idee, dass eines der wichtigsten Dinge, die Sie vom Lernen eine neue Sprache erhalten, ist nicht, wie eine neue Sprache zu verwenden, aber das Wissen über Konzepte, die Sie von ihm bekommen. Ich frage nicht, wie wichtig oder nützlich halten Sie Assembly ist, noch ist mir egal, ob ich es nie in irgendwelchen meiner realen Projekten verwenden.

Was ich möchte wissen, ist, was Konzepte der Versammlung ist Ihrer Meinung nach am wichtigsten für einen allgemeinen Programmierer zu wissen? Es muss nicht direkt auf Montag in Beziehung gesetzt werden - auch etwas sein kann, dass Sie die typischen Programmierer fühlen, die in höheren Sprachen all ihre Zeit damit verbringen, würde es nicht verstehen oder für selbstverständlich, wie die CPU-Cache

War es hilfreich?

Lösung

Ich denke, Assemblersprache Sie viele kleine Dinge beibringen kann, sowie ein paar große Konzepte.

Ich werde ein paar Dinge, liste ich hier denken kann, aber es gibt keinen Ersatz für das Gehen und das Lernen und sowohl x86 und einen RISC-Befehlssatz verwendet wird.

Sie denken wahrscheinlich, dass Integer-Operationen am schnellsten sind. Wenn Sie eine ganze Zahl Quadratwurzel aus einer ganzen Zahl (das heißt Boden (sqrt (i))) finden will, ist es am besten eine ganze Zahl-nur Annäherung Routine zu verwenden, nicht wahr?

Nö. Die mathematischen Coprozessor (auf x86, das ist) hat eine fsqrt Anleitung. Umwandlung zu schweben, die Quadratwurzel, und die Umwandlung wieder in int ist schneller als ein All-Integer-Algorithmus.

Dann gibt es Dinge wie Speicher zugreifen, die Sie folgen können, aber nicht richtig apprecatiate, bis Sie in die Montage vertieft haben. Sagen Sie bitte eine verknüpfte Liste haben, und das erste Element in der Liste enthält eine Variable, die Sie häufig zugreifen müssen. Die Liste wird selten neu geordnet. Nun, jedes Mal, wenn Sie brauchen diese Variable zugreifen zu können, benötigen Sie den Zeiger auf das erste Element in der Liste zu laden, dann ist das verwenden, laden Sie die Variable (vorausgesetzt, Sie nicht die Adresse der Variablen in einem Register zwischen den Anwendungen halten) . Wenn Sie stattdessen die Variable außerhalb der Liste gespeichert ist, müssen Sie nur einen einzigen Lastbetrieb.

Natürlich Speicher ein paar Zyklen hier und da ist in der Regel in diesen Tagen nicht so wichtig. Aber wenn Sie auf das Schreiben von Code planen, die schnell sein muss, kann diese Art von Wissen sowohl mit Inline-Assembler und in der Regel in anderen Sprachen angewendet werden.

Wie wäre es Konventionen nennen? (Einige Monteure kümmern sich um das für Sie -. Echte Programmierer nicht mit denen verwenden) Hat der Anrufer oder Angerufene den Stapel aufzuräumen? Verwenden Sie auch den Stapel? Sie können die Werte in den Registern passieren - aber aufgrund des lustigen x86-Befehlssatzes, ist es besser, bestimmte Dinge in bestimmten Registern zu übergeben. Und das wird Register erhalten? Eine Sache C-Compiler kann nicht wirklich von sich selbst optimieren ist, um Anrufe.

Es gibt kleine Tricks wie Pushing eine Rücksendeadresse und dann in eine Prozedur JMPing; wenn die Prozedur zurückkehrt wird er in der gedrückten Adresse gehen. Diese Abweichung von der üblichen Art und Weise über Funktionsaufrufe des Denkens ist ein weiterer diese „Zustände der Erleuchtung“. Wenn Sie jemals eine Programmiersprache mit innovativen Funktionen zu entwerfen waren, sollen Sie über lustige Dinge wissen, dass die Hardware in der Lage ist.

Die Kenntnis der Assemblersprache lernen Sie, architekturspezifische Dinge über Computer-Sicherheit. Wie Sie vielleicht Pufferüberlauf ausnutzen, oder in der Kernel-Modus brechen, und wie solche Angriffe zu verhindern.

Dann gibt es die ubercoolness von selbst-modifizierenden Code, und als verwandtes Thema, Mechanismen für Dinge wie Verlagerungen und Einspielen von Patches, um Code (dies muss Untersuchung von Maschinencode als auch).

Aber all diese Dinge brauchen die richtige Art von Geist. Wenn Sie die Art von Person, die setzen kann

while(x--)
{
  ...
}

für einen guten Zweck, wenn Sie lernen, was es tut, aber würde es schwierig, herauszufinden, was es selbst tut, dann Assembler-Sprache ist wahrscheinlich eine Verschwendung von Zeit.

Andere Tipps

Register Zuweisung und Verwaltung

Montag gibt Ihnen eine sehr gute Vorstellung davon, wie viele Variablen (Machine-Wort-sized ganze Zahlen) die CPU gleichzeitig jonglieren kann. Wenn Sie Ihre Schleifen nach unten brechen kann, so dass sie nur wenige temporäre Variablen beinhalten, werden sie alle passen in den Registern. Wenn nicht, wird Ihre Schleife langsam laufen, wie die Dinge in dem Speicher erhalten ausgelagert.

Das hat mir wirklich geholfen, mit meiner C-Codierung. Ich versuche, alle Schleifen dicht und einfach zu machen, mit so wenig Spaghetti wie möglich.

x86 ist stumm

mehr Assemblersprachen Lernen hat mir klar gemacht, wie lahm der x86-Befehlssatz ist. Befehle variabler Länge? Schwer zu sagen voraus Timing? Nicht-orthogonale Adressierungsarten? Ugh.

Die Welt wäre besser, wenn wir alle MIPS laufen, glaube ich, oder auch ARM oder PowerPC :-) Oder besser gesagt, wenn Intel / AMD nahm ihre Halbleiter-Know-how und die verwendeten Multi-Core, ultraschnellen, ultra zu machen -günstig MIPS-Prozessoren statt x86-Prozessoren mit all diesen erlösenden Qualitäten.

Es ist gut, Assembler-Sprache zu kennen, um ein besseres Verständnis zu gewinnen, wie der Computer funktioniert „unter der Haube“, und es hilft, wenn man etwas debuggen und alle Debugger können Sie eine Assembler-Code Auflistung, die bei dest gibt Ihnen Gelegenheit, herauszufinden, zu kämpfen, was das Problem sein könnte. Allerdings versuchen, Low-Level-Kenntnisse zu High-Level-Programmiersprachen anzuwenden, wie versuchen zu nutzen, wie die CPU-Instruktionen speichert und dann wackelig High-Level-Code zu schreiben, die Compiler zu erzwingen supereffizienten Maschinencode zu erzeugen, ist wahrscheinlich ein Zeichen dafür, dass Sie auf Mikro-optimize versuchen. In den meisten Fällen ist es meist besser, nicht zu versuchen, den Compiler auszuzutricksen, wenn Sie die Leistungssteigerung benötigen, wobei in diesem Fall könnten Sie auch diese Bits in der Montage schreiben sowieso.

Also, es ist eine gute Anordnung zum besseren Verständnis zu wissen, wie die Dinge funktionieren, aber die gewonnenen Erkenntnisse nicht unbedingt unmittelbar, wie Sie Code in Hochsprachen schreiben. In diesem Sinne fand ich jedoch, dass das Lernen, wie Funktion Arbeit bei der Montage-Code-Ebene nennt (das Lernen über den Stapel und die damit verbundenen Register, um zu lernen, wie Parameter auf dem Stack übergeben werden, zu lernen, wie automatische Speicherung funktioniert, etc.) gemacht viel leichter zu Problemen verstehe ich in höherer Ebene Code hatte, wie „aus Stapelspeicher“ Fehler und „ungültig aufruf~~POS=TRUNC“ Fehler.

Das wichtigste Konzept ist SIMD und kreativer Gebrauch davon. Die richtige Einsatz von SIMD kann in einer massiven Vielzahl von Anwendungen von allem von String-Verarbeitung zu Videomanipulation im Bereich enorme Leistungsvorteile gibt Mathe Matrix. Hier können Sie verwinden können 10x Leistungssteigerung im Vergleich zu reinem C-Code -. Deshalb Montag noch sinnvoll über die bloßen Debuggen sind

Einige Beispiele aus dem Projekt arbeite ich an (alle Zahlen sind Taktzyklus zählt auf einem Core 2):

Inverse 8x8 H.264 DCT (Frequenz-Transformation):

c: 1332
mmx: 187
sse2: 127

8x8-Chroma-Bewegungskompensation (bilinear Interpolationsfilter):

c: 639
mmx: 144
sse2: 110
ssse3: 79

4 16x16 Summe der absoluten Differenz-Operationen (Bewegungssuche):

c: 3948
mmx: 278
sse2: 231
ssse3: 215

(ja, das ist richtig - über 18x schneller als C)

Die mittleren quadratischen Fehler eines 16x16-Block:

c: 1013
mmx: 193
sse2: 131

Variance eines 16x16-Block:

c: 783
mmx: 171
sse2: 106

Speicher, Register, Sprünge, Schleifen, Verschiebungen und die verschiedenen Operationen kann man in Assembler auszuführen. Ich vermisse die Tage der Debuggen meiner Assemblersprache Klasse Programme - sie waren schmerzhaft! -. Aber es gab mir sicherlich eine gute Grundlage

Wir vergessen (oder wusste nie, vielleicht), dass alle diese Phantasie-Hosen Sachen, die wir heute verwenden (und das ich liebe!) Kocht am Ende all dieses Zeug hinunter.

Jetzt können wir sicherlich eine produktive und lukrative Karriere haben, ohne zu wissen, Assembler, aber ich denke, diese Konzepte sind gut zu wissen.

würde ich, dass das Lernen Rekursion sagen und Schleifen in der Montage mich viel gelehrt hat. Es machte mir das zugrunde liegende Konzept verstehen, wie die Compiler / Interpreter der Sprache, die ich Dinge drückt auf einen Stapel mit bin, und knallt sie ab, wie es sie braucht. Ich habe auch gelernt, wie der berüchtigten Stack-Überlauf zu nutzen. (Das ist immer noch überraschend einfach in C mit einigen get- und wechselseitigen Put- Befehlen).

Anders als in alltäglichen Situationen mit asm, glaube ich nicht, dass ich mir Versammlung gelehrt einer der Konzepte verwenden würde.

Ich würde sagen, dass Adressierungsarten sind extrem wichtig.

Meine Alma Mater hat, dass eine extreme und weil x86 nicht genug von ihnen hatten wir alles auf einem Simulator von PDP11 untersucht, die mindestens 7 von ihnen gehabt haben muss, dass ich mich erinnere. Im Nachhinein war das eine gute Wahl.

Timing

schnelle Ausführung:

  • Parallelverarbeitung
  • Sie einfach den Anweisungen
  • Lookup-Tabellen
  • Verzweigungsvorhersage, Pipelining

schnell langsam Zugang zu Speicheranlagen:

  • Register
  • Cache und verschiedene Ebenen der Cache
  • Speicher-Heap und Stack
  • virtueller Speicher
  • externe I / O

Heute ist x86 asm zu den Eingeweiden der CPU nicht eine direkte Linie, sondern eher eine API. Die Assembler Opcodes Sie schreiben sind, sich in einen ganz anderen Befehlssatz kompiliert werden, neu geordnet, neu geschrieben, mit festen und in der Regel bis zur Unkenntlichkeit verstümmelt.

So ist es ist nicht wie Assembler zu lernen gibt Ihnen einen grundlegenden Einblick in das, was in der CPU vor sich geht. IMHO, wichtiger als Assembler Lernen ist ein gutes Verständnis davon, wie der Ziel-CPU und die Speicherhierarchie funktionieren.

Diese Reihe von Artikeln letztere Thema behandelt ziemlich gründlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top