![]() |
Assembler - Register dynamisch bestimmen.
Ich arbeite mich grade etwas in Assembler ein und schreibe meine ersten Codes damit.
Unter anderem frage ich mich, ob es irgendwie möglich ist, dynamischen Code zu generieren. Die Aufgabe: In einem Multimedia Register muss ein Befehl auf eine dynamische Anzahl an Registern angewendet werden. z.B. xmm0 bis xmm3 jeweils um 4 Bit shiften, dann xmm0 bis xmm3 jeweils mit xmm4 bis xmm7 summieren. Das könnte dann genauso zmm0/ymm0 bis zmm(n) sein. - Ich weiß avx geht nicht direkt. Zuerst dachte ich daran Opcodes dynamisch zu erzeugen um das ganze in einer Schleife zu durchlaufen. DD EAX DD EineVariable aber das geht nicht - Fehlermeldung: Konstante erwartet. Das einzige was der Compiler nicht reklamiert: DD EineKonstante mit DW/DB immer der Fehler (Konstante erwartet), egal wie ich die Konstante deklariere (Byte, Word, DWord) In der Hilfe gibts ja diverse Beispiele dazu: ![]() z.B: DD MyVar { Pointer to MyVar } Da wünscht sich der Compiler aber laut Fehlermeldung eine Konstante. Kennt wer einen Weg, wie das funktionieren könnte, oder muss ich wirklich jeden Fall fix im Code hinterlegen? Oder kann ich den Compiler dazu bewegen, eine normale Variable oder ein Register zu verwenden? Danke Markus |
AW: Assembler - Register dynamisch bestimmen.
DD wird zur Compilierzeit "ausgeführt" und setzt einfach nur einen festen Wert an diese Speicherstelle im Code.
Das geht natürlich nicht mit Variablen, weil die beim Compilieren natürlich noch undefiniert sind. Da musst du mov benutzen um den Speicher an der Stelle zu modifizieren. Bedenke aber dass Code Segmente standardmäßig readonly sind und nicht beschrieben werden können. Da musst du wahrscheinlich noch vorher mit VirtualProtect dran. |
AW: Assembler - Register dynamisch bestimmen.
Zitat:
Da müsste man wohl eher Hacker fragen. :-D Zitat:
Hab bis jetzt nur einige dll und wenige Klassen für die Nutzung aus VBA geschrieben. Würde mir jetzt aus meiner Sicht eher nichts bringen. Notfalls muss eben jede Konstellation Coden. Es geht mir vorerst darum die Grenzen der Möglichkeiten auszuloten. Danke jedenfalls, für die Ideen. |
AW: Assembler - Register dynamisch bestimmen.
Zitat:
Und ja: das geht. Du musst halt wie gesagt nur den Speicher in dem du den Code schreiben/modifizieren willst mit VirtualProtect schreibbar machen. VirtualProtect ist übrigens nicht Delphi-spezifisch. Das ist eine Windows API. Also ja: das was du in deinem ursprünglichen Post fragst ist möglich. |
AW: Assembler - Register dynamisch bestimmen.
Danach mit
![]() ![]() |
AW: Assembler - Register dynamisch bestimmen.
Zitat:
Danke. |
AW: Assembler - Register dynamisch bestimmen.
Zitat:
um Virenscanner und Debugger auszutricksen. Debugger hatten scheinbar gerne Probleme, wenn man genau den Befehl, den der Debugger gerade untersuchte genau zu dem Zeitpunkt modifiziert hat oder so ähnlich... ;-) Und wer Cracker die Debugger nutzten ärgern wollte baute viele Int3 Aufrufe ein. Soweit ich weiß fungierte Int3 nämlich als Breakpoint... ;-) |
AW: Assembler - Register dynamisch bestimmen.
Zitat:
![]() ![]() z.B. als Inline-Assembler
Delphi-Quellcode:
mittten im Delphi-Code (Win32). In Win64 so nicht mehr, da es dort kein Inline-Assembler gibt. (nur noch komplette Methoden)
asm int 3 end;
Nur wenn kein Debugger dran hängt, dann raucht das natürlich mit einer Exception ab. Und das ![]() |
AW: Assembler - Register dynamisch bestimmen.
Zitat:
Ich muss ja in jeder Schleife Code ändern. Abgesehen davon, dass FlushInstructionCache mir dann noch zusätzlich die Inhalte von Registern ändern wird, was den gesamten Overhead dann noch vergrößert. Da wird es wohl weit effizienter sein, ich verzichte auf den Luxus. |
AW: Assembler - Register dynamisch bestimmen.
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz