Testo di riferimento: [Congiu] 10.1-10.5 (pg. 267 291) 11.a I programmi Assembler e Linker Produzione del software Istruzioni, direttive, simboli, ecc. Processo di produzione del software Analisi del problema Progettazione del programma Definizione dei moduli software Progettazione singoli moduli Documentazione Scrittura del programma Scrittura dei moduli Traduzione e collaudo di ciascun modulo Costruzione dell intero programma Collaudo del programma 1
Sistema di sviluppo 2 Un programma Text Editor Per la scrittura e la modifica del testo sorgente Un programma Assemblatore Traduce il testo sorgente in modulo oggetto Un programma Linker Costruisce il programma eseguibile Un programma Debugger Esegue il programma sotto controllo del programmatore Scrittura di un programma 3 Editing Assembl. Collegam. moduli Collaudo
La programmazione in linguaggio assembly 4 La traduzione in linguaggio macchina viene effettuata da un programma assemblatore (assembler). Risulta molto spesso naturale organizzare i diversi moduli sorgente sotto forma di subroutine. È possibile costruire un programma in cui solo alcuni dei moduli sono scritti in linguaggio assembler, essendosi usato, per gli altri, un linguaggio ad alto livello. Valutazione costi ed efficienza 5
Il programma assemblatore 6 Un modulo sorgente è costituito da istruzioni di due tipi: le istruzioni di macchina, le istruzioni per l assemblatore (direttive). I simboli nel linguaggio assembly 7 La traduzione effettuata dall assemblatore consiste nel sostituire i valori numerici al posto dei simboli con cui, nelle istruzioni assembly, è rappresentato il contenuto dei vari campi delle istruzioni di macchina. Oltre ai simboli propri del linguaggio assembly, in un modulo sorgente sono generalmente presenti anche altri simboli, introdotti dal programmatore: simboli che rappresentano indirizzi di memoria; simboli che rappresentano valori numerici che non sono indirizzi.
I simboli del programmatore: esempi Direttiva label: LOOP: MOVL (R0)+, (R2) 8 Direttiva di assegnazione: MASK = $FF00 Simboli: classificazione Simboli predefiniti (codici operativi, registri di CPU, ecc.) 9 Simboli definiti dal programmatore (indirizzi, costanti numeriche): locali (visibili solo nel modulo corrente): assoluti, da rilocare (se il loro valore dipende dalla posizione del codice in memoria); globali (visibili anche in altri moduli): assoluti, da rilocare; esterni (definiti in altri moduli sorgente).
Simboli: forward reference In alcune circostanze è indispensabile poter usare un simbolo in punti del programma che precedono quello in cui esso è definito (forward reference): JMP AVANTI AVANTI: 10 Risoluzione dei simboli Per risolvere i forward reference, l assemblatore opera in due passi: Primo passo: l assemblatore scandisce le istruzioni del modulo sorgente e prende in considerazione le direttive di definizione dei simboli; Secondo passo: l assemblatore scandisce di nuovo il modulo sorgente e gestisce le occorrenze dei simboli, cioè l uso dei simboli, per generare il codice sostituendo (ove possibile) a ciascun simbolo il valore che esso rappresenta. 11
Assemblatore: primo passo (1 di 4) Definizioni dei simboli: simboli predefiniti 12 Tabella dei simboli predefiniti (TSP) ricerca del simbolo in TSP Assemblatore: primo passo (2 di 4) simboli locali Tabella dei simboli locali (TSL) 13 (S, V, T) TSL
Assemblatore: primo passo (3 di 4) simboli globali Tabella dei simboli globali (TSG) 14 (S, V, T) TSG Assemblatore: primo passo (4 di 4) simboli esterni Tabella dei simboli esterni (TSE) 15 (S, -) TSE
Assemblatore: secondo passo (1 di 3) Vengono esaminati i riferimenti ai simboli, cioè quei punti del modulo sorgente in cui i simboli vengono usati. In corrispondenza di ciascun riferimento simbolico l assemblatore intraprende una ricerca del simbolo nelle diverse tabelle per sostituirlo con il valore (provvisorio per i simboli da rilocare). I valori da rilocare vanno individuati, ad es. inserendo un puntatore ad essi in un apposita tabella che potremmo chiamare: Lista degli Elementi da Rilocare (LER). Per i simboli esterni la sostituzione non può essere effettuata ed è demandata al linker. 16 Assemblatore: secondo passo (2 di 3) 17 Si possono presentare i seguenti casi: il simbolo è tra quelli predefiniti, il simbolo è locale, il simbolo è globale, il simbolo è esterno.
Assemblatore: secondo passo (3 di 3) simbolo azione 18 predefinito locale globale esterno ricerca in TSP e inserzione del valore nel campo corrispondente dell istruzione. ricerca in TSL e inserzione del valore nel campo dell istruzione. se valore è da rilocare, aggiunta alla LER un puntatore al valore inserito. ricerca in TSG e inserzione del valore nel campo dell istruzione se T= da rilocare, aggiunta alla LER un puntatore al valore inserito. ricerca in TSE e inserzione nell elemento della TSE di un puntatore alla posizione in cui andrà inserito il valore associato al simbolo. Il modulo oggetto 19
Il programma linker (1 di 2) 20 Il programma linker (2 di 2) Per costruire il programma eseguibile, il linker: 1. valuta l estensione di memoria occupata da ciascun modulo per stabilirne l indirizzo iniziale; 21 2. tramite gli indici contenuti nelle LER aggiorna, modulo per modulo, i valori da rilocare sommando ad essi il valore dell indirizzo iniziale del modulo stesso; 3. infine, risolve i riferimenti esterni.
Esempio: modulo 1 22 Esempio: modulo 2 23
Esempio: modulo 3 24 Preambolo della RSI (sequenza di polling):.ext AD1, SAD1 ; simboli esterni ; sequenza di polling JR AD1, SAD1 ; attiva la routine SAD1 ; se in AD1 è READY=1 Assemblaggio del modulo 1 25
Listing del modulo 1 26 Modulo oggetto 1 (1 di 2) 27
Modulo oggetto 1 (2 di 2) 28 Assemblaggio del modulo 2 29
Listing del modulo 2 30 Modulo oggetto 2 (1 di 2) 31
Modulo oggetto 2 (2( 2 di 2) 32 Assemblaggio del modulo 3 33.EXT AD1, SAD1 JR AD1, SAD1
Listing del modulo 3 34 Modulo oggetto 3 35
Programma eseguibile (1 di 2) 36 Programma eseguibile (2 di 2)
Fine 11.a I programmi Assemblatore e Linker