Frage
Gibt es Ressourcen zum Erlernen der Verwendung von Assembly in Delphi?
Hintergrundinformationen
Ich habe einige allgemeine Assembler- und Befehlssatzreferenzen (x86, MMX, SSE usw.) gefunden und gelesen. Aber ich finde es schwierig, diese Informationen in Delphi anzuwenden. Allgemeine Dinge wie zum Beispiel den Wert einer Klasseneigenschaft usw.
Ich möchte die Option verwenden, um Assembly zu verwenden, wenn Code optimiert wird.
Ich verstehe:
Ich bin daran interessiert zu lernen, wie man Assembly in Delphi verwendet, weil:
Hier ist eine Ressource, die hilfreich sein könnte ...
www. guidogybels.eu/docs/Using%20Assembler%20in%20Delphi.pdf
(Ich wollte mit dieser Information einen Kommentar zu @Glenn hinzufügen, bin aber gezwungen, den Antwortmechanismus zu verwenden, da ich neu in diesem Forum bin und nicht genug Reps ...)
Die meisten Optimierungen beinhalten die Erstellung besserer Algorithmen: normalerweise können Sie hier die Geschwindigkeit der "Größenordnung" erreichen, die sich verbessern lässt.
Die Welt der x64-Baugruppen ist eine große Veränderung gegenüber der Welt der x86-Baugruppen. Das bedeutet, dass Sie mit der Einführung von x64 in Delphi in XE2 (sehr bald) Ihren gesamten Assemblercode zweimal schreiben müssen .
Wenn Sie sich einen besseren Algorithmus in Delphi besorgen, können Sie diesen Assemblercode überhaupt nicht schreiben.
Der Hauptbereich, in dem die Assemblierung helfen kann (aber oft hilft auch der clever gestaltete Delphi-Code), ist das Bit / Byte-Twiddeln auf niedriger Ebene, zum Beispiel bei der Verschlüsselung. Auf der anderen Seite hat FastMM (der schnelle Speichermanager für Delphi) fast den gesamten Code in Delphi geschrieben.
Wie Macro schon geschrieben hat: Mit dem disassemblierten Code anzufangen ist oft ein guter Anfang. Baugruppenoptimierungen können jedoch sehr weit gehen.
Ein Beispiel, das Sie als Ausgangspunkt verwenden können, ist beispielsweise die SynCrypto-Einheit , die eine Option für die Verwendung von Delphi oder Assembler-Code bietet .
Wie ich Ihren Post gelesen habe, suchen Sie nicht so sehr nach Assembler-Ressourcen als Ressourcen, um zu erklären, wie Delphi-Deklarationen im Speicher strukturiert sind, so dass Sie über Assembler darauf zugreifen können. Das ist in der Tat schwierig, aber nicht unmöglich.
Hier ist eine gute Ressource, die ich gefunden habe, um zu verstehen, wie Delphi seine Deklarationen strukturiert . Da sich Assembler nur mit diskreten Datenadressen an CPU-definierte Datentypen beteiligt, sind Sie mit jeder Delphi-Struktur in Ordnung, solange Sie sie verstehen und richtig darauf zugreifen.
Das einzige andere Problem besteht in der Interaktion mit den Delphi-Prozedur- und -Funktionsköpfen, um die gewünschten Daten zu erhalten (vorausgesetzt, Sie möchten Ihren Assembler mit der Delphi-Inline-Funktion ausführen), aber das beinhaltet nur das Verständnis der Standardfunktionsaufrufkonventionen . Dies und das wird zu diesem Zweck nützlich sein, um diese zu verstehen.
Die Verwendung eines tatsächlichen Assemblers (verknüpfte OBJ-Dateien) im Gegensatz zum Inline-Assembler ist ein anderes Thema, das je nach ausgewähltem Assembler variieren kann. Sie können Informationen darüber auch finden, aber wenn Sie ein Interesse haben, können Sie diese Frage auch immer stellen.
HTH.
Um BASM effizient zu verwenden, müssen Sie sowohl (1) wissen, wie Delphi auf einer niedrigen Ebene vorgeht, als auch (2) eine Assemblierung durchführen. In den meisten Fällen werden Sie diese beiden Dinge nicht an einer Stelle beschrieben finden.
Aber Dennis Christensens BASM für Anfänger und das Delphi3000 Artikel gehen in diese Richtung. Für spezifischere Fragen ist neben Stackoverflow auch das BASM-Forum von Embarcadero nützlich.
Die einfachste Lösung ist, sie immer in Pascal zu codieren und den generierten Assembler zu betrachten.
In der Praxis ist Assembler normalerweise nur in engen Schleifen ein Pluspunkt, und im allgemeinen gibt es kaum Verbesserungen, wenn überhaupt. Ich habe nur ein Stück Assembler in meinem Code, und der Vorteil kommt von der Umcodierung einer Gleitkommavektoroperation in Festkomma-SSE. Die durch SIMD-Befehlssätze bereitgestellte Sättigung ist ein zusätzlicher Bonus.
Schlimmer noch, viel schlecht beratener Assembler-Code, der im Web herumschwimmt, ist tatsächlich langsamer als die Pascal-Äquivalente auf modernen Prozessoren, weil sich die Kompromisse der Prozessoren im Laufe der Zeit geändert haben.
Aktualisierung:
Laden Sie einfach die Klasseneigenschaft in eine lokale Variable im Prolog Ihrer Prozedur, bevor Sie die Assembler-Schleife eingeben, oder verschieben Sie den Assembler in eine andere Prozedur. Wähle deine Schlachten.
Das Studieren einer RTL / VCL-Quelle könnte auch Ideen ergeben, wie auf bestimmte Konstrukte zugegriffen werden kann.
Übrigens wird nicht jede Low-Level-Optimierung mit Assembler durchgeführt. Auf Pascal-Ebene mit etwas Pointer-Wissen kann auch viel getan werden, und Sachen wie Cache-Optimierung können manchmal auch auf Pascal-Ebene gemacht werden (siehe zB Cache-Optimierung von rotierenden Bitmaps )
Tags und Links optimization assembly delphi basm