La parte visibile ad un programmatore, include tutto ciò che serve ad un programmatore per controllare una macchina
Elementi dell'architettura di un elaboratore
Vari tipi di dato
Accesso ai dati: memoria, registri
Insieme di istruzioni
Programma assembly
Uno o più file testuali con estensione .s, contenenti una sequenza di istruzioni assembly
Istruzione assembly
Rappresentazione testuale di un'istruzione macchina
Costruzione di un programma eseguibile
1. Assemblaggio
2. Linkaggio
Il programma eseguibile contiene istruzioni macchina, dati e un punto d'ingresso che rappresenta la prima istruzione del programma</b>
Direttive
Istruzioni per l'assemblatore che permettono di definire simboli, allocare aree di memoria per dati, inizializzare il contenuto di aree di memoria
Simboli
Stringhe che denotano particolari valori (indirizzi in memoria, costanti numeriche, ...)
Label
Particolare simbolo usato per indicare l'indirizzo in memoria di una particolare istruzione
Definizione e uso di label
1. Scrivo il programma e definisco la label
2. Il compilatore assegna un indirizzo alla label e compila il codicesorgente
3. Ogni volta che uso la label, il compilatore sostituirà tale label con l'indirizzo calcolato durante la compilazione
Il punto di inizio di un programma è definito dalla label Main, preceduta dalla direttiva .global main
Commenti
Iniziano con @ e terminano alla fine della riga
Sintassi di un'istruzione assembly
label: istruzione operandi @commento
Allocazione di dati
.word.hword.byte allocano e inizializzano costanti (4/2/1 byte)
.ascii alloca e inizializza una stringa
.space.skip allocano aree di memoria (.space inizializza a 0)
Segmenti di un programma
Text = codice (istruzioni), Data = dati inizializzati, Bss = dati non inizializzati
Definizione di altri simboli
.equ definisce un simbolo per un valore numerico
Istruzione
Sequenza di bit organizzati in campi
Metodi di indirizzamento
Immediato
Diretto
Indiretto
Registro diretto
Registro indiretto
Con offset
Su stack
Indirizzamento Immediato
Il valore è già scritto all'interno dei 32 bit, nel campo operando
IndirizzamentoImmediato
Può essere usato per definire/usare costanti e impostare il valore di una variabile
È il più semplice
La dimensione del numero è limitata dalla dimensione del campo indirizzi
Non deve andare a pescare i dati in memoria
Indirizzamento Diretto
Il campo indirizzo A contiene l'indirizzo in memoria dell'operando
Indirizzamento Diretto
È veloce da calcolare
Richiede un accesso in memoria oltre al fetch
Lo spazio di indirizzamento è limitato
Indirizzamento Indiretto
Il campo indirizzo A contiene l'indirizzo in memoria di una word che contiene l'indirizzo dell'operando
Indirizzamento Indiretto
Ha un ampio spazio di indirizzamento
Richiede 2 accessi in memoria oltre al fetch
È possibile una cascata di indirizzamento indiretti
Indirizzamento Diretto di Registro
Il campo indirizzo R indica un registro che contiene l'operando
Indirizzamento Diretto di Registro
Richiede pochi bit per il campo indirizzi
Lo spazio degli indirizzi è molto limitato
Oltre al fetch, non ci sono accessi in memoria
Indirizzamento Indiretto di Registro
Il campo indirizzo R indica un registro che contiene l'indirizzo in memoria dell'operando
Indirizzamento Indiretto di Registro
Con word di n bit, lo spazio indirizzabile è 2^n
Richiede 1 accesso in memoria oltre al fetch
Indirizzamento con Offset
L'istruzione ha 2 campi indirizzo: A e R
Il campo R indica un registro che contiene un valore che viene aggiunto ad A per calcolare l'indirizzo in memoria dell'operando
Indirizzamento (auto)relativo
Il registro R è il program counter (PC)
Sfrutta il concetto di località: permette di risparmiare bit nel campo indirizzo dell'istruzione
Autoindicizzazione
Incremento automatico dell'offset
Indirizzamento con Stack
L'operando si trova nella testa di uno stack
L'indirizzamento è implicito
Tabella riassuntiva degli indirizzamenti
Immediato
Diretto
Indiretto
Diretto di Registro
Indiretto di Registro
Offset
Stack
I bit che codificano un'istruzione sono raggruppati in campi, che devono includere: il tipo di istruzione (opcode), il tipo di indirizzamento di ogni operando, l'indirizzo di ogni operando
In Assembly ARM le istruzioni sono sempre da 32 bit, ma ci sono architetture in cui la lunghezza è variabile
La lunghezza variabile dipende da: dimensione della memoria, organizzazione della memoria, struttura della memoria, complessità del processore, velocità del processore
La codifica di un'istruzione è divisa in campi, le cui dimensioni dipendono da: numero di modi di indirizzamento, numero di operandi, registri vs memoria, numero di gruppi di registri, intervallo degli indirizzi, granularità degli indirizzi
La codifica di valori immediati usa 12 bit: 8 bit definiscono un valore c (0 <= c <= 255), 4 bit specificano una rotazione verso destra di 2r posizioni
LDR/STR
Legge/scrive una word (32 bits) in un registro di una word
LDR/STR
Si possono leggere/scrivere byte/halfword con o segna segno, aggiungendo i suffissi: