AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Objektfelder mit Inline Assembler benutzen
Thema durchsuchen
Ansicht
Themen-Optionen

Objektfelder mit Inline Assembler benutzen

Ein Thema von Christian Seehase · begonnen am 3. Sep 2002 · letzter Beitrag vom 6. Sep 2002
Antwort Antwort
Seite 1 von 2  1 2      
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#1

Objektfelder mit Inline Assembler benutzen

  Alt 3. Sep 2002, 22:46
Moin Zusammen,

wie der Titel schon verrät, habe ich ein Objekt, dass Felder enthält, die ich mit Assembler benutzen will.
Bei diesen Feldern handelt es sich um Bufferpointer.

Das Auslesen des aktuellen Wertes gelingt mit

Code:
mov EDI,self.FpWork
auch problemlos, nur:

Wie bekomme ich anschliessend den veränderten Wert wieder in das Feld hinein?

Code:
mov self.FpWork,EDI
mov [self].FpWork,EDI
mov [self.FpWork],EDI
habe ich dazu schon probiert, allerdings mit dem kleinen Nachteil, dass sich in FpWork nach verlassen der Routine wieder der Eingangswert befindet (in jedem der drei Fälle)
Mit F7/F8 habe konnte ich schon feststellen, dass dieser Wert aber doch etwas anders sein müsste.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 4. Sep 2002, 12:10
Moin Zusammen,

jetzt bekomme ich allerdings Verständnisprobleme:

Zu Testzwecken habe ich mir einfach mal eine kleine Testmethode gebaut, die nichts weiter macht, als einen Pointer hochzuzählen.

Code:
asm
  push ESI
  mov ESI,self.FpTest
  inc ESI
  mov self.FpTest,ESI
  pop ESI
end;
Hier funktioniert das Setzen des Feldes problemlos.
Der Wert wird erhöht (was ja eigentlich auch so sein sollte).

In der Routine, in der es nicht funktioniert, stimmt der Wert im Feld, auch noch, wenn die gesicherten Register wieder zurückgeholt werden, erst nach verlassen der Methode nicht mehr
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3
  Alt 4. Sep 2002, 15:14
Auf Self sollte man in asm-Blöcken nicht direkt zugreifen. Der Zeiger Self sollte vorher in ein Register übertragen werden, über dass dann der Zugriff auf die Fehler erfolgt.
Code:
[b]asm[/b]
  push eax
  push edx

  [u]mov eax, Self[/u]
  mov edx, TForm1([eax]).FTest
  inc edx
  mov TForm1([eax]).FTest, edx

  pop edx
  pop eax
[b]end;[/b]
Das ist im Beispie Self in das eax Register lade hab ich aus der OnlineHilfe zum Aufruf von dynamischen und virtuellen Methoden mittels Inline Assembler.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 4. Sep 2002, 15:25
Moin jbg,

erstmal Danke für die Info.
Die Hilfe welcher Delphi Version meinst Du? In der 5er kann ich nichts entsprechendes Entdecken.

Die Variante self erst in ein anderes Register zu laden und dann mit diesem Wert weiter hatte ich ursprünglich auch benutzt, war dann allerdings, da es vom Ergebnis her keinen Unterschied machte wieder davon abgekommen.
Mit ein bisschen Glück funktionierts dann ja damit stabil.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5
  Alt 4. Sep 2002, 15:54
OnlineHilfe von Delphi 6 (bei 5 steht es nicht drinnen): Assembler directives
Im Index auf "assembler statements"/"Assembler Anweisungen" gehen und dreimal den den Button ">>" drücken. (Text steht weit unten)

Code:
[b]asm[/b]
  [i][u]// Instance pointer needs to be in EAX[/u][/i]
  MOV    EAX, e
  [i]// Retrieve VMT table entry[/i]
  MOV    EDX, [EAX]
  [i]// Now call the method at offset VMTOFFSET[/i]
  CALL   DWORD PTR [EDX + VMTOFFSET TExample.VirtualMethod]
[b]end[/b];
Ich habs gerade mit dem edi Register anstatt des eax probiert. Dabei tritt jedoch eine AV auf.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 4. Sep 2002, 16:09
Moin jbg,

danke, dann ist es mir also nicht einfach entgangen.

Ich hoffe mal, dass sich das Problem mit der AV bei der Verwendung von EDI nur auf das zuletzt von Dir gepostete Beispiel beschränkt.
Da ich Assembler zur Beschleunigung von Stringverarbeitungen einsetzen will wäre das sonst ausgesprochen ungünstig (und irgendwie auch nicht zu erklären, denn dafür sind EDI/ESI schliesslich da)
Eine in sich abgeschlossene Routine, bei der also die Felder nur gelesen, aber nicht geschrieben werden müssen tuts anstandslos.
Dort verwende ich aber auch die Kombination mov EDI,self mov EDI,[EDI].FpWork usw.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 4. Sep 2002, 20:13
Moin jbg,

erst einmal vielen Dank für Deine Hilfe.
Leider hatte auch die Art, wie es in der Hilfe beschrieben wurde keinerlei Änderung gebracht.
Ich hab' die Lösung jetzt zwar gefunden, vermag aber nicht zu glauben, wie sich das Problem umgehen lässt:

Als der Fehler auftrat, sah' die Routine so aus:

Code:
[b]procedure[/b] TcsTranslator.AddToResult;
[b]asm[/b]
[color=#000080]// die eigentliche Routine[/color]
[b]end[/b];
wenn ich es hingegen so mache, funktionierts:
Code:
[b]procedure[/b] TcsTranslator.AddToResult;
[b]begin[/b]
[b]asm[/b]
[color=#000080]// die eigentliche Routine[/color]
[b]end[/b];
[b]end[/b];
Wenn ich jetzt noch das Warum wüsste...
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#8
  Alt 6. Sep 2002, 10:15
Also, auf Anhieb würde ich als asm-Unkundiger raten, dass das erste eine reine Assembly-Funktion darstellt, während das zweite inline-Assembler in einer Object-Pascal-Funktion ist, und das Verhalten der beiden ist wohl etwas unterschiedlich...
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#9
  Alt 6. Sep 2002, 10:44
In der zweiten Variante erstellt Delphi die Aufrufe zum Sichern von Registern (Rücksprungadresse) und lädt wohl die Adresse des Self.Objektes. Zusätzlich wird am Ende die Rücksprungadresse widerhergestellt und der RETurn durchgeführt.
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#10
  Alt 6. Sep 2002, 10:57
Moin OregonGhost,

ja, den Eindruck könnte man haben, nur ist es nicht entsprechend dokumentiert.

Die Hilfe meint dazu:

Zitat von Delphi 5 Hilfe:
Mit dem integrierten Assembler können Sie komplette Prozeduren und Funktionen schreiben, für die keine begin...end-Anweisung erforderlich ist:
Scheint nur nicht zu stimmen, zumindest wenn es sich um Methoden handelt

Im CPU Fenster hab' ich's mir allerdings noch nicht angeschaut.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz