Estratto del documento

Linguaggio assembler

Generalità sui linguaggi assembler

Un linguaggio assemblativo (o assembler) è un linguaggio di basso livello, relativamente alla semantica dei codici che hanno una corrispondenza diretta con codici operativi del relativo processore. Un linguaggio assembler supporta i tipi di dato gestiti dal processore. Il formato istruzione è fisso. Mediante un tale linguaggio è, quindi, possibile tradurre un programma sorgente direttamente in linguaggio macchina. Nel caso di assembler detti assoluti, il modulo oggetto prodotto è già in formato eseguibile e può essere caricato in memoria mediante un’operazione di "Down Load" ed eseguito dal processore (fig.1).

Un linguaggio assembler possiede, inoltre, dei comandi di servizio per l'assemblatore, detti "Direttive di Assemblaggio" o "codici", che servono ad istruire l'assemblatore su come assemblare il programma e a fornire al programmatore istruzioni di più alto livello in grado di semplificare la programmazione (definizione di strutture dati e desiderata di altro tipo).

I linguaggi assemblativi possono generare, all'occorrenza, moduli oggetto in formato rilocabile. Tali moduli, mediante l'azione di uno strumento detto collegatore (Linker), sono raggruppati in modo da formare un unico modulo assoluto eseguibile (o talvolta rilocabile a meno di una costante di spiazzamento). Tale modulo, per tramite dell'azione di un ulteriore strumento, detto caricatore (Loader), può essere caricato nella memoria programma del processore ed essere, quindi, eseguito (fig.2). In certi casi gli strumenti linker e loader possono essere fusi in un unico strumento che, in ogni caso, ne mantiene distinte le funzionalità.

Esistono, inoltre, linguaggi assemblativi detti assembler strutturati o macro assembler che forniscono, oltre alle funzionalità presenti negli assembler tradizionali, istruzioni di controllo ad alto livello (if, while, repeat, for), direttive per la creazione di strutture dati complesse e la loro inizializzazione, l’impiego di formati istruzione variabili e la possibilità di definire ed utilizzare macro. I macro assemblatori (macroassembler), unitamente all’azione dei collegatori-caricatori (linker-loader) consentono di strutturare i programmi assembler prodotti da un programmatore o da compilatori secondo schemi che garantiscono oltre alla modularità anche la rilocabilità di tali oggetti.

Un programma assembler può essere organizzato in aree o segmenti specializzati. Tali segmenti possono contenere dati o programmi. Di solito un programma processato da un assemblatore e collegato da un linker dispone di una sola area programmi e di più aree dati (ad es. area dati globale (area common), area dati comune a più segmenti (common labellato), aree dati locali a procedure di tipo dinamico (create all’atto dell’istanziazione di una procedura e rilasciate alla fine della procedura) poste in strutture stack.

I macroassembler offrono al programmatore la possibilità di disporre di un numero fisso di moduli con relativi "location counter" per sviluppare programmi organizzati in sezioni a cui corrisponderanno un numero uguale o inferiore di classi di allocazione gestite successivamente dal linker. Ad esempio i sistemi di sviluppo Motorola per il 68000 dispongono di un macroassembler che gestisce 16 moduli. Il Linker associato accorpa tali moduli al massimo in quattro classi di allocazione. Tale valore è dovuto al fatto che il sistema di sviluppo utilizza per la gestione della memoria un dispositivo di "Memory Management Unit" MMU dotato proprio di quattro segmenti.

Nello sviluppo dell’applicazione il programmatore struttura il programma in moduli (max 16) e passa da un modulo all’altro nominando il relativo location counter ($0-$15). Il linker provvederà ad aggregare moduli appartenenti allo stesso location counter e tramite l’uso di direttive di collegamento accorperà più moduli in un’area associata ad uno dei quattro segmenti di programma. Ciascuno dei segmenti può essere etichettato come RO (sola lettura) o R/W (a lettura scrittura).

Un linguaggio assemblativo è caratterizzato da un insieme di oggetti mnemonici e simboli che rappresentano:

  • Operazioni eseguibili (codici operativi);
  • Direttive di assemblaggio (pseudo codici);
  • Nomi simbolici (label);
  • Operatori;
  • Simboli speciali.

La sintassi e la semantica del linguaggio assembler descrivono pienamente il modo in cui tali oggetti possono essere aggregati dall'utente programmatore per sviluppare programmi assembler per uno specifico processore. Al fine di pervenire a linguaggi assembler il più possibile standardizzati ed indipendenti dallo specifico processore, è stato appositamente definito uno standard IEEE [...] che stabilisce le linee guida per la definizione di un generico linguaggio assemblativo.

Programma sorgente

È costituito da una sequenza di istruzioni in formato simbolico (tipicamente formato testo in ASCII) che descrive uno specifico algoritmo. Le istruzioni possono essere: di controllo flusso, di trasferimento o di trasformazioni di un generico dato (semplice o strutturato). Se l'assembler è a formato fisso ogni istruzione assembler è rappresentata su di una linea di testo (tipicamente non superiore ad 80 caratteri) se a formato libero (assembler strutturati e macroassembler) anche su più linee.

Programmi assoluti e rilocabili

Un riferimento in memoria (indirizzo) è detto assoluto se esso viene definito a tempo di compilazione (o assemblaggio) relativo se definito in epoche diverse, a seguito dell’azione di un linker (relativo statico) o a tempo di esecuzione (relativo dinamico). Un programma assemblativo (o in breve un programma) è di tipo assoluto se tutti gli indirizzi (riferimenti) dei dati adoperati e dei salti a istruzioni sono assoluti. Un tale programma, quando assemblato, produce un modulo oggetto assoluto che si presenta in formato immagine di memoria, ciò in quanto, quando caricato in memoria per una esecuzione, occuperà le stesse posizioni presenti nell’immagine. Un programma assoluto utilizza sempre una direttiva ORG (ORIGIN) che fissa il valore del location counter. Si fa osservare che il program counter, per tale tipo di programmi, assumerà gli stessi valori del location counter limitatamente alle istruzioni eseguite.

Con rilocazione si intende quel processo che consente di creare una corrispondenza fra uno spazio indirizzi logico (creato a tempo di compilazione) ed uno fisico o virtuale (creato a tempo di collegamento o di esecuzione).

Un programma assemblativo è di tipo rilocabile se l’indirizzo di caricamento del programma può essere determinato a tempo di caricamento (rilocabile staticamente) o a tempo di esecuzione (rilocabile dinamicamente). Un codice è rilocabile se è indipendente dalla posizione in cui esso viene posto in memoria.

La rilocabilità statica si rende necessaria ad esempio nel caso in cui si vogliano produrre librerie di programmi da memorizzare in memorie a sola lettura o nel caso in cui un programma debba operare su una classe di sistemi simili ma differenti nella configurazione o nel caso in cui un programma è composto da moduli che dovranno essere posizionati in tempi differenti e negli stessi spazi o nel caso in cui si dispone di un S.O. che carica i programmi dopo aver ottenuto in modo statico un’area di memoria da un apposito gestore (ad es. il S.O. MSDOS).

La rilocabilità dinamica si rende necessaria quando un modulo eseguibile deve essere spostato in memoria nel tempo e nello spazio (swap) a causa di esigenze derivanti dall’uso di sistemi di tipo multitasking. In tal caso, infatti, essendo le risorse memoria e processore condivise fra più task di uno stesso programma o di programmi differenti, e non potendo essere quindi assegnate in modo permanente richiedono il riposizionamento dei moduli eseguibili in aree di memoria diverse.

Una rilocazione di tipo statico potrebbe essere realizzata modificando ogni qualvolta si vuole rilocare il codice la direttiva ORG. Ciò richiederebbe, però, la ricompilazione del programma. Alternativamente l’assemblatore può produrre un modulo oggetto contenente un numero di informazioni aggiuntive necessarie per consentire al linker la generazione del modulo oggetto rilocabile. Quest’ultimo provvede a sviluppare una azione di modifica degli indirizzi generati dall’assemblatore all’atto del caricamento di un programma.

All’atto della scrittura di un programma vengono adoperati dei nomi simbolici (nomi di variabili, procedure locali e di libreria, label) che prima di una esecuzione del programma dovranno essere convertiti in indirizzi di memoria collegati ad indirizzi fisici di memoria centrale. Tale collegamento può essere fatto in diversi momenti e precisamente:

  • Per Allocazione Statica: all’atto della stesura di un programma, all’atto della traduzione del programma, durante la fase di collegamento per tramite di un linker, durante la fase di caricamento.
  • Per Allocazione Dinamica: a tempo di esecuzione polarizzando mediante costanti di rilocazione (costanti di spiazzamento) gli indirizzi logici, collegando procedure e nomi esterni, non noti all’inizio dell’esecuzione del programma.

I meccanismi da adoperare per l’assolutizzazione di un programma dipendono dal sistema calcolatore in uso e dal suo sistema operativo. L’architettura di un semplice sistema di controllo processo, ad esempio non fa alcun uso dello strato di sistema operativo in quanto su esso opererà direttamente sullo strato hardware un’unica applicazione. In tal caso l’assoluto eseguibile sarà generato staticamente, non dovendo subire alcuna forma di rilocazione dinamica.

Un sistema di controllo più complesso opera, ad esempio, su di un sistema multitasking, in cui lo strato hardware è affiancato da un livello di supporto a tempo di esecuzione in grado di offrire le funzionalità necessarie per il controllo dei task. In un tale sistema l’applicazione, anche se unica, viene strutturata in moduli da assegnare a task che opereranno in regime di quasiconcorrenza. Non esisterà, quindi, un unico programma eseguibile ma più moduli eseguibili che possibilmente non potranno essere tutti simultaneamente residenti in memoria, ma parte residenti e parte posti in file su memorie secondarie (swap su dischi). In tal caso i moduli eseguibili non possono essere assoluti (con tutti i riferimenti già collegati agli indirizzi fisici di memoria) ma dovranno poter godere della proprietà della rilocabilità.

Cioè ciascuno di essi dovrà essere assolutizzato a meno di una costante di spiazzamento dipendente, all’atto del caricamento in memoria (swap-in) dall’indirizzo iniziale in cui il modulo verrà caricato (load point o load address). Tale costante dovrà essere sommata a tutti i riferimenti in memoria per ottenere i riferimenti assoluti corretti. Se tale azione viene fatta una tantum (rilocazione statica) la modifica può essere fatta direttamente dal linker, ma se deve avvenire dinamicamente per far fronte ad operazioni di swap-in e swap-out la modifica verrà fatta direttamente durante la preparazione degli indirizzi, sommando all’indirizzo posto nell’istruzione il contenuto di un registro su cui l’esecutivo (il RTS) ha posto la costante di spiazzamento all’atto del caricamento del modulo eseguibile o del task.

Lo schema diventa ancora più complicato se si dispone di un sistema di calcolo dotato di sistema operativo multitasking e multiuser (ad esempio UNIX) e con gestione segmentata o paginata della memoria o, più in generale, con l’impiego della memoria virtuale. In tal caso la presenza di indirizzi di memoria virtuali richiede due livelli di assolutizzazione: una prima assolutizzazione dello spazio degli indirizzi del modulo eseguibile rispetto agli indirizzi virtuali e una seconda assolutizzazione degli indirizzi virtuali rispetto agli indirizzi fisici. Se la gestione della memoria è segmentata il procedimento di assolutizzazione composto dai due passi precedenti è a carico del programmatore. Se la memoria è virtuale, il programmatore dovrà occuparsi di utilizzare strumenti in grado di assolutizzare i riferimenti soltanto rispetto agli indirizzi virtuali, in quanto l’assolutizzazione di tali indirizzi in indirizzi fisici è a carico del S.O.

Un ulteriore meccanismo che garantisce la rilocabilità di un programma, rispetto ad uno spazio di indirizzi virtuali, senza ricorrere ad interventi esterni di un S.O. consiste nel generare, facendo uso di opportuni modi di indirizzamento, programmi detti “indipendenti dalla posizione”.

Indipendenza dalla posizione

Un codice è detto indipendente dalla posizione se al suo interno non esistono indirizzi effettivi coincidenti con riferimenti assoluti di memoria. L’indipendenza dalla posizione di un codice si può ottenere non facendo uso della direttiva ORG e ricorrendo a modi di indirizzamento di tipo relativo o polarizzato con o senza impiego di indicizzazione. Va, inoltre, tenuto conto che:

  • Una costante numerica è di tipo assoluto;
  • Il Location Counter è rilocabile;
  • Un simbolo associato ad una label di uno statement che non sia una direttiva EQU è rilocabile;
  • Un simbolo che compare nel campo label di una direttiva EQU ha lo stesso attributo del valore riportato nel campo operando dell’istruzione;
  • Una espressione che interessa soltanto costanti assolute e simboli porta ad un valore assoluto;
  • Espressioni che coinvolgono simboli rilocabili ed assoluti producono valori rilocabili nei seguenti casi: R, R+A, R-A. Valori assoluti nei seguenti: R-R;
  • Non sono ammessi operatori differenti da "+" e "-" e le forme "R+R", "A-R".

Schema di rilocazione adottato da assembler-linker-loader della famiglia 680xx

Lo schema di rilocazione e collegamento per tale famiglia di processori che include tutti i processori ad 8 bit prodotti da Motorola (6800, 6801, 6805 e 6809) è stato progettato per fornire le seguenti funzionalità:

  • Rilocazione di un programma;
  • Collegamento di più moduli programma;
  • Facile sviluppo di programmi per essere allocati su RAM/ROM;
  • Facile specifica di qualunque modo di indirizzamento;
  • Possibilità di impiego di un’Area Common di tipo bianco non inizializzata;
  • Possibilità di impiego di un’Area Common etichettata (o con nome) inizializzata.

Un programma assembler per tale famiglia di processori può essere organizzato secondo uno schema che prevede le seguenti cinque differenti sezioni:

  • ASCT Absolute Section: è questa una sezione non rilocabile che il programmatore può utilizzare per definire variabili assolute ed inizializzare aree di memoria. È questa, ad esempio, la sezione dove possono essere dichiarate le variabili associate a dispositivi di I/O “memory mapped”.
  • BSCT Base Section: è questa una unica sezione rilocabile utilizzata per allocarvi variabili che devono essere riferite utilizzando il modo di indirizzamento diretto. Tale sezione è limitata alle prime 256 locazioni di memoria (0-255).
  • CSCT Blank Common Section: è questa una unica sezione rilocabile non inizializzabile dall’utente. Tale sezione è usata per realizzare un’area Common così come previsto da linguaggi come il FORTRAN.
  • DSCT Data Section: è un’unica sezione rilocabile utilizzata per allocare in memoria RAM variabili riferite mediante il modo di indirizzamento extended.
  • PSCT Program Section: è un’unica sezione rilocabile simile alla DSCT destinata a contenere l’area programmi (da mettere ad es. in ROM).

Le sezioni common con nome possono essere allocate (interamente) sia in BSCT che in DSCT o PSCT.

I modi di indirizzamento supportati dal 6809 sono i seguenti:

  • Immediato
  • Relativo
  • Diretto ed Esteso
  • Indicizzato

Esempio di programma assembler organizzato in moduli rilocabili

MAIN IDNT 1,0 MODULO DI ESEMPIO
OPT CREXREF.S 9:THISLINE,ARRAY
XREF FINDALL
REG REG D0-D7/A0-A7
TEMP SET 44
FIXED EQU @36
COLUMN EQU 4
OFFSET 0
ROW1 DS.L 4
ROW2 DS.L 4
ROW3 DS.L 4
ROW4 DS.L 4
SECTION 1
START: LEA ARRAY,A5
MOVE.L ROW2(A5),D3
ADD.L ROW4+COLUMN(A5),D3
BEQ.L NOFIND
MOVEM ALLREG,-(A7)
MOVE.B 'A',D0 BSR.L FIND
MOVEM (A7)+,ALLREG
NOFIND CLR.L D7 ADDA #TEMP,A3
TEMP SET TEMP+FIXED
CMP #4,D0
BHI NOFIND
END START

Assembler 68000

Le seguenti note descrivono l'assembler assoluto del processore Motorola MC68000 supportato dallo strumento ASIMTOOL. L'assembler è in grado di generare codici in linguaggio macchina (moduli oggetto assoluti) che possono essere eseguiti mediante lo strumento di simulazione di sistemi ASIM su configurazioni di sistemi dotati di processore MC68000 o su altri sistemi fisici compatibili con le configurazioni adottate in ASIM.

Lo scopo del presente manuale è quello di mettere lo studente in condizione di sviluppare semplici programmi in linguaggio assembler. Per quel che concerne il dettaglio dei codici operativi si rinvia al manuale tecnico d'utente del processore edito direttamente da Motorola [Motorola MC68000UMIAD]. In appendice A è, comunque, fatto un breve riepilogo di detti codici sia in termini sintattici che semantici.

Formato istruzione del linguaggio assembler per MC68000

Il formato istruzione supportato dall'assembler 68000 di ASIM, così come altri tipi di assembler, è a formato fisso, ogni istruzione è codificata in una linea di massimo 80 caratteri.

Anteprima
Vedrai una selezione di 10 pagine su 178
Calcolatori Elettronici I – Asim Tool Pag. 1 Calcolatori Elettronici I – Asim Tool Pag. 2
Anteprima di 10 pagg. su 178.
Scarica il documento per vederlo tutto.
Calcolatori Elettronici I – Asim Tool Pag. 6
Anteprima di 10 pagg. su 178.
Scarica il documento per vederlo tutto.
Calcolatori Elettronici I – Asim Tool Pag. 11
Anteprima di 10 pagg. su 178.
Scarica il documento per vederlo tutto.
Calcolatori Elettronici I – Asim Tool Pag. 16
Anteprima di 10 pagg. su 178.
Scarica il documento per vederlo tutto.
Calcolatori Elettronici I – Asim Tool Pag. 21
Anteprima di 10 pagg. su 178.
Scarica il documento per vederlo tutto.
Calcolatori Elettronici I – Asim Tool Pag. 26
Anteprima di 10 pagg. su 178.
Scarica il documento per vederlo tutto.
Calcolatori Elettronici I – Asim Tool Pag. 31
Anteprima di 10 pagg. su 178.
Scarica il documento per vederlo tutto.
Calcolatori Elettronici I – Asim Tool Pag. 36
Anteprima di 10 pagg. su 178.
Scarica il documento per vederlo tutto.
Calcolatori Elettronici I – Asim Tool Pag. 41
1 su 178
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Ingegneria industriale e dell'informazione ING-INF/05 Sistemi di elaborazione delle informazioni

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Sara F di informazioni apprese con la frequenza delle lezioni di Calcolatori elettronici I e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli studi di Napoli Federico II o del prof Canonico Roberto.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community