AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Float-Parameter per ASM übergeben

Ein Thema von Neutral General · begonnen am 2. Jun 2008 · letzter Beitrag vom 7. Jun 2008
Antwort Antwort
Seite 2 von 2     12   
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Float-Parameter per ASM übergeben

  Alt 4. Jun 2008, 18:21
Was erhältst du denn, wenn du das mal so aufrufst?
Delphi-Quellcode:
procedure TForm1.Aufruf(Params: array of const);
begin
  Test3(TVarRec(Params[0]).vExtended^);
end;
Edit: Syntax korrigiert
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

Re: Float-Parameter per ASM übergeben

  Alt 4. Jun 2008, 18:27
Hi,

Dann funktionierts...
Ach ja... diese riesen ShowMessage lässt sich auch nicht wegklicken...
Michael
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Float-Parameter per ASM übergeben

  Alt 4. Jun 2008, 18:33
Setze mal einen Haltepunkt auf den Anfang von Test3 und gehe dort in die CPU-Ansicht und schaue dir den Stack an. Wo ist der Unterschied zwischen den Aufrufen?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

Re: Float-Parameter per ASM übergeben

  Alt 4. Jun 2008, 18:43
Hi,

hier zwei Screenshots. (Das ist doch der Stack oder?)

Der Stack bei normalem Aufruf:

Delphi-Quellcode:
procedure TForm1.ExecuteScriptMethod(Method: String;
  Params: array of Const);
begin
  Test3(Params[0].VExtended^);
  exit;
  // weiterer Code
end;
http://www.maillinks.de/fS09VxB5q086/StackNormal.jpg

und wenn ichs über meine Methode aufrufe:

(siehe Post weiter oben)

http://www.maillinks.de/fg6lRkk38tSt/StackAnders.jpg

Kann da jedoch nichts reininterpretieren...

Gruß
Neutral General
Michael
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Float-Parameter per ASM übergeben

  Alt 4. Jun 2008, 18:51
Ah, hier liegt eindeutig ein Alignment-Problem vor (ich kann allerdings nicht sagen, warum dass zu diesem seltsamen ShowMessage führt). Ich dachte, dass bei push word xyz automatisch auf ein DWord erweitert wird, anscheinend wird aber tatsächlich nur ein Word gepusht und ESP entsprechend nur um 2 verringert.
Ändere das mal so ab:
Delphi-Quellcode:
//statt
push word ptr [edx+$08]

//das verwenden:
movzx eax, word ptr [edx+$08]
push eax
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

Re: Float-Parameter per ASM übergeben

  Alt 5. Jun 2008, 21:05
Hi,

Also du hast mir bisher sehr geholfen. Es tut mir Leid, aber ich muss nochmal weiter nachfragen

Ich habe jetzt die "Float-Kompatibilität" auf die Parameter 3-n erweitert (bzw 4-n wenn man Self mitzählt), also die Parameter die auf dem Stack abgelegt werden.

Jedoch kommt bei mir in der Funktion immer nur der Wert: -3,6854775808e-3509.

Außerdem erhalte ich die Exception: "Ungültige Gleitkommaoperation in meiner Test4-Procedure:

Delphi-Quellcode:
procedure TForm1.Test4(b: Byte; S: String; f: Extended); //b und S sind nur damit f der dritte parameter sein kann
begin
  ShowMessage(S + ' ' + FloatToStrF(f,ffNumber,5,2) + IntToStr(b));
end;
Hab mir auch den Stack angeguckt: Ich glaube da ist diesesmal nichts verschoben, er sieht jetzt immer total anders aus...

Hier der Code:

Delphi-Quellcode:
procedure TForm1.ExecuteScriptMethod(Method: String;
  Params: array of Const);
var max,off: Integer;
    proc: Pointer;
begin
  proc := MethodAddress(Method);
  max := Length(Params);

  for i:= 2 to max-1 do
  begin
    off := i*8;
    asm
      mov edx,[Params]
      add edx,off
      movzx ecx,[edx+$04] // Params[i].VType --> ecx
      sub ecx,3 // if Params[i].VType = vtExtended
      jnz @NoExt
        movzx ecx, word ptr [edx+$08] // then...
        push ecx
        push [edx+$04]
        push [edx]
        jmp @LoopEnd
      @NoExt: // else
        push [edx]
      @LoopEnd:
    end;
  end;

  // edx,ecx Parameter und eax = Self Parameter folgen
end;
Apollonius... *hundeblick*
Michael
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Float-Parameter per ASM übergeben

  Alt 7. Jun 2008, 12:50
Du hast vergessen, den PExtended zu dereferenzieren. An den Anfang der Float-Behandlung muss noch ein mov edx, [edx].
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

Re: Float-Parameter per ASM übergeben

  Alt 7. Jun 2008, 12:57
Zitat von Apollonius:
Du hast vergessen, den PExtended zu dereferenzieren. An den Anfang der Float-Behandlung muss noch ein mov edx, [edx].
Hi,

wird nicht hier beim pushen in einem dereferenziert

Delphi-Quellcode:
  movzx ecx, word ptr [edx+$08]
  push ecx
  push [edx+$04]
  push [edx]


Wobei es trotzdem nicht funktioniert. (gleiches Problem wie vorher)
Delphi-Quellcode:
for i:= 2 to max-1 do
  begin
    off := i*8;
      asm
      mov edx,[Params]
      add edx,off
      mov edx,[edx] // <--- hinzugefügt

      movzx ecx,[edx+$04]
      sub ecx,3
      jnz @NoExt
        movzx ecx, word ptr [edx+$08]
        push ecx
        push [edx+$04]
        push [edx]
        jmp @LoopEnd
      @NoExt:
        push [edx]
      @LoopEnd:
    end;
  end;
EDIT:

Wenn ich

movzx ecx,[edx+$04] durch

Delphi-Quellcode:
  mov ecx,[Params]
  add ecx,off
  add ecx,4
  movzx ecx,[ecx]
ersetze, dann geht es o.O Warum das denn?
Michael
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#19

Re: Float-Parameter per ASM übergeben

  Alt 7. Jun 2008, 13:11
Nach
Delphi-Quellcode:
  mov edx,[Params]
  add edx,off
Steht in edx ein Zeiger auf einen TVarRec. Folglich steht dann mit movzx ecx,[edx+$04] in ecx vType, wenn du kein mov edx,[edx] davor einfügst.

Mit dem movzx ecx, word ptr [edx+$08] hast du dann allerdings in ecx schon den Anfang des nächsten TVarRec - schließlich zeigt edx auf einen, und SizeOf(TVarRec) ist 8.
Wenn du allerdings davor noch ein mov edx, [edx] einfügst, zeigt edx nicht mehr auf den TVarRec, sondern auf den Extended, und dann stimmt alles. Du solltest das mov edx, [edx] also am besten direkt nach jnz @NoExt einfügen.

Warum deine andere Lösung funktioniert, ist dann auch klar: Du hast zwar das mov edx, [edx] zu früh ausgeführt, aber um dir den vType zu holen, startest du von neuem und ignorierst den falschen Wert von edx. Allerdings wird es dann unangenehm für nicht-Floats.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 12:56 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