| Tutorial 
      | Dettaglio Istruzioni | 
| Istruzioni della Cpu 80x86 | SCHEDA n° 07 [I/ 144 di 198] | 
| 
 | 
|  | 
 | 
|  | Questa istruzione trasferisce nello stack di un dato a 16 bit (o a 32 bit, con 80386/486). | 
|  | La definizione dell'istruzione è onomatopeica: l'idea è quella di spingere (push) in memoria qualcosa... | 
|  | Il buon programmatore non dimentica recuperare il dato con l'istruzione POP, magari verso una diversa destinazione; non va dimenticato infatti che lo stack è una struttura delicata e degna della massima attenzione: un piccolo errore di gestione può distruggere il programma in esecuzione e bloccare il computer.. | 
|  | Nello Stack: quello che si scrive deve essere, prima o poi, tolto, cioè per ogni PUSH deve esserci un POP ! | 
|  | Le sue caratteristiche sono riassunte nella
    seguente tabella (leggi le  istruzioni  ): | 
| PUSH Sorgente | [SS:SP]
          stack  <<  Sorgente SP << SP - 2 (o SP - 4) | |||||||||||||||
| Esempio di Applicazione | Cicli di Clock | Mem Acces | N° Bytes | Flag influenzate | ||||||||||||
| Mnemonico | Operandi | 86 | 268 | 386 | 486 | O | D | I | T | S | Z | A | P | C | ||
| PUSH | 1234H | no | 3 | 2 | 1 | no | 2,3 | |||||||||
| PUSH | DS | 10 | 3 | 2 | 3 | 1 | 1 | |||||||||
| PUSH | AX | 11 | 3 | 2 | 1 | 1 | 1 | |||||||||
| PUSH | EAX | no | no | |||||||||||||
| PUSH | [Depo02] | 16+EA | 5 | 5 | 4 | 2 | 2,4 | |||||||||
| PUSH | [Depo04] | 21+EA | ||||||||||||||
|  | La tabella evidenzia che
    l'istruzione non altera alcuna flag. Inoltre mostra le possibili tipologie
    dell'unico operando: 
 | ||||||
|  | La coppia PUSH/POP è ideale quando è necessario usare un registro senza rischiare di perderne il contenuto; può succedere infatti di avere tutti i registri caricati con valori importanti e, non avendone altri (data il loro limitato numero...) di non sapere che santi pigliare... | ||||||
|  | In effetti è sempre possibile salvare il valore di ciascun registro nello stack, riutilizzare a sazietà ciascuno di essi, e ripristinarlo alla fine, prelevandolo nei registri di partenza dallo stack. | ||||||
|  | Tutte le procedure fatte a regola d'arte (personali e di sistema) dovrebbero come prime istruzioni salvare nello stack tutti i registri da esse utilizzati, e recuperarli alla fine, prima di tornare. | 
|   | Con tecnica PUSH/POP è comunque possibile salvare (nello stack) un registro, per esempio AX, e recuperare (dallo stack) in un altro registro, per esempio BX (nel caso proposto otterremo lo stesso risultato di MOV BX;AX). Questa opportunità si dimostra l'unica strada perseguibile con registri (o altro) che non possono essere travasati con MOV, come quelli di segmento. | 
|  | Quando il processore esegue un'istruzione PUSH
    
    XX provvede ai seguenti compiti: 
 | ||||
|  | Se non si provvede altrimenti lo stack rimane sporco, cioè con 2 bytes in più rispetto alla condizione precedente l'esecuzione dell'istruzione: la cosa è fastidiosa ma non ancora critica... ma se l'operazione fosse ripetuta sciaguratamente troppe volte si rischia, scrivendo all'indietro, di sovrascrivere il programma mentre è in esecuzione... | ||||
|  | Naturalmente con 80386/486 il puntatore è ESP e viene alla fine decrementato di 4 locazioni. | 
|  | La figura seguente mostra le risorse richieste da questa istruzione in funzione degli operandi coinvolti (leggi le istruzioni): | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 | 
|   | Scheda n° 07 |   | Istruzioni Cpu 80x86 |  |  |  | ||
| Istruzione 144 - PUSH | 
| 
 | 
| 
 | 
| 
 | 
| Home  | 
 | |||||||
| 
 | Motore Ricerca | 
 |