Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Result einer Funktion in ASM auswerten (https://www.delphipraxis.net/72078-result-einer-funktion-asm-auswerten.html)

Win32.API 25. Jun 2006 11:48


Result einer Funktion in ASM auswerten
 
Hi,
wie kann man das (den?) Result einer Funktion in ASM auswerten?


Delphi-Quellcode:
function foo:String;
begin
  result := 'hello world!'
end;

asm
  mov eax, call foo
end;
geht nicht :O.




danke, win32

Dax 25. Jun 2006 11:51

Re: Result einer Funktion in ASM auswerten
 
Öhm, Delphi legt seine Result, falls es Typen sind mit Größen <= 4 Byte, immer in EAX ab, also reicht ein
Delphi-Quellcode:
asm
  call foo
end;
;)

Größere Typen, zB records, kommen auf den Stack, Fließkommazahlen verbleiben in ST(0).

Win32.API 25. Jun 2006 12:03

Re: Result einer Funktion in ASM auswerten
 
Danke fuer deine Antwort, aber wieso funktioniert das dann nicht:

Delphi-Quellcode:
asm
  call foo
  call Showmessage
end;
:gruebel:

Dax 25. Jun 2006 12:11

Re: Result einer Funktion in ASM auswerten
 
Keine Ahnung :gruebel:

Kuck dir doch mal an, welchen Code ShowMessage(foo()); produziert (-> CPU-Fenster), LString-Handling ist nicht simpel - vielleicht liegts daran.

Win32.API 25. Jun 2006 12:23

Re: Result einer Funktion in ASM auswerten
 
Hmm, so sehe ich schonmal die Message, aber ich bekomme immer noch eine AV :wall:

Delphi-Quellcode:
asm
  lea eax,[ebp-$04]
  call foo
  mov eax,[ebp-$04]
  call showmessage
end;

himitsu 26. Jun 2006 10:45

Re: Result einer Funktion in ASM auswerten
 
Was versteckt sich hinter [ebp-$04]? (eine vorinitialisierte String-Variable?)

Aber mach's dir doch nicht so schwer, wenn garnichts geht, dann schreib ich einfach was in Pascal, schau wie es Delphi macht und mach's nach :zwinker:

Win32.API 26. Jun 2006 11:13

Re: Result einer Funktion in ASM auswerten
 
Danke fuer deine Antwort, ich habe geguckt wie es delphi macht und es nachgemacht:

[ebp-$04] lagert imho eine Variable aus ...

SHowmessage(foo) ->

Delphi-Quellcode:
lea, eax,[ebp-$04]
call foo
mov eax,[ebp-$04]
call showmessage
(so stehts im CPU fenster)

Ich bin leider nicht so der Asm Profi , aber eigentlich muesste es doch so laufen, oder?


grueße win32

himitsu 26. Jun 2006 11:28

Re: Result einer Funktion in ASM auswerten
 
Zitat:

Zitat von Win32.API
[ebp-$04] lagert imho eine Variable aus ...

nein, es gibt die Position an, wo eine Stringvariable steht :zwinker:

Delphi-Quellcode:
var S: String;
asm
  lea eax, &S
  call foo
  mov eax, &S
  call showmessage
end;
oder selbergemacht.

Delphi-Quellcode:
var S: String;
asm
  mov [ebp-$04], 0  // string initialisieren
  lea eax, [ebp-$04]
  call foo
  mov eax, [ebp-$04]
  call showmessage
  mov eax, [ebp-$04]
  call StringFreigeben
end;
"string initialisieren": aber aufpassen, daß nichts anderes an dieser Position liegt, ansonsten halt ein anderes Fleckchen suchen

"StringFreigeben": ich weiß grad nicht wie die Funktion heißt .... schau einfach mal was bei "S := ''" gemacht wird ... die Funktion ist irgendwo in der System.pas definiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 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