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.
Dies ist die richtige Information. Und wenn das Ergebnis ein Int64 ist, befindet es sich in EAX/EDX-Paar. –
@ A.Bouchez: Sehr wahr. –
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. –