vuoi
o PayPal
tutte le volte che vuoi
DI SALTO CONDIZIONALE:
blt $8,$9,L → slt $1, $8, $9 bne $1, $0, L
bge (=not blt) → beq invece di bne
bgt $8,$9,L → slt $1, $9, $8 bne $1, $0, L
ble (=not bgt) → beq invece di bne
CARICAMENTO COSTANTE A 32 BIT O INDIRIZZO:
li $t0, 0x12345678 → lui $1, 0x1234 ori $8, $1, 0x5678 (eventualmente è possibile usare una addi al posto della ori)
la (load address) → identica a li
ACCESSO A MEMORIA SU ETICHETTA (esempio con tabella dei simbili <num1, 0x10000100>):
lw $t0, num1 → lui $1, 0x1000 lw $t0, 0100($1)
si può utilizzare anche la notazione presa dall'assembler gnu:
lw $t0, num1 → lui $1, %hi num1 lw $t0, %lo num1($1).
Appendice: organizzazione della memoria
Indirizzamento dei dati statici: il segmento dati inizia all'indirizzo 0x1000 0000, le istruzioni di accesso alla memoria non possono riferirsi a questi indirizzi direttamente avendo al massimo un campo di 16 bit. Ci sono quindi due possibilità:
1) Assembler usa il
registro $1 e l'istruzione lui, es. per caricare la parola all'indirizzo 0x10000020 nel registro $v0:
lui $1, 0x1000 #carica nei 16 bit più significativi di $1 il valore 0x1000 e azzera i 16 bit meno significativi; lw $v0, 0x0020($1) #esegue la somma tra $1 e l'offset, 0x1000 0000+0x0000 0020=0x1000 0020.
Per ottimizzare il processo si usa il registro $gp (global pointer) inizializzato con l'indirizzo 0x1000 8000 che sommato ai 16 bit (dotati di segno) dell'offset permette di accedere ai primi 64kB del segmento dei dati statici, es. per caricare la parola all'indirizzo 0x1000 0020 nel registro $v0:
lw $v0, 0x8020($gp) #0x10008000+0XFFFF 8020=0x1000 0020 (NB: 0x8020 è per il formato I a 16 bit che viene esteso a 32).
Fenomenologia del registro gp (global pointer):
Il registro global pointer rende più veloce l'indirizzamento delle locazioni di memoria comprese tra 0x10000000 e 0x1000FFFF rispetto a quello delle altre locazioni.
Il compilatore quindi di solito memorizza in quest'area le variabili globali.
Valore Indirizzo offset ricavato
7FFF 1000 FFFF7FFC ...
0000 1000 8000...
registro gp: 0x1000 8000 8004 ...
8000 1000 0000
Un programma è composto da più moduli (a loro volta piccoli programmi) i cui segmenti in fase di collegamento vengono disposti in un ordine funzionale all'esecuzione.
I processi a cui un programma è sottoposto sono quindi i seguenti.
Processo di assemblaggio
È applicato ai moduli del programma e per ogni modulo (file) sorgente costruisce il corrispondente modulo (file) oggetto. Nel processo vengono esaminate le righe del codice sorgente assembler e tradotte le istruzioni simboliche nel corrispondente formato del linguaggio macchina. I codici mnemonici sono tradotti nei corrispondenti codici binari, i riferimenti ai registri nei corrispondenti "numeri" di registro e i riferimenti simbolici (etichette varie e...
nomi di funzioni) sono tradotti nei corrispondenti indirizzi binari generando la tabella dei simboli del modulo.
SIMBOLI: si dividono in due categorie, locali se definiti all'interno del modulo (altri moduli non possono fare riferimento a loro), esterni altrimenti. Si possono anche definire i simboli globali come simboli a cui altri moduli possono fare riferimento, si definiscono tramite direttive (NB: per noi tutte le etichette sono globali ma non i simboli definiti nelle .eqv).
Rilocazione: in fase di collegamento gli indirizzi definiti all'interno di un modulo possono cambiare se la base dello spazio di indirizzamento virtuale del modulo viene modificata (rilocazione del modulo). Quindi tutte le etichette che corrispondono a indirizzi assoluti all'interno del modulo (tutte tranne le direttive .eqv che definiscono costanti numeriche) costituiscono simboli il cui valore può cambiare con il collegamento.
Quindi l'assemblatore all'interno del modulo oggetto
non traduce completamente (viene messo il valore 0 al posto nella parte numerica dell'istruzione) le istruzioni in cui si fa riferimento a:
- un simbolo esterno perché non ne conosce il valore;
- un simbolo rilocabile (interno o esterno) perché il suo valore cambierà durante il collegamento.
NB: le istruzioni di salto condizionale che fanno riferimento a simboli locali possono essere tradotte completamente perché le distanze dal PC non cambiano quando il modulo viene rilocato (si dicono autorilocanti).
Assemblaggio in due passi: se un riferimento simbolico viene utilizzato prima della sua definizione la traduzione dell'istruzione non è possibile (problema del riferimento in avanti). Per risolvere il problema si utilizza l'assemblaggio in due passi ovvero si creano le tabelle dei simboli e di rilocazione per effettuare la traduzione.
MODULO OGGETTO: ha la seguente forma
- Object file header: l'intestazione descrive le
dimensioni del testo e dei dati del modulo (NB: ogni istruzione occupa una word).
Text segment: contiene il codice in linguaggio macchina delle procedure del file sorgente. Le procedure possono essere non eseguibili a causa di riferimenti non risolti.
Data segment: il segmento dati contiene una rappresentazione binaria dei dati definiti nel file sorgente associata ad un indirizzamento virtuale.
Symbol table: la tabella dei simboli associa un indirizzo alle etichette contenute nel file sorgente e indica se appartengono al segmento testo oppure dati.
In particolare ha la seguente formattazione:
- simboli associati a direttive per le costanti simboliche (.eqv) nella tabella si ha <simbolo, valore>
- etichette che definiscono variabili del segmento dati nella tabella si ha <simbolo, indirizzo>
- etichette che contrassegnano istruzioni di salto nella tabella si ha <simbolo, indirizzo>
Relocation information: nella tabella di rilocazione per ogni simbolo
simboli di tutti i moduli. Per ogni simbolo, viene calcolato il suo valore finale sommando il valore base del modulo in cui è definito con l'offset relativo al simbolo stesso.3) RISOLVERE I RIFERIMENTI TRA I MODULIVengono risolti i riferimenti tra i moduli, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.4) RISOLVERE I RIFERIMENTI AI SIMBOLI ESTERNIVengono risolti i riferimenti ai simboli esterni, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.5) RISOLVERE I RIFERIMENTI AI SIMBOLI DINAMICIVengono risolti i riferimenti ai simboli dinamici, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.6) RISOLVERE I RIFERIMENTI AI SIMBOLI LOCALESVengono risolti i riferimenti ai simboli locali, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.7) RISOLVERE I RIFERIMENTI AI SIMBOLI COMUNIVengono risolti i riferimenti ai simboli comuni, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.8) RISOLVERE I RIFERIMENTI AI SIMBOLI WEAKVengono risolti i riferimenti ai simboli weak, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.9) RISOLVERE I RIFERIMENTI AI SIMBOLI INDIRETTIVengono risolti i riferimenti ai simboli indiretti, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.10) RISOLVERE I RIFERIMENTI AI SIMBOLI ASSOLUTIVengono risolti i riferimenti ai simboli assoluti, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.11) RISOLVERE I RIFERIMENTI AI SIMBOLI RELATIVIVengono risolti i riferimenti ai simboli relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.12) RISOLVERE I RIFERIMENTI AI SIMBOLI PC-RELATIVIVengono risolti i riferimenti ai simboli PC-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.13) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-RELATIVIVengono risolti i riferimenti ai simboli base-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.14) RISOLVERE I RIFERIMENTI AI SIMBOLI INDEX-RELATIVIVengono risolti i riferimenti ai simboli index-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.15) RISOLVERE I RIFERIMENTI AI SIMBOLI OFFSET-RELATIVIVengono risolti i riferimenti ai simboli offset-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.16) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-RELATIVIVengono risolti i riferimenti ai simboli base-index-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.17) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-OFFSET-RELATIVIVengono risolti i riferimenti ai simboli base-offset-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.18) RISOLVERE I RIFERIMENTI AI SIMBOLI INDEX-OFFSET-RELATIVIVengono risolti i riferimenti ai simboli index-offset-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.19) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.20) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-PC-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-PC-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.21) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.22) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.23) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.24) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-PC-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-PC-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.25) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.26) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.27) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.28) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-PC-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-PC-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.29) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.30) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.31) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.32) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-PC-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-PC-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.33) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.34) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.35) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.36) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-PC-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-PC-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.37) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.38) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.39) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.40) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-PC-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-PC-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.41) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.42) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.43) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.44) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-PC-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-PC-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.45) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.46) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.47) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.48) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-PC-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-PC-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.49) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.50) RISOLVERE I RIFERIMENTI AI SIMBOLI BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-OFFSET-BASE-INDEX-RELATIVIVengono risolti i riferimenti ai simboli base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-offset-base-index-relativi, sostituendo gli indirizzi simbolici con i valori finali calcolati nella fase precedente.simboli di tutti i moduli che devono essere collegati. Essi sono rilocati inbase all'indirizzo di base del modulo al quale appartengono.
3) CORREGGERE IN TUTTI I MODULI I RIFERIMENTI A INDIRIZZI SIMBOLICI MODIFICATI IN BASE ALLE TABELLE DI RILOCAZIONE
Siano:
- ISTR: un'istruzione riferita dalla tabella di rilocazione di un modulo M, con simbolo S e indirizzo IND;
- IADDR: l'indirizzo di tale istruzione nell'eseguibile finale. IADDR = IND + BASE_M, dove BASE_M è l'indirizzo di base del modulo M;
- VS: il valore (indirizzo finale) di S nella tabella globale dei simboli;
- GP: il valore del Global Pointer.
Ci sono le regole:
- ISTR è in formato J: inserire VS/4 nell'istruzione;
- ISTR è di salto in formato I: inserire (VS - (IADDR + 4))/4;
- ISTR è aritmetico/logica in formato I: inserire i 16 bit meno significativi di VS (VS_Low);
- ISTR è di tipo Load o Store: inserire VS-GP;
- ISTR è l'istruzione lui:
- TRADUZIONE DA C AD ASSEMBLER
Organizzazione logica della memoria
La memoria è divisa in tre parti:
- segmento testo (codice): le istruzioni del programma;
- segmento dati: diviso in:
- dati statici: dati con dimensione nota al momento della compilazione e la cui durata coincide con l'esecuzione del programma;
- dati dinamici: dati ai quali lo spazio è allocato dinamicamente durante l'esecuzione su richiesta del programma stesso;
- segmento stack: contiene lo stack allocato automaticamente da un programma durante l'esecuzione. Esso viene gestito tramite un puntatore all'ultimo indirizzo usato. Il puntatore detto stack pointer è assegnato al registro $sp.
LE VARIABILI
In C una variabile ha un nome per identificarla e un tipo per stabilirne gli usi ammissibili. In MIPS la variabile è un elemento di memoria e ha una collocazione tramite un indirizzo simbolico (etichetta) per
identificarla e un modo per indirizzarla (le variabili globali sono collocate in memoria a indirizzo fisso). Per comodità l'indirizzo simbolico lo scriveremo in maiuscolo e lo faremo coincidere con il nome della variabile.
Ingombro
variabile | ingombro | notazione | esempio C | traduzione assembler | allineamento |
---|---|---|---|---|---|
sizeof (char) | 1 byte | byte (b) | char c = "@" | C: .byte 64 | indirizzo qualunque:0,1,2,3,4,… |
sizeof (short int) | 2 byte | halfword (h) | int a = 1 | A: .word 1 | indirizzo pari: 1,2,4,6,… |
sizeof (int) | 4 byte | word (w) | short int b = 1 | B: half 1 | indirizzo multiplo di 4:0,4,8,12,… |
sizeof (long int) | 8 byte | word lunga o doppia (d) | indirizzo multiplo di 8:0,8,16,32,… | ||
sizeof (array) | somma ingombri elementi | int vet [10] | VET: .space 40 | ||
int * punt1 | PUNT1: .word 0 | ||||
char * punt2 | PUNT2: .space 4 | ||||
sizeof (struct) | somma ingombri campi |
Vincolo di allineamento: Nel MIPS le parole devono sempre iniziare a indirizzi multipli di 4, se serve è possibile cambiare
l'allineamento in memoria con una direttiva: .align n
(possibili 0 nessun allineamento, 1 allinea a indirizzo pari, 2 allinea a indirizzo multiplo di 4, 3 allinea a indirizzo multiplo di 8).
Regola base di uso variabili: un codice C che usa ed eventualmente modifica una variabile lo si traduce con una serie di istruzioni assembler che:
- caricano la variabile in un registro del blocco
t0
–t7
; - usano il registro per la modifica;
- lo memorizzano alla fine dello statement.
Variabili globali strutturate
Sono aggregati di elementi (sono possibili varianti e ottimizzazioni, vettori e struct hanno peculiarità rispettive), le modalità di accesso sono:
- accesso a singolo elemento con indice costante;
- scansione con indice o puntatore scorrevole.
Gestione di funzioni
CHIAMANTE:
Parametro in ingresso alla funzione
I primi quattro parametri vanno passati nei registri a0
, a1
, a2
, a3
se sono di tipo scalare o puntatore (a 32 bit). Il nome di vettore è considerato un
Il puntatore al primo elemento. Per passare una struct si passa l'indirizzo dell'inizio della struct. Gli event