www.spartan.3000.it  ASSEMBLER HOME PAGE ASSEMBLER  www.spartan.da.ru 

 ASSEMBLER  Lezione 1 Lezione 2 Lezione 3 Lezione 4 Lezione 5 Lezione 6 Lezione 8  ASSEMBLER 

LEZIONE 7




  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



 
 




@2ooo-2oo1 SPARTAN