|
PUSH AX- per mettere AX sullo stack e quando vorremo recuperarlo
basterà fare POP AX. Da tenere presente che se nel frattempo effettuate una
CALL od una PUSH di un altro registro non potete eseguire la POP perché la
CALL spinge sullo stack l'indirizzo corrente prima di saltare al nuovo e,
quindi, il vostro valore di AX passerebbe in seconda posizione, mentre la
POP recupera sempre l'ultimo valore aggiunto allo stack, ovviamente se
eseguo PUSH AX e dopo POP BX otterro' l'effetto di spostare il valore
di AX in BX, ma in questo caso era preferibile MOV BX,AX, con lo stesso risultato.
Comunque l'esempio fatto è un po' forzato perché in genere i valori che vengono
usati dal programma vengono memorizzati in celle di memoria prefissate chiamate
variabili (perché il loro valore può cambiare nel corso di esecuzione del programma).
A ciascuna cella possiamo assegnare un nome qualsiasi e riferirci ad essa con
questo nome, per esempio la cella che contiene le vite del nostro gioco potremo
chiamarla vite ed ogni volta che ci ammazzano possiamo fare 'DEC vite' che
decrementa le vite e controllare il valore se è arrivato a zero (game over).
Ricordate che tutte le operazioni di lettura e scrittura diretta in memoria
avvengono nel segmento DS a meno che non specifichiate un segmento diverso di volta in volta.
Notate il nome dei registri di segmento:
CS - (Code Segment) segmento del codice
DS - (Data Segment) segmento dei dati
ES - (Extra Segment) a vostra disposizione per altri segmenti
SS - (Stack Segment) segmento dello stack
Dal 386 in poi esistono anche i segmenti FS e GS simili ad ES.
Esempio sull'uso delle variabili:
sparta DB 10 - inizializza una variabile ad un byte (DB),
chiamala sparta e dagli il valore 10.
juve DW 10000 - inizializza una variabile a due byte (DW)
chiamala juve e mettici 10000.
alex DB 'Ciao mondo' - inizializza una serie di byte (10)
chiamali alex e ponici i valori ASCII della frase ' '.
Successivamente, se il programma ha necessità di aumentare sparta di 1 per portarlo a 11, farà:
MOV AL, sparta - carica in AL il contenuto di sparta
INC AL - incrementa AL AL=AL+1 (11)
MOV sparta, AL - poni in sparta AL, ora sparta=11
RCL XX - ruota a sinistra con riporto (Rotate with carry left).
Mettiamo che XX sia il registro AL ad 8 bit.
Dunque AL=10110001b, ruotare a sinistra significa, prendi il primo bit a destra (1)
e spostalo al secondo posto, prendi il secondo e spostalo al 3° e così via,
alla fine prendi l'ottavo e spostalo nel flag di carry, poi prendi il vecchio
valore del flag di carry e mettilo al primo bit di Al.
RCR XX - come sopra, ma verso destra.
Stavolta il carry entra all'ottavo posto
RET - ritorna al programma chiamante dopo una CALL
RETF - come sopra, ma preleva dallo stack anche il valore del segmento
di ritorno, si usa dopo una CALL FAR
ROL - come RCL, ma l'ottavo bit rientra direttamente al primo
posto senza coinvolgere il carry
ROR - come sopra, ma verso destra
STC - poni a 1 il flag di carry
STD - poni ad 1 il flag di direzione, SI e DI verranno incrementati
dopo istruzioni tipo LODSB o STOSB
STI - poni ad 1 il flag degli interrupt. Interrupt abilitati
TEST XX,YY - testa i valori XX e YY ed aggiorna i flag.
In pratica avviene un AND virtuale tra XX e YY
|