Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 144 di 198] 

    

    PUSH - Mette nello stack un dato
     
bulletQuesta istruzione trasferisce nello stack di un dato a 16 bit (o a 32 bit, con 80386/486).
bulletLa definizione dell'istruzione è onomatopeica: l'idea è quella di spingere (push) in memoria qualcosa...
bulletIl 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..
    
Ricorda... Nello Stack: quello che si scrive deve essere, prima o poi, tolto, cioè per ogni PUSH deve esserci un POP !
    
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
  PUSH Sorgente  [SS:SP] stack  <<  Sorgente
 SP     <<  SP - 2 (o SP - 4)
 

Esempio di Applicazione

Cicli di Clock Mem
Acces

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
         
bulletLa tabella evidenzia che l'istruzione non altera alcuna flag. Inoltre mostra le possibili tipologie dell'unico operando:
bulletnumero immediato (solo con 80286).
bulletun registro (a 16 o 32 bit), anche di segmento.
bulletil valore contenuto in una locazione di memoria (a 16 o a 32 bit).
bulletLa 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...
bulletIn 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.
bulletTutte 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.
    
Suggerimento 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.
    
bulletQuando il processore esegue un'istruzione PUSH XX provvede ai seguenti compiti:
bulletdecrementa il valore corrente di SP e lo utilizza per puntare la locazione in cui scrivere la parte alta del dato a 16 bit contenuto in XX.
bulletdecrementa ancora il valore di SP e lo utilizza per puntare la locazione in cui scrivere la parte bassa del dato a 16 bit contenuto in XX.
bulletSe 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... 
bulletNaturalmente con 80386/486 il puntatore è ESP e viene alla fine decrementato di 4 locazioni. 
         
bulletLa figura seguente mostra le risorse richieste da questa istruzione in funzione degli operandi coinvolti (leggi le istruzioni):
          

Addr

Codifica Masm

Sequenza Bytes

Istruzione

0100
0102
55AA
55AA1188
AA 55
88 11 AA 55
Depo02 
Depo04
DW 55AAH
DD 55AA1188H
---- ---------------- ----------------- ------- ----------------------
0106
0109
010A
010B
010C
010D
010E
010F
0110
0111
0115
68 1234
0E
1E
06
16
50
53
51
52
FF 36 0100
66 FF 36
0102
68 1234
0E
1E
06
16
50
53
51
52
FF 36 00 01
66 FF 36
02 01

 
PUSH 1234H
PUSH CS
PUSH DS
PUSH ES
PUSH SS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH [Depo02]
PUSH [
Depo04]

    

Pagina Precedente Scheda n° 07 Pagina Successiva Istruzioni Cpu 80x86 Torna al Menu delle Schede del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
Istruzione 144 - PUSH

    

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