Il registro SS punta ad un altro blocco che viene denominato STACK:
immaginate che il vostro programma ad un certo punto deve andare momentaneamente
1000 istruzioni più avanti,
per fare qualcosa ed alla fine deve ritornare dov'era, come fa a ricordarsi dov'era?
Semplice, prende l'indirizzo corrente puntato da CS:IP e lo memorizza in 4 byte all'
indirizzo SS:SP poi salta al nuovo indirizzo, alla fine preleva da SS:SP l'indirizzo
originario e vi ritorna, in pratica questo salvataggio avviene automaticamente quando
eseguite un'istruzione 'CALL indirizzo' e viene prelevato automaticamente quando
eseguite l'istruzione RETF (ritorna).
E se la sub chiamata contenesse a sua volta un'altra chiamata ad un'altra sub?,
niente panico, perché il processore prima di salvare l'indirizzo di ritorno
diminuisce SP di quattro e quindi accatasta tutti gli indirizzi di ritorno
uno sull'altro, ecco perché STACK, ovviamente quando si esegue una RETF avviene
l'inverso e viene scaricato l'ultimo indirizzo salvato. In pratica lo stack
viene considerato LIFO (Last In First Out) l'ultimo ad entrare è il primo ad uscire.
Ecco un esempio:
INDIRIZZO DI MEMORIA
ISTRUZIONE
CODICI
COMMENTI
1000h
MOV AL,10
B0h C0h 0Ah
mettere 10 in AL
1003h
CALL FAR sub
9Ah 00h 11h
chiama la routine sub
1100h
ADD AL,1
04h 01h
aggiungi 1 ad AL
1102h
RETF
CBh
ritorna al chiamante
Il compilatore inserisce automaticamente l'indirizzo di sub, quindi vi basta scrivere CALL
sub e basta.
I registri ES,FS e GS, invece, non sono vincolati ad alcun segmento e si possono usare
per puntare a qualsiasi altro segmento, per esempio quello video.
I FILE COM
I file COM sono caratterizzati dal fatto che non possono essere più lunghi di 64Kbytes
ossia di un segmento di memoria ed inoltre in questo segmento deve trovar posto anche
l'area dati e lo stack, ma niente paura, se riuscite a scrivere un programma che superi
la metà del segmento siete già dei mostri.
Il DOS carica il programma dall'indirizzo 256 in poi e pone nei primi 255 byte alcune
informazioni sull'ambiente operativo tipo le variabili PATH, PROMPT ecc. , inoltre
dall'indirizzo 129 in poi inserisce la stringa di comando, ovvero il testo che digitate
dopo il nome del programma, es. EDIT LETTERA.TXT, quindi all'indirizzo 128 trovate il
numero 12 (la lunghezza di LETTERA.TXT più lo spazio fra EDIT e LETTERA.TXT) e da 129
in poi la stringa stessa, un carattere per ogni byte nel formato ASCII, uno standard
mondiale che assegna ad ogni carattere un numero compreso fra 0 e 255.
Il programma potrà controllare questa stringa e farne ciò che gli pare, nel caso dell'
esempio edit.com aprirà il file per modificarlo o altro'
Ovviamente il programma assembler andrà scritto con un editor di testo, EDIT.COM è
valido, ma potete usare anche notepad o altro, l'importante è che possa salvare il
file in formato testo puro.
Prima di introdurre la lista delle istruzioni che il processore riconosce bisogna
fare alcune importanti precisazioni, innanzitutto dal 386 in poi i registri
principali (AX,BX,CX,DX,DI SI,SP,BP), sono diventati a 32 bit, ovvero hanno
raddoppiato le loro dimensioni, ma restano comunque compatibili con l'uso a
16 bit.