2010-08-24 13 views
13

Wenn Sie eine Delphi-Prozedur oder -Funktion in Assemblercode schreiben, welche Register müssen am Ende der Prozedur gespeichert und auf den ursprünglichen Wert zurückgesetzt werden?Welche CPU-Register müssen am Ende einer asm-Prozedur in Delphi wiederhergestellt werden?

Wenn ich eine andere Delphi-Prozedur oder -Funktion von (Inline-) Assembly-Code aufrufen möchte, was kann ich erwarten, dass andere Funktionen mit den Registern zu tun haben? Welche Register werden auf ihre ursprünglichen Werte zurückgesetzt und welche nicht?

(Offensichtlich ist die gleiche Antwort auf beide Fragen gelten würde)

ich die default calling convention von Delphi gehe davon aus. Ich weiß, dass EAX für 32-Bit-Rückgabewerte verwendet wird. Und wenn man sich den Asm-Code in SysUtils.pas ansieht, scheint es, dass EBX, ESI und EDI geschoben und wiederhergestellt werden, aber die anderen nicht. Ich kann jedoch keine Dokumentation darüber finden.

Antwort

11

Die ersten drei Argumente einer Funktion in EAX, EDX gegeben und ECX, respectively. Zusätzliche Argumente werden auf den Stapel geschoben. Für eine Methode eines Objekts ist der Zeiger Self immer der (unsichtbare) erste Parameter. Das Ergebnis sollte in EAX sein. Für Funktionen, die lange Strings zurückgeben, ist der (unsichtbare) Parameter der Funktion der Zeiger auf die resultierende Zeichenkette (die selbst ein Zeiger auf das erste Zeichen der Zeichenkette ist).

EBX darf nicht verändert werden (es sei denn Sie es vor dem Ende des Verfahrens/Restore-Funktion), und so müssen nicht ESP, EBP, ESI oder EDI entweder. (1) Eine ausgezeichnete Einführung in Delphi Inline ASM wurde hier gefunden: http://www.delphi3000.com/articles/article_3766.asp

+2

Dies ist die richtige Information. Und wenn das Ergebnis ein Int64 ist, befindet es sich in EAX/EDX-Paar. –

+0

@ A.Bouchez: Sehr wahr. –

+2

Tatsächlich hängt das, was in den Registern ist, von der Aufrufkonvention ab. Nichts verbietet das Schreiben von "stdcall" - und "cdecl" -Assembler-Funktionen, die die Register nicht zum Übergeben von Parametern verwenden. Auch was in dem Register ist, was auf dem Stapel ist (und was in dem FPU-Register ist) hängt von dem Parametertyp ab. EBX, ESI, EDI können innerhalb des Verfahrens geändert werden, solange sie ordnungsgemäß gespeichert und wiederhergestellt werden. Natürlich ist das Berühren von EBP und ESP weitaus gefährlicher. –

4

Ich weiß nicht, ob die Dokumente auf dem neuesten Stand sind, aber Sie sollten einen Blick auf Using Inline Assembly Code (Win32 Only) am Embarcardero Wiki haben:

Zitat:

Im Allgemeinen sind die Regeln des Registers Verwendung in einer asm-Anweisung sind die gleichen wie bei einer externen Prozedur oder Funktion. Eine asm-Anweisung muss die EDI-, ESI-, ESP-, EBP- und EBX-Register beibehalten, kann aber die Register EAX, ECX und EDX frei modifizieren. Beim Eintritt in eine asm-Anweisung zeigt EBP auf den aktuellen Stapelrahmen und ESP zeigt auf die oberste Ebene des Stapels. Mit Ausnahme von ESP und EBP kann eine asm-Anweisung beim Eintrag in die Anweisung nichts über Registerinhalte annehmen.

+0

Danke für den Link, obwohl es gebrochen ist (eine schließende Klammer fehlt in der URL). – Servaas

+0

@Servaas: Siehst du die schließende Klammer oben nicht? :) Das Problem ist, dass StackOverflow (oder eigentlich MarkDown) URLs, die schließende Klammern enthalten, nicht interpretieren kann (natürlich). –

+0

Anscheinend wurde der Link behoben. Danke, Rob Kennedy. – Servaas