Frage

Wenn Sie eine Delphi Prozedur oder Funktion in Assembler-Code zu schreiben, die Register gespeichert und wiederhergestellt am Ende des Verfahrens auf den ursprünglichen Wert werden müssen?

Wenn Sie einen anderen Delphi-Verfahren oder eine Funktion von (inline) Assembler-Code aufrufen, was kann ich erwarten, dass andere Funktion mit den Registern zu tun? Welche Register werden auf ihre ursprünglichen Werte wieder hergestellt werden und welche nicht?

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

Ich gehe davon aus dem Standardaufrufkonvention von Delphi. Ich weiß, dass EAX für 32-Bit-Rückgabewerte verwendet wird. Und am asm-Code in SysUtils.pas suchen, scheint es, dass EBX, ESI und EDI geschoben und restauriert, aber die anderen sind es nicht. Ich kann keine Unterlagen darüber finden, though.

War es hilfreich?

Lösung

Die ersten drei Argumente einer Funktion werden in EAX, EDX und ECX gegeben sind. Weitere Argumente sind auf den Stapel geschoben. Für ein Verfahren eines Objekts ist die Self pointer immer die (unsichtbare) ersten Parameter. Das Ergebnis sollte in EAX sein. Für Funktionen, lange Strings Rückkehr, die (unsichtbare) letzte Parameter der Funktion ist der Zeiger auf die resultierende Zeichenfolge (die selbst ein Zeiger auf das erste Zeichen des Strings 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 hervorragende Einführung in Delphi inline ASM hier gefunden werden verwendet, um: http://www.delphi3000.com/articles/article_3766.asp

Andere Tipps

Ich weiß nicht, ob die Dokumente auf dem neuesten Stand sind, aber Sie sollten einen Blick auf Verwendung von Inline-Assembler-Code (nur Win32) am Embarcardero Wiki:

Zitat:

  

Im Allgemeinen sind die Regeln des Registers Verwendung in einer asm-Anweisung sind die gleichen wie die von einer externen Prozedur oder Funktion. Eine asm-Anweisung muss die EDI erhalten, ESI, ESP, EBP und EBX-Register, sondern kann frei die EAX, ECX und EDX-Register ändern. Beim Eintritt in eine asm-Anweisung, EBP zeigt auf den aktuellen Stack-Frame und ESP weist auf die Oberseite des Stapels. Mit Ausnahme von ESP und EBP kann eine asm-Anweisung nichts über Registerinhalte über den Eintritt in die Aussage übernehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top