Entfernen des Prologs einer in reine Assembly geschriebenen Funktion

7

Ich benutze Delphi 2010. Kann ich Delphi sagen, dass es keinen Prolog für eine Funktion erzeugt? Ich schreibe einige reine Assembly-Funktionen wie folgt:

%Vor%

und ich möchte Delphi mitteilen, keinen Prolog und Epilog für diese Funktion zu erzeugen, wie C ++% __declspec(naked) .

Und so verschwendet niemand ihre Zeit, ich brauche keine Hilfe, damit diese Funktionen funktionieren mit der Prolog; Das kann ich schon machen. Es ist nur eine große Unannehmlichkeit und wird die Wartung zu einem großen Ärger machen. Ich muss die vom Compiler erzeugten Prologs manuell überprüfen, um ihre Länge zu sehen, und wenn sich das ändert, wird mein Programm abstürzen.

Ich weiß auch, dass ich die Funktion als eine Reihe von Bytes in einem Byte-Array schreiben kann, aber das wäre noch schlimmer, als die Länge von Delphis Prolog zu finden.

    
K. Charles 27.03.2011, 17:15
quelle

3 Antworten

19

Delphi generiert keine Prologe oder Epiloge für Funktionen mit keine Argumente und wird mit der Aufrufkonvention register deklariert. Wenn Sie Funktionen ohne Prologe möchten, deklarieren Sie sie als Zero-Argument, Register-Calling-Konvention-Funktionen. Überspringen Sie auch den Block begin - end und gehen Sie direkt in die Assembly.

%Vor%

Da Sie über die Art der Funktionen lügen, kann es schwierig sein, sie anzurufen. Wenn Sie eine Funktion so implementiert haben, als ob sie Parameter empfangen und eine andere Aufrufkonvention verwendet hätte, dann müssen Sie sicherstellen, dass der Compiler dies an der Aufrufseite weiß. Deklarieren Sie dazu einen Funktionszeiger, der den "echten" Typ Ihrer Funktion anstelle des deklarierten Typs widerspiegelt. Wenn Ihre Funktion beispielsweise eine stdcall-Funktion mit zwei Argumenten ist, geben Sie Folgendes ein:

%Vor%

Ordne diese Variable nun so zu, dass sie auf deine Funktion zeigt:

%Vor%

Zusätzlich zum Überspringen des Prologs und des Epilogs wird der Compiler die falsche Anweisung RET für diese Funktion erzeugen (wegen der unterschiedlichen Aufrufkonvention), also müssen Sie sicherstellen, dass Sie in Ihrem Code ret 8 sagen Statt dass der Compiler standardmäßig die Anweisung ret ausführen soll.

Die Länge von Delphis Prolog zu finden ist trivial, wenn Sie einen funktionierenden Debugger haben:

  1. Legen Sie einen Haltepunkt am Anfang der Funktion fest.
  2. Rufen Sie die Funktion auf.
  3. Wenn der Debugger am Haltepunkt stoppt, wechseln Sie in die CPU-Ansicht.
  4. Sehen Sie sich die Anweisungen an, aus denen der Prolog besteht.
  5. Zählen Sie die Bytes, die neben diesen Anweisungen angezeigt werden.
Rob Kennedy 27.03.2011, 17:34
quelle
1

Nach dem diesem embarcadero docwiki können Sie überspringen die umliegenden begin und end und der Compiler wird einiges davon überspringen. Aber wenn Sie wirklich reinen Assembler wollen, dann stellen Sie Ihre Funktion in eine separate Assembler-Datei, assemblieren Sie sie mit tasm (die exe heißt tasm32) und verlinken Sie sie. Sie verwenden dann die Direktive assembler im Delphi-Code.

    
Cosmin Prund 27.03.2011 17:37
quelle
0

Nicht

%Vor%

Mach den Trick?

    
Jens Björnhager 27.03.2011 17:34
quelle

Tags und Links