Sezione

Indirizzi Base Registri Interni
Area Comunicazione BIOS Funzioni BIOS Funzioni DOS
Prefazione Capitolo 1 Capitolo 2 Schede
Libreria ASM Libreria MAC Palestra Progetti ASM
Info Download INDICE

Schede del Tutorial

Home » Programma il Computer » Tutorial Assembly

Le Schede del Tutorial

  Stack - Definizione e Gestione

SCHEDA n° 06 [ 2  di 7] 

    

    Che cos'è lo Stack?
     
bulletLo Stack è dunque una sequenza dinamica di words scritte nella memoria Ram; poichè la struttura è tipica dei programmi in esecuzione (compreso il sistema operativo MsDos) è logico pensare che l'area di memoria in cui si sviluppa sia una parte di quella affidata al file stesso.
bulletCon il termine dinamica si intende che il numero di word dentro la memoria dipende dall'istruzione che il processore si accinge ad eseguire, in funzione della quale può crescere, rimanere inalterato o diminuire.
bulletQuando il loader predispone la memoria Ram per un programma tipo EXE può destinargli fino a 4 segmenti (cioè aree da 64k ciascuna): una di esse è sempre destinata ad ospitare lo Stack e, per la sua gestione, provvede a inizializzare un puntatore dedicato, ottenuto con i registri SS:SP.
bulletI programmi eseguibili intrasegmentali, cioè di tipo COM sono allocati sempre in un unico segmento; poiché nemmeno loro possono fare a meno dello Stack, l'area ad esso dedicata è la parte finale del segmento, opposta (e, di norma, sufficientemente lontana) da quella occupata dal codice e dai dati.

      

bulletQualunque sia il tipo di programma eseguibile le caratteristiche dello Stack non cambiano; vediamo in dettaglio:
bulletviene gestito in Ram e ogni operazione produce sempre la scrittura o la lettura 2 bytes alla volta.
bulletla scrittura dello Stack avviene all'indietro! La prima parola (word, 16 bit) salvata nello Stack è scritta nelle locazioni puntate da  FFFFH e FFFEH (l'ultima e la penultima del segmento); la regola è quella classica, LoHi, per cui la parte alta della word finisce in FFFFH e la parte bassa in FFFEH; la seconda parola inserita andrà ad appoggiarsi sulla precedente, nelle locazioni FFFDH e FFFCH, e così via...
bulletla scrittura dello Stack potrebbe (molto ipoteticamente,...) crescere indietro fino a distruggere il codice macchina del programma. In realtà questo rischio si manifesta solo nella cattiva, errata, gestione di questa struttura; l'uso normale dello Stack non coinvolge mai più di qualche decina di bytes.

      

bulletNella norma lo Stack è una struttura destinata al microprocessore, in modo di consentirgli di operare in sintonia con le esigenze del programmatore; per la precisione ci sono situazioni nelle quali non è possibile fare a meno dello Stack: le chiamate di Procedure.
bulletPer questa operazione il processore si avvale di una coppia di registri dedicata, SS:SP.

      

Ricorda... Non dimenticare: il puntatore di Stack, SS:SP, punta sempre la locazione successiva a quella che sta per essere caricata
Oppure: SS:SP punta il byte meno significativo dell'ultima word inserita nello
Stack

      

Suggerimento La Procedura è un particolare sottoprogramma (un gruppo più o meno numeroso di istruzioni) specializzato a compiere un determinato servizio; questo codice eseguibile è facilmente riconoscibile perchè la sua ultima istruzione è sempre RET (o IRET); come vedremo questa esclusiva caratteristica è legata a doppio filo a quelle dello Stack!

      

bulletLa chiamata di Procedure è gestita dal processore con 2 istruzioni, CALL e INT
bulletquando una di esse è incontrata tra quelle del programma principale, il processore è costretto ad interrompere la sua esecuzione normale per saltare all'indirizzo suggerito dall'operando dell'istruzione di chiamata.
bulletpoiché è consapevole che la memoria di programma della procedura è completamente diversa da quella in cui sta operando, prima di eseguire il salto il processore provvede ad annotarsi l'indirizzo dell'istruzione successiva a CALL (o INT): quando sarà il momento saprà così dove rientrare, per continuare la normale esecuzione del programma principale.
bulletsalta dunque nell'area di memoria in cui è definita la procedura e ne esegue le istruzioni, compresa l'ultima, sempre RET (o IRET), il compito della quale è proprio quello di aiutarlo a recuperare l'appunto su cui aveva annotato l'indirizzo a cui tornare.

      

bulletNella prossima pagina riprenderemo questo argomento da un punto di vista più tecnico, sottolineando in che misura esso è correlato con lo Stack.
bulletIn questa sede ricordiamo che, con l'istruzione CALL, si possono chiamare sia le Procedure definite nel nostro programma sorgente sia quelle assunte (EXTRN) da una libreria; in ogni caso esse possono essere di 2 tipi: se sono presenti dentro il segmento nel quale vengono chiamante si dicono NEAR; in caso contrario sono dette FAR
bulletLe procedure chiamate con INT sono invece dette di sistema: il processore le tratterà come un particolare tipo di procedura FAR, più impegnativo rispetto a quelle normali.

      

bulletVa sottolineato, peraltro, che questa struttura può tornar utile anche al programmatore (cioè a noi...); con l'aiuto delle istruzioni PUSH e POP è possibile (rispettivamente) inserire e togliere 2 bytes dallo Stack, di solito contenuto nel registro coinvolto come operando.
bulletQuesta esigenza non è tanto improbabile o strana se si pensa che il numero di registri è piuttosto limitato e, di norma, il loro contenuto è prezioso e non deve essere sovrascritto; quando si presenta la necessità o il rischio di sporcare un registro conviene salvarlo nello Stack (con un PUSH) per poi recuperarlo nello stesso o in un altro registro a 16 bit (con POP). Anche di questo riparleremo in una prossima pagina.
bulletIn casi eccezionali, di solito legati agli ambienti di programmazione ad alto livello, lo Stack può essere usato massicciamente per passare i parametri alle procedure: si tratta di una tecnica che si sovrappone alla normale gestione e che non deve in alcun modo recare danno ne al suo contenuto ne ai suoi puntatori. Per questo solitamente viene gestita con un puntatore di Stack alternativo, SS:BP.

      

Ricorda... Non dimenticare: lo Stack si deve sempre utilizzare con coppie di azioni complementari: quello che si scrive deve essere, prima o poi, tolto:
per ogni  CALL   deve esserci un   RET
per ogni    INT    deve esserci un   IRET
per ogni PUSH   deve esserci un   POP

      

    

Pagina Precedente Scheda n° 06 Pagina Successiva Stack - Definizione e Gestione Torna al Menu delle Schede del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
Scheda n° 06 -  2
1 2 3 4 5 6 7

    

SCHEDE » 1.Header EXE 2.PseudoOp MASM 3.Differenza tra Macro e Procedure
4.
Tabella Vettori 5.PSP 6.Stack 7.Istruzioni 80x86
8.La misura dell'Informazione 9.Numeri e Logica Binaria
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati