Instruction Set MIPS: piccolo prontuario MIPS R3000 Instruction Set

Università dell'Insubria
A.A. 2016/17
Università degli Studi dell’Insubria
Dipartimento di Scienze Teoriche e Applicate
Instruction Set
MIPS:
piccolo prontuario
MIPS R3000 Instruction Set Architecture
Registri
Categorie di istruzioni:
Computazioni (per la ALU)
Integer o Floating Point
Logiche or matematiche
Load / Store (memoria)
Jump / Branch
Speciali
R0 - R31
PC
HI
LO
Tre formati di istruzioni: tutti da 32 bit
OP
rs
rt
OP
rs
rt
OP
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
rd
sa
immediate
jump target
- 18 -
funct
tipo R
tipo I
tipo J
Il livello ISA
1
Università dell'Insubria
A.A. 2016/17
Architettura MIPS - Registri
sempre 0
32 x 32-bit registri generici
r0
r1
°
°
°
r31
Registri speciali
PC
LO
HI
32 x 32-bit registri floating point
00000000 00000000 00000000 00000000
f0
f1
°
°
°
f31
32 bit
Architettura degli elaboratori
MIPS Instruction Set Architecture
- 19 -
Modello della memoria di MIPS
I programmi ipotizzano di avere 232 byte di memoria
La memoria è indirizzabile a livello di byte
Parole di 32 bit = 4 byte
Le parole si trovano ad indirizzi multipli di 4
Ricordare sempre: la memoria include sia i dati che le istruzioni
00...0000
00...0100
00...1000
1 byte
11...1000
32 bit
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 20 -
MIPS Instruction Set Architecture
2
Università dell'Insubria
A.A. 2016/17
I campi delle istruzioni MIPS
Tutte le istruzioni MIPS hanno lunghezza fissa (32 bit)
R-type
I-type
op
rs
rt
op
rs
rt
J-type
op
6 bits
rd
shamt
funct
imm
address
5 bits
5 bits
5 bits
5 bits
6 bits
campo
significato
op
Codice dell’istruzione (opcode)
rs
Quale registro che fa da primo operando
rt
Quale registro fa da secondo operando (R-type) o da risultato (I-type)
rd
Quale registro fa da risultato (c’e’ solo nelle R-type)
shamt
Shift amount: di quanto shiftare il risultato (in alcune op)
funct
Function code – variante dell’istruzione
imm
Immediate value (16 bit): il valore del secondo operando
Architettura degli elaboratori
MIPS Instruction Set Architecture
- 21 -
Modi di indirizzamento MIPS / Formato
delle istruzioni
R-type
op
rs
rt
rd
shamt
funct
Gli operandi sono tutti registri
come in add $s1, $s2, $s3
Modalità di indirizzamento Register (direct)
Op e funct indicano l’operazione da eseguire
Shamt indica l’entità dello shift del risultato
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 22 -
MIPS Instruction Set Architecture
3
Università dell'Insubria
A.A. 2016/17
Modi di indirizzamento MIPS / Formato
delle istruzioni
I-type
op
rs
rt
imm
Se Op indica una operazione matematica / logica
Gli operandi dell’operazione sono il registro rs e il valore immediato
Il risultato viene memorizzato nel registro rt
Il valore immediato (16 bit) viene esteso a 32 bit
con modalità diverse a seconda dell’op, come sappiamo.
Se Op indica un salto condizionato (un «branch»):
I due registri rs e rt sono usati per decidere SE saltare
(con criterio dipende da Op, es «se sono uguali fra loro»)
Se si salta, a PC viene sommato Imm (esteso in segno) x4
(quindi si salta di max 32K istruzioni in avanti o in indietro)
Architettura degli elaboratori
MIPS Instruction Set Architecture
- 23 -
Modi di indirizzamento MIPS / Formato
delle istruzioni
J-type
op
address
Istruzioni di salto incondizionato (si salta sempre)
Address (26 bit) indica dove saltare:
Vecchio PC: XXXX
X….X
00
Nuovo PC: XXXX
address
00
primi
4 bit
inalterati
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 24 -
MIPS Instruction Set Architecture
4
Università dell'Insubria
A.A. 2016/17
MIPS: parole
(la struttura fondamentale!)
una parola (32 bit, 4 bytes, 1 word) può essere contenuta :
in uno qualsiasi dei registri
in 4 byte consecutivi di memoria centrale
(spesso, allineati: il loro indirizzo base 2 termina con 00, 01, 10, 11)
(in che ordine sono? Vedi endianness!)
e può rappresentare :
un dato
(in virgola mobile, o in CP2, o naturale)
una istruzione (MIPS!)
un indirizzo di memoria
(fra i dato, o fra le istruzioni)
Architettura degli elaboratori
- 25 -
NB: Una parola
(in mem o un reg)
non «sa» cosa
rappresenta.
È il programmatore
che lo deve sapere
e la deve usare
di conseguenza.
Il livello ISA
MIPS: mezze parole
(assai meno usate)
Una mezza parola (half-word: 16 bit, 2 bytes) può essere contenuta
In 2 byte consecutivi di memoria
(tipicamente …00 e …01, cioè allineatamente)
Nella seconda metà di un’istruzione
(di tipo I: è il suo campo imm16)
In un registro
(la parola sta tutta nella seconda metà del registro.
Nella prima metà, si estende: tutti 0
o, nel caso di CP2: se numero negativo, tutti 1, se pos tutti 0)
E può rappresentare
Un dato a 16 bit (CP2 o binario senza segno)
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 26 -
Il livello ISA
5
Università dell'Insubria
A.A. 2016/17
MIPS: i bytes
Un byte (8 bit) può essere contenuto
In una sola casella di memoria
(indicizzata da 32 bit qualsiasi – «indirizzamento al byte»)
In un registro
(nei sui ultimi 8 bit. Nei primi 24, ci saranno tutti 0
o, nel caso di CP2 di un numero negativo, tutti 1)
E può rappresentare
Di nuovo:
Un dato a 8 bit
l’interpretazione di un dato
(CP2: da -128 a +127; o binario: 0..255)
non sta da nessuna parte
se non nella mente
Un carattere, per es di una stringa
del programmatore
(attraverso tabella ASCII)
Assembly umano o del
Etc (es il canale «rosso» di un pixel)
compilatore
Quindi un word può essere anche interpretato
come 4 lettere consecutive in una stringa
Una stringa: una sequenza di bytes (spesso, terminata dal byte 0x00)
Architettura degli elaboratori
- 27 -
Il livello ISA
MIPS si basa sulle words
Scrivere su un registro attraverso computazioni:
Si scrivono tutti i 32 bits del registro (sovrascrivendo tutti i bit precedenti)
Tutte le operazioni (logiche o matematiche)
sono sempre fra parole di 32 bit, con risultato a 32 bits
(non ci sono op che scrivono solo su una parte di un registro)
(ci sono op che scrivono due registri insieme: HI e LO)
Scrivere su un registro attraverso letture da memoria:
Si scrivono tutti i 32 bits del registro (sovrascrivendo tutti i bit precedenti)
Se si è letto meno di una parola (un half-word o un byte),
il dato letto viene esteso (con 0 o talvolta 1, come visto)
Scrivere su memoria
Si possono scrivere 4 byte, oppure anche solo 2 oppure 1
L’indirizzo si riferisce al primo byte scritto.
Se 4 (o 2), di solito allineati : questo indirizzo per 00 (o per 0)
(in molte implementazini HW è molto più efficiente se lo sono)
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 28 -
Il livello ISA
6
Università dell'Insubria
A.A. 2016/17
Registro 0: valore 0
il registro 0 contiene sempre il valore 0
000….0 :
significa 0 sia intepretato in CP2, sia interpetato come binario, sia
interpretato in virgola mobile
anche se tentiamo di scrivere sul registro 0,
il suo valore non cambia
Architettura degli elaboratori
Il livello ISA
- 29 -
Riassumendo: caratteristiche dell’ISA MIPS
Dimensione fissa a 32 bit (3 formati)
31 registri da 32 bit (R0 contiene zero) e 32 registri FP (e HI LO)
Istruzioni aritmetiche a tre indirizzi (registri)
Unica modalità d’indirizzamento per: base+spiazzamento
Istruzioni di salto condizionato semplici
Confronto di un registro con zero, confronto di uguaglianza e
disuguaglianza tra due registri
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 30 -
MIPS Instruction Set Architecture
7
Università dell'Insubria
A.A. 2016/17
Università degli Studi dell’Insubria
Dipartimento di Scienze Teoriche e Applicate
Architetture degli elaboratori:
Assembly (del MIPS):
piccolo prontuario
Marco Tarini
Dipartimento di Scienze Teoriche e Applicate
[email protected]
Linguaggio Assembly
Linguaggio molto aderente ad un Instruction Set,
Specifico per un Instruction Set
Rapporto (quasi) 1:1 fra comandi Assembly e istruzioni binarie
Pensato per essere più facile da leggere o scrivere
per noi esseri umani, rispetto al linguaggio macchina:
add $13, $4, $3 VS 000010010001101000110000011000
Assembler:
programma che effettua la traduzione.
Fa per noi molti lavoretti che sarebbero tediosi ma banali, come:
tradurre le operazioni in OP codes (di sei bit)
tradurre in base 2 (o in CP2) gli indici dei registri e gli immediate
calcolare gli offset delle destinazioni dei salti
tenere traccia degli indirizzi a cui sono merizzati dati ed istruzioni
altro, come vedremo
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 32 -
Il livello ISA
8
Università dell'Insubria
A.A. 2016/17
Istruzione in Assembly
Registri su cui si opera
(corrispondono ai campi Rt, Rs e Rd)
L’immediato (il campo imm16)
addi $13, $4, 162
add $13, $4, $3
le virgole sono opzionali
«i» sta per immediate
codice mnemonico dell’istruzione
(corrisponde al campo OP e FUNCT)
In Assembly, l’ordine degli operandi è comodamente fisso:
a differenza del MIPS binario, in cui varia fra le istruzioni R e I
il PRIMO paramtero rappresenta sempre il risultato
il registro che viene scritto (se l’op prevede di scrivere un reg)
$13 in questo esempio
Seguono gli operandi (che siano registri o immediate)
Architettura degli elaboratori
- 33 -
Il livello ISA
Commenti e indentazione
In Assembly, spazi, tab e accapo vengono ignorati
(posso indentare il programma come voglio)
Per rendere il codice più comprensibile
in Assembly posso aggiungere dei commenti
Verranno semplicemente ignorati dal compilatore
Sintassi: i commenti vanno dal carattere # alla fine della linea
# commento
add $13, $4, $3
# questo fa $13 <- $4 + $3
(sono questi due semplici ma cruciali elementi
che rendono l’Assembly molto più comprensibile
del linguaggio macchina)
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 34 -
Il livello ISA
9
Università dell'Insubria
A.A. 2016/17
Traduzione delle istruzioni
da Assembly a linguaggio macchina
Esempio, l’istruzione MIPS add $8, $17, $18 è tradotta così:
add
$8
$17
$18
op = 0 = 0000002
shamt = 0 = 0000002
funct = 32 = 1000002
rd = 8 = 010002
rs = 17 = 100012
rt = 18 = 100102
000000
op
Architettura degli elaboratori
10001 10010
rs
rt
01000 00000
rd
shamt
100000
funct
MIPS Instruction Set Architecture
- 35 -
Istruzioni assembly MIPS
per operazioni aritmetiche
Nome completo Esempio
Significato
add
add $1,$2,$3 $1 = $2 + $3
subtract
sub $1,$2,$3 $1 = $2 – $3
add immediate addi $1,$2,100 $1 = $2 + 100
add unsigned
addu $1,$2,$3 $1 = $2 + $3
subtract unsignedsubu $1,$2,$3 $1 = $2 – $3
add imm. unsign. addiu $1,$2,100 $1 = $2 + 100
multiply
mult $2,$3
Hi, Lo = $2 x $3
multiply unsigned multu $2,$3 Hi, Lo = $2 x $3
divide
div $2,$3
Lo = $2 ÷ $3,
Hi = $2 mod $3
divide unsigned divu $2,$3
Lo = $2 ÷ $3,
Hi = $2 mod $3
Move from Hi
mfhi $1
$1 = Hi
Move from Lo
mflo $1
$1 = Lo
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 36 -
Commenti
.
3 operandi;
3 operandi;
+ costante;
3 operandi;
3 operandi;
+ costante;
prodotto con segno da 64-bit
prodotto senza segno da 64-bit
Lo = quoziente, Hi = resto
Quoziente e resto senza segno
Copia Hi
Copia Lo
MIPS Instruction Set Architecture
10
Università dell'Insubria
A.A. 2016/17
Operazioni aritmetiche «con la U»
La «u» nei comandi artimetici (come addu)
sta per «unsigned», ma il nome è fuorviante
(ricorda:
la somma di numeri in CP2, e la somma in binario senza segno
sono la stessa operazione, cambia solo la gestione dell’overflow)
La vera differenza:
il comando senza la «u» può generare eccezione di overflow
il comando con la «u» semplicemente ignora l’overflow
In conclusione, si può verificare overflow solo in alcune istruzioni
aritmetiche:
add, sub, addi
nelle altre op matematiche, non si verifica o viene ignorato.
nelle op logiche, non si verifica mai
Architettura degli elaboratori
Il livello ISA
- 37 -
Moltiplicazione / divisione
Moltiplicazione / divisione:
(mult e div)
scrivono su una coppia di
registri speciali:
Hi e Lo
(non fanno parte dei 32 registri)
Ricorda: moltiplicando
due numeri da n bit ottengo
un numero da 2n bit.
Registers
Mult/Div
Unit
Il valore di Hi e Lo si travasa in
normali registri con:
mfhi rd
mflo rd
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
HI
- 38 -
LO
MIPS Instruction Set Architecture
11
Università dell'Insubria
A.A. 2016/17
Istruzioni assembly MIPS
per operazioni logiche
Istruzioni
Esempio
Significato
Commento
and
or
xor
nor
and immediate
or immediate
xor immediate
shift left logical
shift right logical
shift right arithm.
shift left logical
shift right logical
shift right arithm.
and $1,$2,$3
or $1,$2,$3
xor $1,$2,$3
nor $1,$2,$3
andi $1,$2,10
ori $1,$2,10
xori $1, $2,10
sll $1,$2,10
srl $1,$2,10
sra $1,$2,10
sllv $1,$2,$3
srlv $1,$2,$3
srav $1,$2,$3
$1 = $2 & $3
$1 = $2 | $3
$1 = $2 $3
$1 = ~($2 |$3)
$1 = $2 & 10
$1 = $2 | 10
$1 = $2  10
$1 = $2 << 10
$1 = $2 >> 10
$1 = $2 >> 10
$1 = $2 << $3
$1 = $2 >> $3
$1 = $2 >> $3
3 operandi 3 reg.; AND logico
3 operandi 3 reg.; OR logico
3 operandi 3 reg.; XOR logico
3 operandi 3 reg.; NOR logico
AND logico tra reg. e costante
OR logico tra reg. e costante
XOR logico tra reg. e costante
Shift a sinistra di una costante
Shift a destra di una costante
Shift a destra (con est. in segno)
Shift a sinistra di una variabile
Shift a destra di una variabile
Shift a destra di una variabile
(con est. in segno)
Architettura degli elaboratori
- 39 -
MIPS Instruction Set Architecture
Istruzioni assembly MIPS
per operazioni aritmetiche e logiche
Il risultato dell’op viene sempre memorizzato nel primo registro indicato
Eccezione: mult e div, che scrivono invece due apposite registri
speciali HI e LOW
I due operandi dell’op sono:
nelle versioni non immediate
(e negli shift con variabile): i due registri indicati
nelle versioni immediate:
(e negli shift senza variabile): un registro dato e un valore dato
Il valore nelle istruzioni con immediate:
E’ memorizzato nel campo imm16 di una istruzione I (di16 bit!)
E’ in CP2 nelle op aritmetiche (e quindi viene esteso in segno).
Val max = ?. Val min = ?.
Senza segno nelle op logiche (ed quindi viene esteso con 0)
Val max = ?. Val min = ?.
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 40 -
MIPS Instruction Set Architecture
12
Università dell'Insubria
A.A. 2016/17
Istruzioni assembly MIPS
per operazioni logiche
Le op logiche lavorano bit a bit
Lo shift a sinistra fa apparire 0 da destra
Corrisponde a dividere per 2^n
Due versioni dello shift a destra:
Far apparire 0 a sinistra (vers logica)
Far apparire a sinistra il bit più significativo (vers aritmetica)
Corrisponde a moltiplicare per 2^n
(nella versione aritmetica: questo vale per i numeri in CP2)
Lo shift di una costante, il valore di cui si shifta è memorizzato,
in linguaggio macchina, nell’apposito campo da 5 bit delle istruzioni R
(quindi vale da 0 a 31… ma i più non serve mai!)
Architettura degli elaboratori
Il livello ISA
- 41 -
Estensione in segno / con zero
(ripasso)
L’estensione in segno è utilizzata per gli immediati con segno (ad es. in
addi) e i valori con segno dalla memoria (lb).
Per estendere in segno un numero di n bit a n+m bit, bisogna copiare il
bit di segno (il MSB) m volte.
Per esempio, con n = 4 e m = 4:
1011
= -4
0101
=5
11111011
= -4
00000101
=5
L’estensione con zeri è usata per le operazioni logiche (ad es. ori), e
valori senza segno da memoria (lbu)
Per estendere con zeri un numero da n bit a n+m bit,
basta inserire m zeri.
Per esempio, con n = 4 e m = 4:
1101
= 13
0101
=5
00001101
= 13
00000101
=5
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 42 -
MIPS Instruction Set Architecture
13
Università dell'Insubria
A.A. 2016/17
Istruzioni assembly MIPS
per trasferire registri da/a la memoria
Istruzione
Commento
sw $3, 500($4)
sh $3, 502($2)
sb $2, 41($3)
Store word
Store half
Store byte
lw $1, 30($2)
lh $1, 40($3)
lhu $1, 40($3)
lb $1, 40($3)
lbu $1, 40($3)
lui $1, 40($3)
Load word
Load halfword
Load halfword unsigned
Load byte
Load byte unsigned
Load Upper Immediate
(16 bits shifted left by 16)
Architettura degli elaboratori
da registro a mem
(store)
- 43 -
da mem a registro
(load)
MIPS Instruction Set Architecture
Istruzioni assembly MIPS
per trasferire registri da/a la memoria
L’indirizzo a cui si legge o scrive
è quello contenuto nel registro indicato fra parentesi,
incrementato del valore eventualmente indicato prima della parentesi
esempi:
($16)
usare l’inidirizzo contenuto nel registro 16
500($4)
usare l’indirizzo contenuto nel registro 4,
incrementato di 500 byte (cioè di 500/4 = 125 word)
-4($16)
usare l’inidirizzo contenuto nel registro 16,
decrementato di 4
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 44 -
Il livello ISA
14
Università dell'Insubria
A.A. 2016/17
Istruzioni assembly MIPS
per trasferire registri da/a la memoria
Store:
si leggono 1, 2 o 4 byte dal registro indicato nel 1mo parametro
(4 se word. 2 se half. 1 se byte. Se 1 o 2: i meno significativi)
li si scrivono in 1, 2, o 4 byte consecutivi in memoria
Load:
caso word: si leggono 4 byte dalla memoria
caso short/byte unsigned: si leggono 2/1 byte e si estendono con 0
caso short/byte: si leggono 2/1 byte e si estendono in segno
caso lui: si leggono 2 byte e si shiftano a sinistra di 16 bit
in tutti i casi: si scrivono tutti i 4 byte risultanti nel registro indicato
Architettura degli elaboratori
- 45 -
Il livello ISA
Istruzioni assembly MIPS
per branch (salti condizionali)
Con confronto fra due registri
beq rs, rt, dest
equal, if R[rs] == R[rt] then jump to dest
bne rs, rt, dest
not equal,
Con confronto fra un registro e zero
blez rs, dest
less-or-equal zero, if R[rs] <= 0 then jump
bgtz rs, dest
greater-then zero >
bgez rs, dest
greater-or-equal zero >=
bgezal rs, dest
come sopra «…and link» (vedi poi)
bltz rs, dest
less-than zero <
bltzal rs, dest
come sopra «…and link» (vedi poi)
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 46 -
MIPS Instruction Set Architecture
15
Università dell'Insubria
A.A. 2016/17
Istruzioni assembly MIPS
per branch (salti condizionali)
L’instruction set MIPS mette a disposizioni molte varianti
di branch (b-), diverse per:
l’operatore del paragone che determina se saltare oppure no:
minore uguale (-le-), maggiore (-gt-), etc
se il paragone avviene fra due registri,
oppure fra un registro e lo zero (-z-)
«and link» (-al) : se, in caso di salto, deve essere memorizzato
l’indirizzo dell’istruzione che ha causato il salto,
(in modo da poterci tornare con un’apposita istruzione di ritorno)
(utile quando il salto serve per eseguire una subroutines, vedi poi).
…ma non tutte le varianti possibili sono previste! (es: R1>R2 non lo è)
Per implementare le varianti non previste, saranno
necessarie due o più istruzioni:
Prima: calcolo della condizione (es: R3 = R1-R2)
Poi: salto condizionale (es: R3 > 0 )
(tipico esempio della filosofia RISC in azione!)
Architettura degli elaboratori
- 47 -
Il livello ISA
Istruzioni assembly MIPS
per branch (salti condizionali)
L’istruzione MIPS binaria come sappiamo memorizza la destinazione
del salto come un offset rispetto al PC corrente (salto «relativo»)
L’offset è memorizzato nel campo imm16 di una istruzione di tipo I
L’offset è un numero di 16 bit in CP2
L’offset rappesenta il num. di istruzioni da saltare (avanti o indietro)
Cioè il num di words di cui spostare il CP2
Cioè il PC+4 va incrementato di Offset x 4 bytes (ext in segno)
Il programmatore indica direttamente la destinazione del salto
L’assembler calcola per noi l’offset necessario per raggiungerla,
e lo scrive nel campo imm16 del comando in binario (comodo  !)
La destinazione può seguire oppure precedere l’istruzione del salto
(perché offset ha il segno)
Ma non può essere più lontana di 2^15 istruzioni! Altrimenti errore.
(perché offset ha solo 16 bit in CP2).
Sono salti… corti !
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 48 -
Il livello ISA
16
Università dell'Insubria
A.A. 2016/17
Istruzioni assembly MIPS
per Jump (salti non condizionali)
Istruzione
Esempi
Significato
jump
j 10000
vai all’ istruzione 10000
jump and link
jal 10000
vai all’ istruzione 10000… and link
jump register
jr $31
vai all’istruzione contenuta
nel registro $31
Architettura degli elaboratori
- 49 -
MIPS Instruction Set Architecture
Istruzioni assembly MIPS
per Jump (salti non condizionali)
Jump salta ad un indirizzo dato.
L’istruzione MIPS binaria corrispondente, di tipo J , memorizza la
destinazione nel suo campo address
E’ un campo di ben 26 bits (il tipo J esiste apposta per questo)
Due zeri finali sono sottointesi (è l’indice di un word) = 28 bits
Il PC mantiene i primi 4 bits inalterati, e i suoi 28 bits meno
significativi vengono sostituiti: salto (quasi) «assoluto»
Quindi: l’istruzione può saltare anche molto lontano. Salto lungo!
L’unico vincolo è che non si può uscire dal blocco di 2^26 istruzioni
Tipicamente, il programmatore determina la destinazione attraverso
un’etichetta (vedi poi); address viene calcolato dall’assembler.
Jump address salta ad un indirizzo memorizzato in un registro dato
PC viene sostituito del tutto dai 32 bit del registro: salto «assoluto»
Si può saltare… assoltamente ovunque nel codice. No limits.
Salti… lunghissimi! (ma bisogna approntare un registro)
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 50 -
Il livello ISA
17
Università dell'Insubria
A.A. 2016/17
Istruzioni assembly MIPS
per assegnamenti condizionali
Istruzioni
Esempi
Significato
set on less than
slt $1,$2,$3
if ($2 < $3) $1=1; else $1=0
< (complemento a 2)
set on less than
immediate
slti $1,$2,100
if ($2 < 100) $1=1; else $1=0
<costante (complemento a 2)
set on less than
unsigned
sltu $1,$2,$3
if ($2 < $3) $1=1; else $1=0
< (numeri senza segno)
set less then
immediate unsigned
sltiu $1,$2,100
if ($2 < 100) $1=1; else $1=0
<costante (numeri senza segno)
Architettura degli elaboratori
- 51 -
MIPS Instruction Set Architecture
Confronto con segno e senza
R1= 0…00 0000 0000 0000 00012 = 110
R2= 0…00 0000 0000 0000 00102 = 210
R3= 1…11 1111 1111 1111 11112 = 232-1 or -110
Dopo l’esecuzione di queste istruzioni:
slt r4,r2,r1 ; if (r2 < r1) r4=1; else r4=0
slt r5,r3,r1 ; if (r3 < r1) r5=1; else r5=0
sltu r6,r2,r1 ; if (r2 < r1) r6=1; else r6=0
sltu r7,r3,r1 ; if (r3 < r1) r7=1; else r7=0
Quali valori si trovano nei registri r4 - r7?
r4 = 0;
R2==2 non è minore di R1==1
r5 = 1;
R3==-1 è minore di R1==1
r6 = 0;
R2==2 non è minore di R1==1
r7 = 0 ;
R3== 232-1 non è minore di R1==1
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 52 -
MIPS Instruction Set Architecture
18
Università dell'Insubria
A.A. 2016/17
Convenzioni nell'uso dei registri
Per compilare una data procedura, il compilatore
(o il programmatore umano)
deve sapere quali registri può usare e quali sono in uso da parte di altre
procedure.
Da qui la necessità di regole e convenzioni per l'uso dei registri
Non implementate in HW
Compilatori e programmatori le devono seguire,
pena bugs insidiosi, anche molto difficili da trovare.
Architetture
- 53 -
Programmazione ASM MIPS
Convenzioni nell'uso dei registri
I registri $at (1), $k0 (26), e $k1 (27)
riservati per l'assemblatore e il sistema operativo.
NON devono essere usati dai programmatori o dall'assembler
I registri $a0–$a3 (4–7)
usati per passare i primi 4 argomenti alle routine.
(ulteriori eventuali argomenti sono passati sulla pila (molto più lenta!)
I registri $v0 e $v1 (2, 3)
usati dalle funzioni per restituire valori al chiamante.
I registri $t0–$t9 (8–15, 24, 25)
usati per memorizzare valori temporanei,
quelli che non è necessario preservare tra una chiamata e l'altra.
ogni procedura li può usare senza preoccuparsi di “sporcarli”
I registri $s0–$s7 (16–23)
usati per valori che devono essere preservati tra una chiamata e
l'altra. Il loro significato non è locale alla chiamata corrente.
Architetture
Architettura degli elaboratori - Assembly
- 54 -
Programmazione ASM MIPS
19
Università dell'Insubria
A.A. 2016/17
Convenzioni nell'uso dei registri
Il registro $gp (28)
è un puntatore globale che punta ad un blocco di memoria da 64K nel
segmento dei dati statici.
Il registro $sp (29) è lo stack pointer,
che indirizza l'ultima posizione dello stack (vedremo)
Il registro $fp (30) è il frame pointer (vedremo).
Il registro $ra (31) contiene
l'indirizzo di rientro dalla chiamata di procedura (vedremo).
Architetture
Programmazione ASM MIPS
- 55 -
Scrittura di comandi in assembly:
gli operandi che sono registri
L’Assembly ci consente di riferirci ai 32 registri
anche attraverso dei sinonimi che riflettono il loro uso convenzionale
$0
$1
$2
$3
$4
$5
$6
$7
Sinonimo: $r0
Registro:
$at
$v0
$v1
$a0
$a1
$a2
$a3
Registro:
$8
$9
$10
$11
$12
$13
$14
$15
Sinonimo:
$t0
$t1
$t2
$t3
$t4
$t5
$t6
$t7
Registro: $16
$17
$18
$19
$20
$21
$22
$23
Sinonimo: $s0
$s1
$s2
$s3
$s4
$s5
$s6
$s7
Registro: $24
$25
$26
$27
$28
$29
$30
$31
$t9
$k0
$k1 $gp $sp $s8
$ra
Sinonimo:
$t8
add $s3, $t3, $t4
Architetture
Architettura degli elaboratori - Assembly
equivalente a
- 56 -
add $19, $11, $12
Programmazione ASM MIPS
20
Università dell'Insubria
A.A. 2016/17
Scrittura di comandi in assembly:
gli operandi che sono immediate
Il campo immediate può essere scritto:
In base 10
In base 16, precedendo le cifre con 0x
Come carattere ascii, fra apicetti singoli
addi $3, $3, 97
addi $3, $3, 0x61
Sinonimi
(il terzo registro viene
incrementato
di 97, il cui codice ASCII è ‘a’)
addi $3, $3, ‘a‘
Architettura degli elaboratori
- 57 -
Il livello ISA
Pseudo-istruzioni
L’assembler MIPS supporta diverse pseudo-istruzioni:
Non corrispondono ad istruzioni nell’Instruction Set
(l’archiettura HW non le conosce!)
Sono implementate mediante una o più istruzioni dell’IS
Semplificano la programmazione in linguaggio assembly
La pseudo-istruzione
move $t0, $t1
(copia $t1 in $t0)
è implementata come
add $t0, $zero, $t1
La pseudo-istruzione
blt $s0, $s1, addr (branch less then – salta se $s0<$s1)
è implementata come due istruzioni:
slt $at, $s0, $s1
bne $at, $zero, addr
(nota: uso del registo riservato all’assembler)
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 58 -
MIPS Instruction Set Architecture
21
Università dell'Insubria
A.A. 2016/17
Pseudo-istruzioni
La pseudo-istruzione
la $t0, addr
(load address, copia l’indirizzo addr in $t0)
è implementata come
lui $t0, addr
(load unsigned immediate)
La pseudo-istruzione
li $t0, val
(load immediate, copia il valore val in $t0)
è implementata come due istruzioni:
ori $t0, $0, val (or bit a bit fra val e il registro $0 cioè il valore 0)
Le pseudo-istruzioni rendono il linguaggio Assembly ulteriormente più ad
alto livello del linguaggio macchina
(Rimane un linguaggio a bassissimo livello, rispetto a, per es, C o,
ancora molto di più, Java)
Architettura degli elaboratori
- 59 -
MIPS Instruction Set Architecture
Un programma in assembly
Ricorda che un programma è costitutito da
Dati,
(in assembly: parte “data”)
Istruzioni (il codice che lavora sui dati),
(in assembly: parte “text”)
memorizzate in due apposite aree della memoria
(localizzate secondo alcune convenzioni che non ci interessano)
Un programma Assembly non è altro che un file di testo che descrive
il contenuto della memoria (in ciascuna delle due aree)
Consiste quindi in due sequenza di parole consecutive
(e/o mezze parole, e/o bytes) espresse in ASCII
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 60 -
Il livello ISA
22
Università dell'Insubria
A.A. 2016/17
Un programma in assembly
Es un programma potrebbe essere:
.data
.word 20, 10
Questo programma
(che non ha senso alcuno!)
.text
prescrive 2 words nella parte data
.word 30, 1234
e altre 2 words nella parte text
Le parole (32 bits!) possono essere espresse in molti modi equivalenti:
in decimale,
es: 20
.word 20
in esadecimale,
utile per la parte data
es: 0x14
.word 0x14
con un carattere ascii,
es: ‘a’
.word 'a'
con un comando assembly,
es: add
add $t3,
$t3, $s1,
$s1, $s3
$s3
utile per la parte text
Architettura degli elaboratori
Il livello ISA
- 61 -
Direttive
Comandi Assembly
che spiegano all’Assembler come tradurre un programma
Non producono istruzioni macchina!
Sintassi: cominciano sempre con un punto
Il programma precedente usa due direttive:
.data
«Memorizza gli elementi successivi nel segmento dati»
.text
«Memorizza gli elementi successivi nel segmento testo»
Tipica struttura sorgente:
.data
…dati…
.text
…comandi…
Architetture
Architettura degli elaboratori - Assembly
- 62 -
Programmazione ASM MIPS
23
Università dell'Insubria
A.A. 2016/17
Direttive: dati
Alcune direttive spiega il formato in cui tentere, in memoria, i dati
successivi:
.word
«Memorizza i valori successivi in 4 bytes»
.half
«Memorizza i valori successivi come half-word: cioè in coppie di byte»
.byte
«Memorizza i valori successivi in un byte ciascuno»
.data
.half 20, 2, 100
.byte 4, 'c'
.word 0x40, 300
Architetture
Nel segmento
data sono memorizzati
in tutto… 16 bytes
- 63 -
Programmazione ASM MIPS
Direttive: dati
Un scorciatoia speciale per dati consente di definire con facilità le stringe
(intese come sequenze di caratteri, ciascuno reppresentato da un byte)
.ascii "anna"
Equivalente a: .byte 'a', 'n', 'n', 'a‘
Memorizza (in questo esempio): 4 bytes.
.asciiz "anna"
Un byte per carattere, seguiti da un ulteriore byte terminatore zero.
Equivalente a: .byte 'a', 'n', 'n', 'a', 0
Equivalente a: .ascii "anna" .byte 0
Oppure a (in questo esempio): 5 bytes.
Nota l’uso del doppio apice.
La convenzione di terminare le strighe col byte 0 è comune a molti
linguaggi di programmazione ad alto livello (C, Java, C++…),
e dalle procedure di sistema (es quella che scrive stringhe su un monitor).
Dette «null terminated strings»
Architetture
Architettura degli elaboratori - Assembly
- 64 -
Programmazione ASM MIPS
24
Università dell'Insubria
A.A. 2016/17
Direttive: dati
.space n
Lascia uno spazio di n Bytes nel segmento dati.
Utile per riservare dei bytes nel segmento data
dove memorizzare i dati prodotti dalle istruzioni
.align n
Lascia alcuni byte di spazio in modo che il dato successivo
sia scritto in un indirizzo divisible per 2n
Utile per allineare i dati, ad esempio align 2 fa in modo che il word
successive sia scritto ad un indirizzo che termina con 00,
anche se i dati scritti in precedenza hanno occupato un numero dispari
di bytes.
Architetture
- 65 -
Programmazione ASM MIPS
Etichette (label)
Le etichette sono un’altra parte del programma Assembly
che l’Assembler non traduce in alcuna istruzione macchina
E’ un identificaore qualsiasi, scelto dal programmatore,
introdotto come un nome seguito da un due-punti.
Es:
pippo: .word 19
Un’etichetta è un meccanismo che consente al programmatore
assembly di riferirsi all’indirizzo a cui è stato memorizzato un dato o
un’istruzione
sarebbe complicato per il programmatore ricostruire questo
indirizzo, ma è banale per l’assemnler.
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 66 -
Il livello ISA
25
Università dell'Insubria
A.A. 2016/17
Etichette (label): funzionamento
Quando un’etichetta viene definita (cioè coniata, inventata, introdotta
nel programma), l’assembler tiene traccia dell’indirizzo in cui sta per
scrivere il prossimo dato o istruzione
Nella definizione, l’etichetta appare seguita da due-punti
ll programmatore può riferire (usare) un’etichetta (definita altrove)
usandola al posto di un operando in un comando.
L’assembler sostituisce l’etichetta con l’indirizzo corrispondente.
Nel riferimento, l’etichetta appare senza il due-punti
Un’etichetta può essere definita in un programma una sola volta,
e essere riferita molte volte
la definizione dell’etichetta può precedere oppure seguire il suo
riferimento
(questo comporta che l’assembler dovrà faticare un po’, e leggere il
programma due volte)
Architettura degli elaboratori
- 67 -
Il livello ISA
Etichette (label): usi tipici
Le etichette definite nella sezione data saranno
riferite da comandi tipo load / store come indirizzo
a cui leggere /scrivere quei dati
.data
popolaz: .word 40000
# definisco l’etichetta
.text
la $t1, popolaz # carica l’address popolaz in t1
lw $t2, 0($t1) # carica 40000 in $t1
Le etichette definite nella sezione text saranno
riferite da comandi tipo jump / branch come indirizzo a cui saltare
.text
ite: sub $t2, $t2 , 1 # t2 = t2 - 1
bgtz $t2, ite
# if (t2 > 0) goto ite
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 68 -
Il livello ISA
26
Università dell'Insubria
A.A. 2016/17
Label e direttive per definire dati
Tipico uso:
label: .tipo
valore
Es:
pippo: .word 19
«nel primo indirizzo libero, al quale io mi riferirò in futuro chiamandolo
con “pippo” (l’etichetta), piazza il valore 19 come un word (4 byte)»
Somiglia molto al commando Java:
int pippo = 19;
Anche valori multipli
label: .tipo val0, val1, …
pippo: .word 19 , 12 , 13
Architetture
- 69 -
Programmazione ASM MIPS
Altre direttive
.globl pippo
L’etichetta pippo determina quale sia il PC iniziale
(“l’esecuzione parte da lì”)
Altre direttive sono descritte sul libro
Architetture
Architettura degli elaboratori - Assembly
- 70 -
Programmazione ASM MIPS
27
Università dell'Insubria
A.A. 2016/17
System call
MIPS offre semplici servizi mediante chiamate di sistema (system call)
predefinite
Ogni chiamata è costituita da
Codice dell’operazione
Argomenti (opzionali)
Valori di ritorno (opzionali)
Architetture
- 71 -
Programmazione ASM MIPS
Funzioni di sistema
Architetture
Architettura degli elaboratori - Assembly
- 72 -
Programmazione ASM MIPS
28
Università dell'Insubria
A.A. 2016/17
Come fare una system call
1) Inserire il codice nel registro $v0
2) Inserire gli argomenti nei registri $a0-$a3 ($f12-$f15)
3) Eseguire l’istruzione syscall
4) Il valore di ritorno è nel registro $v0 ($f0)
Architetture
- 73 -
Programmazione ASM MIPS
Riassumendo
L’Assembler semplifica la vita al programmatore, rispetto al linguaggio macchina, perché
Traduce numeri da decimale, esadec, o ascii in binario
Traduce codici mnemonici di op (come «add») in opcode binari
Riordina i parametri a seconda che il comando sia di tipo R, o I,
consentendo di fornire i parametri in un ordine consistente
Rinominando i registri, consente di usare nomi più significativi («$t1»)
Mette a disposizione alcune Pseudo-Istruzioni ulteriori che semplificano il codice
(traducendole in Istruzioni MIPS)
Consente di indentare a piacere il codice (aggiungere accapi, spazi, tabulazioni)
per renderlo più leggibile
Consente di aggiungere commenti al codice (che semplicemente ignora)
Tiene traccia degli indirizzi di dati ed istruzioni,
attraverso il meccanismo delle etichette
Calcola gli offset degli indirizzi rispetto al PC
etc
Tuttavia, programmare direttamente in Assembly rimane tremendamente difficile
Nella realtà si usano sempre linguaggi più ad alto livello!
Complilati e trasformati in Assembly o linguaggio macchina
Architettura degli elaboratori
Architettura degli elaboratori - Assembly
- 74 -
Il livello ISA
29