Schlüsselkonzepte zum Lernen in Assembly

7

Ich glaube fest an die Idee, dass eines der wichtigsten Dinge, die Sie beim Erlernen einer neuen Sprache bekommen, nicht die Verwendung einer neuen Sprache ist, sondern das Wissen über Konzepte, die Sie daraus ziehen. Ich frage nicht, wie wichtig oder nützlich Sie denken, Assembly ist, und es ist mir auch egal, wenn ich es nie in irgendeinem meiner realen Projekte verwende.

Was ich wissen möchte ist, welche Konzepte von Assembly für jeden generellen Programmierer am wichtigsten sind? Es muss nicht direkt mit Assembly zusammenhängen - es kann auch etwas sein, was der typische Programmierer, der seine gesamte Zeit in höheren Sprachen verbringt, nicht versteht oder als selbstverständlich betrachtet, wie den CPU-Cache.

>     
Spodi 28.09.2008, 22:25
quelle

9 Antworten

5

Ich denke, die Assembler-Sprache kann Ihnen viele kleine Dinge beibringen, sowie ein paar große Konzepte.

Ich werde ein paar Dinge aufzählen, die mir hier einfallen, aber es gibt keinen Ersatz dafür, sowohl x86 als auch einen RISC-Befehlssatz zu lernen und zu verwenden.

Sie denken wahrscheinlich, dass ganzzahlige Operationen am schnellsten sind. Wenn Sie eine ganzzahlige Quadratwurzel einer Ganzzahl (d. H. Floor (sqrt (i))) suchen möchten, ist es am besten, eine Nur-Ganzzahl-Näherungsroutine zu verwenden, richtig?

Nein. Der mathematische Koprozessor (auf x86) hat eine fsqrt Anweisung. Das Konvertieren in float, das Ziehen der Quadratwurzel und das Konvertieren in int ist schneller als ein Ganzzahlalgorithmus.

Dann gibt es Dinge wie den Zugriff auf den Speicher, denen Sie folgen können, aber nicht richtig schätzen, bis Sie sich mit der Montage beschäftigt haben. Angenommen, Sie hatten eine verknüpfte Liste, und das erste Element in der Liste enthält eine Variable, auf die Sie häufig zugreifen müssen. Die Liste wird selten neu geordnet. Nun, jedes Mal, wenn Sie auf diese Variable zugreifen müssen, müssen Sie den Zeiger auf das erste Element in der Liste laden und dann die Variable laden (vorausgesetzt, Sie können die Adresse der Variablen nicht in einem Register zwischen den Verwendungen behalten) . Wenn Sie die Variable stattdessen außerhalb der Liste speichern, benötigen Sie nur eine einzige Ladeoperation.

Natürlich ist das Speichern von ein paar Zyklen hier und da normalerweise heutzutage nicht wichtig. Aber wenn Sie vorhaben, Code zu schreiben, der schnell sein muss, kann dieses Wissen sowohl bei der Inline-Assemblierung als auch allgemein in anderen Sprachen angewendet werden.

Wie wäre es mit Conventions? (Einige Assembler erledigen das für Sie - echte Programmierer verwenden diese nicht.) Bereinigt der Aufrufer oder Angerufene den Stapel? Benutzt du den Stapel? Sie können Werte in Registern übergeben - aber aufgrund des lustigen x86-Befehlssatzes ist es besser, gewisse Dinge in bestimmten Registern zu übergeben. Und welche Register werden erhalten? Eine Sache, die C-Compiler nicht wirklich selbst optimieren können, sind Aufrufe.

Es gibt kleine Tricks wie PUSH eine Rücksendeadresse und dann JMPing in eine Prozedur; Wenn die Prozedur zurückkehrt, wird sie zur PUSHed-Adresse gehen. Diese Abkehr von der üblichen Denkweise über Funktionsaufrufe ist ein weiterer dieser "Zustände der Erleuchtung". Wenn Sie jemals eine Programmiersprache mit innovativen Funktionen entwerfen sollten, sollten Sie über lustige Dinge wissen, zu denen die Hardware fähig ist.

Kenntnisse der Assemblersprache vermitteln Ihnen architekturspezifische Dinge zur Computersicherheit. Wie Sie Pufferüberläufe ausnutzen oder in den Kernel-Modus einbrechen und wie Sie solche Angriffe verhindern können.

Dann gibt es die Überkühlungskraft von selbst modifizierendem Code und als ein verwandtes Problem Mechanismen für Dinge wie Umzüge und das Anwenden von Patches auf Code (dies erfordert auch eine Untersuchung des Maschinencodes).

Aber all diese Dinge brauchen die richtige Art von Verstand. Wenn Sie die Art von Person sind, die

setzen kann %Vor%

zu nutzen, sobald Sie lernen, was es tut, aber würde es schwer finden, herauszufinden, was es selbst macht, dann Assembler Sprache ist wahrscheinlich eine Verschwendung von Ihrer Zeit.

    
Artelius 05.11.2008, 00:49
quelle
7

Registrierung und Verwaltung

Assembly gibt Ihnen eine sehr gute Vorstellung davon, wie viele Variablen (maschinenwortgroße ganze Zahlen) die CPU gleichzeitig jonglieren kann. Wenn Sie Ihre Schleifen so abbrechen können, dass sie nur einige temporäre Variablen enthalten, passen sie alle in Register. Wenn nicht, wird Ihre Schleife langsam ausgeführt, während die Dinge in den Speicher ausgelagert werden.

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

x86 ist dumm

Als ich mehrere Assemblersprachen lernte, wurde mir klar, wie lahm der x86-Befehlssatz ist. Anweisungen mit variabler Länge? Schwer vorhersehbares Timing? Nicht-orthogonale Adressierungsmodi? Ugh.

Die Welt wäre besser, wenn wir alle MIPS betreiben würden, denke ich, oder sogar ARM oder PowerPC :-) Oder vielmehr, wenn Intel / AMD ihr Halbleiter-Know-how nutzen und es multi-core, ultra-schnell, ultra machen -Verwende MIPS-Prozessoren anstelle von x86-Prozessoren mit all diesen einlösenden Qualitäten.

    
Dan Lenski 01.10.2008 03:46
quelle
4

Es ist gut, die Assemblersprache zu kennen, um einen besseren Eindruck davon zu bekommen, wie der Computer "unter der Haube" funktioniert, und es hilft, wenn Sie etwas debuggen und der Debugger Ihnen einen Assembly-Code-Listing geben kann Wenigstens gibt es die Chance, herauszufinden, was das Problem sein könnte. Es ist jedoch wahrscheinlich, dass versucht wird, Low-level-Wissen auf High-Level-Programmiersprachen anzuwenden, wie zum Beispiel den Vorteil, wie die CPU Befehle zwischenspeichert und dann wackeligen High-Level-Code schreibt, um den Compiler zur Erzeugung von super-effizientem Maschinencode zu zwingen ein Zeichen, dass Sie versuchen, Mikro-Optimierung. In den meisten Fällen ist es in der Regel besser, nicht zu versuchen, den Compiler zu überlisten, es sei denn, Sie benötigen den Leistungsgewinn. In diesem Fall können Sie diese Bits auch in die Assembly schreiben.

Es ist also gut, Assembly zu kennen, um besser zu verstehen, wie die Dinge funktionieren, aber das gewonnene Wissen ist nicht unbedingt direkt anwendbar auf das Schreiben von Code in höheren Programmiersprachen. In diesem Zusammenhang habe ich jedoch festgestellt, dass das Erlernen, wie Funktionsaufrufe auf Assembly-Code-Ebene funktionieren (Lernen über den Stack und die zugehörigen Register, Lernen, wie Parameter auf dem Stack übergeben werden, wie der automatische Speicher funktioniert usw.), funktioniert viel einfacher zu verstehen, Probleme, die ich in höherer Code hatte, wie "out of Stack-Space" -Fehler und "ungültige Aufruf Konvention" Fehler.

    
Mike Spross 28.09.2008 22:48
quelle
3

Das wichtigste Konzept ist SIMD und seine kreative Verwendung. Die richtige Verwendung von SIMD kann enorme Leistungsvorteile in einer Vielzahl von Anwendungen bieten, die von der String-Verarbeitung über die Videobearbeitung bis hin zur Matrix-Mathematik reichen. Dies ist, wo Sie über 10 x Leistungssteigerungen über reinen C-Code bekommen können - deshalb ist die Assemblierung immer noch nützlich, abgesehen von der einfachen Fehlersuche.

Einige Beispiele aus dem Projekt, an dem ich arbeite (alle Zahlen sind Taktzyklen auf einem Core 2):

Inverse 8x8 H.264 DCT (Frequenztransformation):

%Vor%

8x8 Chroma-Bewegungskompensation (bilineares Interpolationsfilter):

%Vor%

4 16x16 Summe der absoluten Differenzoperationen (Bewegungssuche):

%Vor%

(Ja, das stimmt - über 18x schneller als C!)

Mittlerer quadratischer Fehler eines 16x16-Blocks:

%Vor%

Abweichung eines 16x16-Blocks:

%Vor%     
Dark Shikari 29.09.2008 01:21
quelle
2

Speicher, Register, Sprünge, Schleifen, Verschiebungen und die verschiedenen Operationen, die man in Assembler ausführen kann. Ich vermisse nicht die Tage, an denen ich meine Assembly-Sprachkurse getestet habe - sie waren schmerzhaft! - Aber es hat mir sicherlich eine gute Grundlage gegeben.

Wir vergessen (oder wussten nie, vielleicht), dass all diese ausgefallenen Sachen, die wir heute benutzen (und die ich liebe!), am Ende auf all diese Dinge hinauslaufen.

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

    
itsmatt 28.09.2008 22:33
quelle
1

Ich würde sagen, dass das Lernen von Rekursion und Schleifen in der Montage mir viel beigebracht hat. Es hat mir das zugrundeliegende Konzept verständlich gemacht, wie der Compiler / Interpreter der Sprache, die ich verwende, Dinge auf einen Stapel schiebt und sie so absetzt, wie sie benötigt werden. Ich habe auch gelernt, wie man den berüchtigten Stapelüberlauf ausnutzt. (was in C mit einigen get- und put-Befehlen immer noch erstaunlich einfach ist).

Abgesehen von der Verwendung von asm in alltäglichen Situationen glaube ich nicht, dass ich eines der Konzepte verwenden würde, das mir die Assembly beigebracht hat.

    
helloandre 29.09.2008 01:32
quelle
0

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

Meine Alma Mater hat das extremiert, und weil x86 nicht genug davon hatte, haben wir alles auf einem Simulator von PDP11 studiert, der mindestens sieben von ihnen hatte, an die ich mich erinnere. Im Nachhinein war das eine gute Wahl.

    
Uri 29.09.2008 01:10
quelle
0

Timing

schnelle Ausführung:

  • parallele Verarbeitung
  • einfache Anweisungen
  • Nachschlagetabellen
  • Verzweigungsvorhersage, Pipelining

schnell zu langsamen Zugriff auf den Speicher:

  • registriert
  • Cache und verschiedene Cache-Ebenen
  • Speicher-Heap und -Stapel
  • virtueller Speicher
  • externe I / O
Mark Stock 29.09.2008 02:11
quelle
0

Heute ist x86 asm keine direkte Verbindung zu den Eingeweiden der CPU, sondern eher eine API. Die Assembler-Opcodes, die Sie schreiben, werden selbst in einen komplett anderen Befehlssatz kompiliert, neu geordnet, neu geschrieben, repariert und bis zur Unkenntlichkeit verfälscht.

Es ist also nicht so, dass Assembler Ihnen einen grundlegenden Einblick in die Vorgänge in der CPU gibt. IMHO, wichtiger als Lernen Assembler ist es, ein gutes Verständnis der Funktionsweise der Ziel-CPU und der Speicherhierarchie zu bekommen.

Diese Reihe von Artikeln behandelt das letzte Thema ziemlich gründlich.

    
Mike F 28.09.2008 22:34
quelle

Tags und Links