Domanda

Vorrei sapere quale è responsabile della pulizia dello stack

Supponiamo che tu abbia una funzione divertente, diciamo in questo modo:

var = fun(int x, int y, float z, char x);

Quando fun verrà chiamato, entrerà nello stack insieme ai parametri, quindi quando la funzione restituisce chi è responsabile della pulizia dello stack è la funzione stessa o la "var" che manterrà il valore restituito.

Ancora una cosa, qualcuno può spiegare i concetti di convenzioni di chiamata?

È stato utile?

Soluzione

convenzione di chiamata si riferisce a chi sta facendo la pulizia della pila; chiamante o chiamato.

  

convenzioni di chiamata possono differire in:

     
      
  • dove sono collocati parametri e valori di ritorno (in registri; la chiamata   pila; un mix di entrambi)
  •   
  • l'ordine in cui vengono passati i parametri (o parti di un singolo   parametri)
  •   
  • come il compito di impostare e ripulire una chiamata di funzione è diviso   tra il chiamante e il chiamato.
  •   
  • che registra che può essere utilizzato direttamente dal chiamato può talvolta anche   essere inclusi
  •   
     

Architetture hanno quasi sempre più   di una possibile convenzione di chiamata.

Altri suggerimenti

Hai fatto riferimento tu stesso alla risposta: convocazione di convenzioni.

Una convenzione di chiamata è simile a a contrarre.Decide le seguenti cose:

  • Chi è responsabile della pulizia dei parametri.
  • Come e in quale ordine i parametri vengono passati alla funzione chiamata.
  • Dove è archiviato il valore restituito.

Esistono molte convenzioni di chiamata diverse, a seconda della piattaforma e dell'ambiente di programmazione.Due convenzioni di chiamata comuni sulle piattaforme x86 sono:

stdcall

I parametri vengono passati nello stack da destra a sinistra.IL chiamato la funzione pulisce lo stack.

cdecl

I parametri vengono passati nello stack da destra a sinistra.IL chiamando la funzione pulisce lo stack.

In entrambi i casi il valore restituito è in the EAX registrarsi (o ST0 per valori in virgola mobile)

Molti linguaggi di programmazione per la piattaforma x86 consentono di specificare la convenzione di chiamata, ad esempio:

Delfi

function MyFunc(x: Integer): Integer; stdcall;

MicrosoftC/C++

int __stdcall myFunc(int x)

Alcune note sull'utilizzo:

Quando si crea una semplice applicazione è raramente necessario modificare o conoscere la convenzione di chiamata, ma ci sono due casi tipici in cui è necessario preoccuparsi delle convenzioni di chiamata:

  • Quando si chiamano librerie esterne, API Win32 ad esempio:È necessario utilizzare convenzioni di chiamata compatibili, altrimenti lo stack potrebbe danneggiarsi.
  • Quando si crea codice assembler in linea:Devi sapere in quali registri e dove nello stack trovi le variabili.

Per approfondimenti ti consiglio questi articoli di Wikipedia:

Con il tempo che la linea è completa var conterrà il valore restituito da divertimento () e la memoria sullo stack utilizzato da divertimento sarà andato. "Push", "pop" tutto in ordine

convenzioni di chiamata: tutto ciò che il compilatore organizza in modo che il divertimento può fare il suo lavoro. Considerare tali parametri x, y, z. Quale ordine ottengono inserito nello stack (anzi fanno viene passato attraverso la pila)? Non importa fintanto che il chiamante e il chiamato sono d'accordo! Si tratta di una convenzione.

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