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.
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.
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:
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.