Gamestudio Links
Zorro Links
Newest Posts
Help with plotting multiple ZigZag
by degenerate_762. 04/30/24 23:23
M1 Oversampling
by 11honza11. 04/30/24 08:16
Trading Journey
by howardR. 04/28/24 09:55
Zorro Trader GPT
by TipmyPip. 04/27/24 13:50
Data from CSV not parsed correctly
by jcl. 04/26/24 11:18
Why Zorro supports up to 72 cores?
by jcl. 04/26/24 11:09
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
0 registered members (), 900 guests, and 2 spiders.
Key: Admin, Global Mod, Mod
Newest Members
firatv, wandaluciaia, Mega_Rod, EternallyCurious, howardR
19050 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
profiling funktionen (assembler - deutsch) #409697
10/20/12 23:00
10/20/12 23:00
Joined: Jul 2008
Posts: 894
T
TechMuc Offline OP
User
TechMuc  Offline OP
User
T

Joined: Jul 2008
Posts: 894
Hi,

Um es kurz zu halten vorneweg die Frage / das Problem: Ist es möglich die tatsächliche Adresse von wait(..) herauszufinden? Engine_GetFunc("wait") liefert nicht die Adresse die tatsächlich aufgerufen wird.

Länger und für das Verständnis wichtig: Ich bitte Sie auch hier kurz rüber zu fliegen. Ich denke ein solches Programm könnte der Lite-C Sprache sehr helfen

Ich schreibe aktuell einen sehr simplen Profiler für Lite-C. Der "Profiler" registiert zum jetztigen Zeitpunkt jeden Funktionsein- und austritt. Wird beispielshaft eine beliebige Lite-C User-Funktion aufgerufen, greift mein Coding an der entsprechenden Stelle ein - springt zu einer eigenen Funktion - und führt anschließend die User Funktion auf. Durch Manipulation des Stacks wird anschließend beim "Return" auf eine eigene Funktion zurückgesprungen. Für das Verständis: Dies funktioniert nicht durch Manipulation von Lite-C Coding sondern rein durch Änderung von Maschinenbefhlen / Assembler..
Dies klappt bis auf wenige Ausnahmen (siehe Overloaded Functions, anderer Thread) sehr gut.

Problemstellung ist der Scheduler / Wait. Um laufende (nicht aufgerufene) Funktionen zu überwachen muss der Scheduler überwacht werden. Im Folgenden ist das Konzept kurz an folgender Lite-C Funktion erklärt.

Code:
void test_2() {
	globalvar = 1;
	wait(1);
	globalvar = 2;
	return 2;
}



Bei Aufruf von test_2 durch den Compiler passiert folgendes:
test_2() --> forward auf meine Funktion --> Zurückleitung auf test_2() --> wait(1) wird ausgeführt / Funktion wird beendet und wieder fortgesetzt ohne das ich dies registrieren kann.

Passieren Soll:
test_2() --> forward auf meine Funktion --> Zurückleitung auf test_2() --> wait(1) --> Wait(1) wird intercepted und auf meine eigene Funktion weitergeleitet --> Echte Wait Funktion wird aufgerufen --> Funktion wird fortgesetzt und durch meine Funktion registriert.


Im Assembler sieht der Wait Aufruf in etwa wie folgt aus:
Code:
02DF1A7F  push        eax  <-- enthält die 1 als Parameterübergabe
02DF1A80  mov         eax,dword ptr [ebx+1194h]  --> enthält die "globale echte adresse von wait
02DF1A86  call        eax  --> jump zu wait
02DF1A88  add         esp,4  --> weiter in der Programmausführung.



Wäre ich in der Lage auf die reale Position von wait zuzugreifen, könnte ich zweierlei machen:
1) Den Aufruf auf die reale wait Funktion abfangen um diese "Beendigung" der Funktion registrieren zu können. Im Anschluss könnte ich die reale Wait Funktion aufrufen um den Programmablauf nicht zu stören.
2) Durch eine sehr schnelle Analyse des Stacks könnte ich das weiterführende Coding erkennen (hier Adresse 02DF1A88). Auch hier wäre eine Ersetzung von 5 Byte ab Adresse 02DF1A88 zu Gunsten eines Jump Befehls zu "meiner" Registrierfunktion möglich. Die "alten" 5 Bytes würden an eine andere Stelle im Speicher verschoben und dort ausgeführt.


==> Problemstellung:
Es scheint nicht möglich zu sein, die reale Position von wait Acknex-Versionsunabhängig zu überprüfen.
Sowohl engine_getfunc("wait") in C++ als auch ein var test=&wait; in Lite-C lieferen die Adresse einer anderen Funktion die anscheinend nichts mit der "echten" wait Funktion zu tun hat.


==> Gibt es eine Möglichket die Echte WAIT Funktion zu bekommen?

Grüße und vielen Dank,
Timo Stark

Last edited by TechMuc; 10/20/12 23:03.
Re: profiling funktionen (assembler - deutsch) [Re: TechMuc] #409726
10/21/12 13:43
10/21/12 13:43
Joined: Jul 2008
Posts: 894
T
TechMuc Offline OP
User
TechMuc  Offline OP
User
T

Joined: Jul 2008
Posts: 894
Hallo,

Eine weitere Frage: Ich kenne folgende Registerverwendung aus Visual Studio:

ESP: Zeigt die "Spitze" des Stacks an.
ESI: Gibt an wo sich das letzte Funktionsargument befindet.

Beispiel:
test(1,2,3) wird umgemünzt zu
push 3
push 2
push 1
call test

In der ersten Zeile von test beinhaltet das Register ESI die Stackadresse von dem Befehl "push 3", das Register ESP die höchste vorhandene Stackadresse.


In Lite-C generierten Assembler ist dies leider nicht der Fall. Welches Register wird vom Lite-C Compiler zur Sicherung des letzten Arguments verwendet? Oder wurde auf dieses Register komplett verzichtet, da eine dynamische Anzahl von Parametern eh nicht möglich ist?

Vielen Dank,
Grüße,
Timo

Re: profiling funktionen (assembler - deutsch) [Re: TechMuc] #409727
10/21/12 14:12
10/21/12 14:12
Joined: Jul 2008
Posts: 894
T
TechMuc Offline OP
User
TechMuc  Offline OP
User
T

Joined: Jul 2008
Posts: 894
Beide Fragen sind essentiell für die Entwicklung des Profilers. Ich würde mich sehr freuen wenn Sie für beide Fragen antworten hätten.

Normalerweise würde ich bei solchen Support Requests auch eine Bezahlung zur schnellen Lösung anbieten - aktuell entwickel ich aber (auch auf Grund der geringen 3D-Gamestudio Nutzerzahl) rein Open-Source basiert und will / kann mir das daher nich leisten. Ich hoffe dafür haben Sie Verständiss.

Re: profiling funktionen (assembler - deutsch) [Re: TechMuc] #409752
10/22/12 06:53
10/22/12 06:53
Joined: Jul 2000
Posts: 27,986
Frankfurt
jcl Offline

Chief Engineer
jcl  Offline

Chief Engineer

Joined: Jul 2000
Posts: 27,986
Frankfurt
Beides - Wait-Adresse und Zahl der Funktionsargumente - stehen im Moment nicht zur Verfügung. Wir können aber beides implementieren - ich habe es auf meine Liste gesetzt. Einen Auftrag für eine Variable zur Zahl der Funktionsargumente haben wir sowieso schon erhalten, so dass Sie nichts bezahlen müssen.

Re: profiling funktionen (assembler - deutsch) [Re: jcl] #409753
10/22/12 06:57
10/22/12 06:57
Joined: Jul 2008
Posts: 894
T
TechMuc Offline OP
User
TechMuc  Offline OP
User
T

Joined: Jul 2008
Posts: 894
Alles klar, vielen Dank für die rasche Antwort.

Da Gerade ein Engine-Befehl für die Referenz auf einen Wait Befehl nicht sehr aufwändig sein sollte, wäre es fantastisch, wenn dieses Feature so bald wie möglich implementiert werden könnte laugh Wenn die "korrekte" (korrekt ist nichr ganz das richtige Wort hier laugh ) Verwendung vom ESI Register in Zukunft noch dazu kommt wäre dies ein sehr schöner Bonus

Grüße,
Timo


Moderated by  old_bill, Tobias 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1