trucchi-com

assembler per principianti


Cap. 4 STRUTTURA DI UN PROGRAMMA IN MEMORIAQualsiasi programma generalmente è formato dal codice, cioè le istruzioni che voi avete inserito, più i dati necessari, per esempio la stringa 'Hello world' che nella prima lezione abbiamo stampato sullo schermo, bene, il codice ed i dati dei file EXE vengono caricati in memoria in due blocchi separati, inoltre il DOS o Windows che si occupano di caricare in memoria questi programmi inseriscono nel registro CS il blocco che contiene le istruzioni cioè inserisce il valore del segmento del codice in CS ed il valore del segmento dei dati in DS. Semplice no?.Certo, ma e gli altri?. Bene, il registro SS punta ad un altro blocco che viene denominato STACK (in inglese CATASTA), a che serve questo stack?Immaginate che il vostro programma ad un certo punto deve andare momentaneamente 1000 istruzioni più avanti (deve richiamare una funzione o sub per gli amanti del C), 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. Volete un esempio?. Eccolo:Indir. mem. istruzione codici commenti1000h MOV AL,10 B0h C0h 0Ah inserisci 10 in AL1003h CALL FAR sub 9Ah 00h 11h chiama la routine sub………….Sub:1100h ADD AL,1 04h 01h aggiungi 1 ad AL1102h RETF CBh ritorna al chiamanteIl 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 COMVeniamo ora ai file .COM che sono anche la scelta più naturale per chi ha intenzione di scrivere in assembler.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, inoltre esistono altre istruzioni che permettono di usare la memoria in modo diverso, ma ne riparleremo.