Domanda

Quando crei una procedura Delphi o una funzione in codice assembly, che registri devono essere salvati e ripristinati al valore originale al termine della procedura?

Quando si chiama un altro procedimento Delphi o la funzione da (in linea) codice assembly, cosa posso aspettare che altra funzione a che fare con i registri? Quali registri verranno ripristinati ai valori originali e che non può?

(Ovviamente, la stessa risposta si applicherebbe ad entrambe le domande)

Io parto dal presupposto il predefinito che chiama la convenzione di Delfi. So che EAX viene utilizzato per i valori di ritorno a 32 bit. E guardando il codice asm in SysUtils.pas, sembra che EBX, ESI e EDI sono spinti e restaurati, ma gli altri non lo sono. Non riesco a trovare alcuna documentazione su questo, però.

È stato utile?

Soluzione

I tre primi argomenti di una funzione sono indicati nella EAX, EDX e ECX, rispettivamente. Ulteriori argomenti vengono inseriti nello stack. Per un metodo di un oggetto, il puntatore Self è sempre la (invisibile) primo parametro. Il risultato dovrebbe essere in EAX. Per le funzioni che ritornano lunghe stringhe, la (invisibile) ultima parametro della funzione è il puntatore alla stringa risultante (che di per sé è un puntatore al primo carattere della stringa).

EBX non deve essere modificato (a meno che non si ripristina prima della fine della procedura / funzione), e quindi non deve ESP, EBP, ESI, o EDI sia (1) un'ottima introduzione alla Delphi inline usato per essere trovato qui: http://www.delphi3000.com/articles/article_3766.asp

Altri suggerimenti

Non so se i documenti sono aggiornati, ma si dovrebbe dare un'occhiata a Uso Inline codice Assembly (solo Win32) al Embarcardero Wiki:

Quote:

  

In generale, le regole di utilizzo registro a un'istruzione ASM sono le stesse di quelle di una procedura o funzione esterna. Un'istruzione asm deve preservare l'EDI, ESI, ESP, registri EBP e EBX, ma può modificare liberamente i registri EAX, ECX e EDX. All'ingresso una dichiarazione asm, EBP punti per lo stack frame corrente e punti ESP in cima alla pila. Fatta eccezione per ESP e EBP, una dichiarazione ASM può assumere nulla di contenuto del registro in entrata alla dichiarazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top