AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Assembler - Register dynamisch bestimmen.

Assembler - Register dynamisch bestimmen.

Ein Thema von markus888 · begonnen am 16. Apr 2020 · letzter Beitrag vom 22. Mai 2020
Antwort Antwort
Seite 1 von 2  1 2   
markus888
Online

Registriert seit: 23. Dez 2018
24 Beiträge
 
#1

Assembler - Register dynamisch bestimmen.

  Alt 16. Apr 2020, 12:00
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:

http://docwiki.embarcadero.com/RADSt...sembler-Syntax

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

Geändert von markus888 (16. Apr 2020 um 12:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General
Online

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.145 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Assembler - Register dynamisch bestimmen.

  Alt 16. Apr 2020, 12:12
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
markus888
Online

Registriert seit: 23. Dez 2018
24 Beiträge
 
#3

AW: Assembler - Register dynamisch bestimmen.

  Alt 16. Apr 2020, 13:44
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.
Das wäre ja lustig, wenn es möglich wäre den Code so zu überschreiben.
Da müsste man wohl eher Hacker fragen.

Da musst du wahrscheinlich noch vorher mit VirtualProtect dran.
Das habe ich nicht gekannt - bin ja ganz am Anfang was Delphi betrifft.
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.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General
Online

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.145 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Assembler - Register dynamisch bestimmen.

  Alt 16. Apr 2020, 15:28
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.
Das wäre ja lustig, wenn es möglich wäre den Code so zu überschreiben.
Da müsste man wohl eher Hacker fragen.
Das ist definitiv möglich. Den Code zu überschreiben bzw. dynamisch zu erzeugen ist ja gerade das was du machen willst.
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.128 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Assembler - Register dynamisch bestimmen.

  Alt 16. Apr 2020, 16:58
Danach mit MSDN-Library durchsuchenVirtualProtect den Schreibschutz wiederherstellen und ein MSDN-Library durchsuchenFlushInstructionCache kann auch nicht schaden, da hier ja Programmcode verändert wurde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
markus888
Online

Registriert seit: 23. Dez 2018
24 Beiträge
 
#6

AW: Assembler - Register dynamisch bestimmen.

  Alt 16. Apr 2020, 17:44
Also ja: das was du in deinem ursprünglichen Post fragst ist möglich.
Alles klar, dann werd ich mich mal einlesen.
Danke.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
757 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Assembler - Register dynamisch bestimmen.

  Alt 16. Apr 2020, 22:40
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.
Das wäre ja lustig, wenn es möglich wäre den Code so zu überschreiben.
Da müsste man wohl eher Hacker fragen.
Das gab es zumindest zu DOS Zeiten wirklich. Nannte sich selbstmodifizierender Code und wurde benutzt
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.128 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Assembler - Register dynamisch bestimmen.

  Alt 17. Apr 2020, 02:20
Und wer Cracker die Debugger nutzten ärgern wollte baute viele Int3 Aufrufe ein. Soweit ich weiß
fungierte Int3 nämlich als Breakpoint...
Ist immernoch so und ist einer der wenigen Interupts, die man im Usermode jetzt noch benutzen kann, neben der passenden Winapi MSDN-Library durchsuchenDebugBreak, welches intern auch gleich noch mit Bei Google suchenIsDebuggerPresent prüft.
z.B. als Inline-Assembler asm int 3 end; mittten im Delphi-Code (Win32). In Win64 so nicht mehr, da es dort kein Inline-Assembler gibt. (nur noch komplette Methoden)
Nur wenn kein Debugger dran hängt, dann raucht das natürlich mit einer Exception ab.

Und das MSDN-Library durchsuchenFlushInstructionCache ist für modernere CPUs, welche den Befehlscode cachen, bzw. sich die nächsten Befehle schonmal vorab kopieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
markus888
Online

Registriert seit: 23. Dez 2018
24 Beiträge
 
#9

AW: Assembler - Register dynamisch bestimmen.

  Alt 17. Apr 2020, 09:27
Und das MSDN-Library durchsuchenFlushInstructionCache ist für modernere CPUs, welche den Befehlscode cachen, bzw. sich die nächsten Befehle schonmal vorab kopieren.
Wenn ich die FlushInstructionCache brauche, ist das für mich schon eher wieder uninteressant.

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.128 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Assembler - Register dynamisch bestimmen.

  Alt 17. Apr 2020, 10:24
Zitat:
muss ja in Schleife Code ändern
Da würde mir eher zu denken geben, ob da mit dem Konzept was nicht stimmen mag.

Zitat:
Da wird es wohl weit effizienter sein, ich verzichte auf den Luxus.
Dann heul aber auch nicht rum, wenn die CPU dann was anderes macht, als jetzt dort steht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf