Cosa significa che una CPU supporta uno stack?


11

Come può una CPU non supportare uno stack? Nessuna architettura che utilizza subroutine (sono quasi certo che tutte le architetture) debba spingere l'indirizzo di ritorno nello stack in modo che possa tornare da dove ha chiamato la subroutine? Lo stack significa solo una sezione di memoria con un puntatore che cresce in una certa direzione e agisce come una struttura di dati dello stack no? Non capisco come un'architettura non possa supportare uno stack.

In che misura la memoria automatica (variabili automatiche rispetto a variabili statiche) è determinata dal compilatore rispetto all'architettura hardware?

Risposte:


8

Esistono molti microcontrollori di basso livello che dispongono di stack hardware per la chiamata / restituzione di subroutine e la gestione di interruzioni, ma renderebbe difficile se non impossibile archiviare i dati (variabili) lì e implementare uno stack di dati puramente software sarebbe terribilmente inefficiente. L'8051 è un classico esempio e PIC di fascia bassa (PIC12 / PIC16) sono un altro. Su queste macchine, lo stack di dati viene emulato assegnando posizioni di archiviazione statiche per variabili automatiche, con la quantità di riutilizzo di queste posizioni che dipende dalla raffinatezza del compilatore.

Si noti che se l'emulazione dello stack viene eseguita in questo modo, significa che la ricorsione - una funzione che si chiama da sola, direttamente o indirettamente - non funziona, poiché ogni istanza della funzione riutilizza le stesse posizioni statiche per le sue variabili presumibilmente "private". Alcuni compilatori consentono l'uso limitato della ricorsione (tipicamente implementato per mezzo di un #pragmaqualche tipo), il che lo farà creare un vero stack di dati indipendentemente da quanto rallenti le cose.

A parte questo, ci sono state architetture CPU che non avevano affatto uno stack hardware, nemmeno per la gestione di subroutine / interrupt, incluso DEC PDP-8 e IBM System / 360. Su queste macchine, il PC (indirizzo di ritorno) e il registro di stato (per gli interrupt) sono stati salvati in registri o posizioni di memoria, ma in ogni caso che mi viene in mente, la macchina aveva anche modalità di indirizzo sufficientemente flessibili che hanno reso facile la creazione di uno stack con software.


1
Alcuni computer precedenti avrebbero scritto un'istruzione di salto nel codice per causare un ritorno - non avendo salti indiretti - rendendo impraticabili le funzioni di rientro (in teoria si potrebbe ramificare un salto ma ciò aggiunge complessità, in alcuni casi soprattutto quando gli indirizzi di dati sono completamente codificati nelle istruzioni).
Paul A. Clayton,

4

"supportare uno stack" significa

  1. avere un registro puntatore di stack esplicito e
  2. avere istruzioni di codice macchina primitive per manipolare / usare il registro del puntatore dello stack (come reti, che cambia il contatore del programma in base al puntatore dello stack per tornare da una chiamata di funzione).

Puoi emularlo senza supporto hardware attraverso l'emulazione, che è il codice generato dal compilatore che lo stesso tipo di cose nella RAM utilizza le variabili. È raro / raro non avere un supporto diretto per lo stack in nessuna architettura di computer moderna.

La semantica delle variabili nei linguaggi di programmazione non ha quasi nulla a che fare con l'architettura hardware di destinazione, per qualsiasi linguaggio superiore all'assemblaggio semplice. Il compito dei compilatori è generare codice macchina conforme al contratto semantico del linguaggio di programmazione.


1
La maggior parte degli ISA RISC (ad es. MIPS [esclusi MIPS16 e microMIPS], Alpha, SPARC, PA-RISC, Power, SuperH) non dispongono di un registro puntatore di stack esplicito, che definisce invece tale ABI. ARM è un'eccezione (parzialmente perché ombreggia l'SP per diverse modalità operative) come lo sono MIP16 e microMIPS (per la densità del codice).
Paul A. Clayton,

2

Alcune architetture (ad es. PIC) hanno uno stack hardware con capacità limitate (può essere utilizzato solo per gli indirizzi di ritorno, non per le variabili). Alcune architetture estremamente piccole non hanno un'istruzione store-and-increment o PUSH, quindi è più complicato fare uno stack.

Le variabili 'auto' in C dovrebbero sempre essere compilate in qualcosa con comportamento di inizializzazione 'auto' e 'statica' con comportamento statico; su alcune architetture non è consentito eseguire la ricorsione, nel qual caso il compilatore può allocare staticamente tutte le variabili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.