Suchen und Ersetzen von Arrayelementen
Verfasst: Mi Nov 30, 2016 10:55 am
Hallo,
ich beschäftige mich momentan mit einem Assembler Code. Der Code wurde von einem Compiler generiert und benutzt deswegen deutlich mehr Variablen als wenn der Code von einem Menschen geschrieben werden würde. Nun, mir ist bewusst, dass Assembler keine Variablen, sondern nur Bits, Bytes und Register kennt. Als "Variablen" bezeichne ich einen bestimmten Wert, der zum festen Zeitpunkt zum Beispiel im Register R0 steht. Ich habe einen Algorithmus ausgedacht, mit denen man die Anzahl von verwendeten Registern reduzieren könnte und bitte darum, mir etwas Fachsprache bei der Formulierung von dem Algorithmus beizubringen.
Zunächst die Voraussetzungen: Was braucht mein Algorithmus?
Mein Algorithmus braucht den generierten Assemblercode -> check, diesen kann ich mir bereits in der Matlab Kommandozeile anzeigen lassen.
Mein Algorithmus braucht eine Liste der Variablennamen, welche im Code verwendet werden -> auch diese kann ich mir bereits anzeigen lassen.
Idee:
Wenn zum Beispiel m Assembler Code steht: add X Y, und die Variable X im Register 0 steht, die Variable Y im Register 1, dann werden beiden Variablen addiert und das Ergebnis in das Register 0 geschrieben. Falls nun im Code nirgendswo mehr die Variable Y, gelesen oder geschrieben wird, kann man diesen Namen (bzw. somit das Register 1) mit einem anderen Wert belegen. Das heisst, wenn weiter im Code eine Zeile auftaucht mit zum Bsp. add Z W, dann kann man die Y-Variable (und somit das Register 1) zum Beispiel der Variable Z geben. Somit wäre der Code um einen Register (der, wo Z steht) reduziert. Das Problem für den Algorithmus lässt sich zu einer Suche in einem Array reduzieren. Da der Code im wesentlichen ein Array darstellt, wo jedes Array Element eine Assembler Anweisung ist. Die Elemente nach denen gesucht werden soll, stehen dabei bereits in einem anderen Array zur Verfügung.
Umsetzung:
1. Öffnen Assembler Code (Array 1) und Variablenliste (Array 2)
2. Vertauschen der Reihenfolge der Code Zeilen ->damit wird erreicht, dass immer die zuletzt vorkommenden Variablen als erstes gelesen werden
3. Zeilenweise Einlesen des "geflippten" Code -> Bedienung für die While Schleife
4. Suche Array 1 nach jedem Element aus Array 2 durch und markiere die entsprechenden Stellen im Array 1 -> hier würde ich eine For Schleife benutzen, für die Anzahl der Elemente des Array 2
5. Speichere die ersten (eigentlich ja die letzten, weil das Array 1 geflippt ist) vorkommenden Variablennamen im Array 3 ab. -> über For Schleife Array 3 bauen
6. Ersetze im Array 1 die letzten markierten Stellen mit den Elementen aus Array 3.
7. Schließen und speichern.
Nun zu meinen Fragen. Bevor ich in Matlab drauflos programmiere, kann der Algorithmus überhaupt funktionieren, oder habe ich aufgrund des fehlenden Informatikwissens den letzten Unsinn formuliert?
Das Array 3 wird eine unbekannte Anzahl an Elementen haben, ich habe gelesen statt nur Arrays gibt es auch Listen. Der Hauptunterschied zu den Arrays ist, Listen haben Zeiger (sowas wie Vektoren in der Geometrie), mit denen man flexibel Elemente zu der Liste hinzufügen kann. Kann man über diese Zeiger die Elemente (aus Array 1 in meinem Fall) auch löschen? Ich hoffe ich übersehe nichts und konnte mein Problem kurz und verständlich darstellen.
Vielen Dank für die Aufmerksamkeit und beste Grüße, Robert.
ich beschäftige mich momentan mit einem Assembler Code. Der Code wurde von einem Compiler generiert und benutzt deswegen deutlich mehr Variablen als wenn der Code von einem Menschen geschrieben werden würde. Nun, mir ist bewusst, dass Assembler keine Variablen, sondern nur Bits, Bytes und Register kennt. Als "Variablen" bezeichne ich einen bestimmten Wert, der zum festen Zeitpunkt zum Beispiel im Register R0 steht. Ich habe einen Algorithmus ausgedacht, mit denen man die Anzahl von verwendeten Registern reduzieren könnte und bitte darum, mir etwas Fachsprache bei der Formulierung von dem Algorithmus beizubringen.
Zunächst die Voraussetzungen: Was braucht mein Algorithmus?
Mein Algorithmus braucht den generierten Assemblercode -> check, diesen kann ich mir bereits in der Matlab Kommandozeile anzeigen lassen.
Mein Algorithmus braucht eine Liste der Variablennamen, welche im Code verwendet werden -> auch diese kann ich mir bereits anzeigen lassen.
Idee:
Wenn zum Beispiel m Assembler Code steht: add X Y, und die Variable X im Register 0 steht, die Variable Y im Register 1, dann werden beiden Variablen addiert und das Ergebnis in das Register 0 geschrieben. Falls nun im Code nirgendswo mehr die Variable Y, gelesen oder geschrieben wird, kann man diesen Namen (bzw. somit das Register 1) mit einem anderen Wert belegen. Das heisst, wenn weiter im Code eine Zeile auftaucht mit zum Bsp. add Z W, dann kann man die Y-Variable (und somit das Register 1) zum Beispiel der Variable Z geben. Somit wäre der Code um einen Register (der, wo Z steht) reduziert. Das Problem für den Algorithmus lässt sich zu einer Suche in einem Array reduzieren. Da der Code im wesentlichen ein Array darstellt, wo jedes Array Element eine Assembler Anweisung ist. Die Elemente nach denen gesucht werden soll, stehen dabei bereits in einem anderen Array zur Verfügung.
Umsetzung:
1. Öffnen Assembler Code (Array 1) und Variablenliste (Array 2)
2. Vertauschen der Reihenfolge der Code Zeilen ->damit wird erreicht, dass immer die zuletzt vorkommenden Variablen als erstes gelesen werden
3. Zeilenweise Einlesen des "geflippten" Code -> Bedienung für die While Schleife
4. Suche Array 1 nach jedem Element aus Array 2 durch und markiere die entsprechenden Stellen im Array 1 -> hier würde ich eine For Schleife benutzen, für die Anzahl der Elemente des Array 2
5. Speichere die ersten (eigentlich ja die letzten, weil das Array 1 geflippt ist) vorkommenden Variablennamen im Array 3 ab. -> über For Schleife Array 3 bauen
6. Ersetze im Array 1 die letzten markierten Stellen mit den Elementen aus Array 3.
7. Schließen und speichern.
Nun zu meinen Fragen. Bevor ich in Matlab drauflos programmiere, kann der Algorithmus überhaupt funktionieren, oder habe ich aufgrund des fehlenden Informatikwissens den letzten Unsinn formuliert?
Das Array 3 wird eine unbekannte Anzahl an Elementen haben, ich habe gelesen statt nur Arrays gibt es auch Listen. Der Hauptunterschied zu den Arrays ist, Listen haben Zeiger (sowas wie Vektoren in der Geometrie), mit denen man flexibel Elemente zu der Liste hinzufügen kann. Kann man über diese Zeiger die Elemente (aus Array 1 in meinem Fall) auch löschen? Ich hoffe ich übersehe nichts und konnte mein Problem kurz und verständlich darstellen.
Vielen Dank für die Aufmerksamkeit und beste Grüße, Robert.