Assembler............................................................................................................2
Uso dei registri.................................................................................................2
Direttive...........................................................................................................2
System Call......................................................................................................3
Istruzioni di Confronto......................................................................................4
Pseudo-Istruzioni..............................................................................................4
Istruzioni di salto condizionato.........................................................................4
Pseudo-Istruzioni di Salto condizionato.........................................................4
Istruzioni di Load e Store..................................................................................5
Trasferimenti tra registri di memoria.............................................................5
Pseudo-Istruzioni di Load e Store..................................................................5
Spostamento di Dati......................................................................................5
Array.................................................................................................................5
Matrici..............................................................................................................6
Comandi vari....................................................................................................6
Assembler
Uso dei registri
I registri $at (1), $k0 (26), e $k1 (27) sono riservati per l'assemblatore e il
sistema operativo. NON devono essere usati dai programmatori o
dall'assembler
I registri $a0$a3 (47) sono usati per passare i primi 4 argomenti alle
routine. Ulteriori eventuali argomenti sono passati sulla pila (molto pi lenta
dei registri!)
I registri $v0 e $v1 (2, 3) sono usati dalle funzioni per restituire valori al
chiamante.
I registri $t0$t9 (815, 24, 25) sono usati per memorizzare valori
temporanei, che non devono essere preservati tra una chiamata e l'altra.
Quindi ogni procedura li pu usare senza preoccuparsi di sporcarli
I registri $s0$s7 (1623) sono usati per valori che devono essere preservati
tra una chiamata e l'altra. Il loro significato non locale alla chiamata
corrente.
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.
Il registro $fp (30) il frame pointer.
L'istruzione jal scrive nel registro $ra (31) l'indirizzo di rientro dalla chiamata
di procedura.
Direttive
Operazioni che dicono allAssembler come tradurre un programma:
Direttive:
System Call
Il kernel MIPS offre semplici servizi mediante chiamate di sistema (system call)
predefinite. Ogni chiamata costituita da:
Codice delloperazione
Argomenti (opzionali)
Valori di ritorno (opzionali)
Istruzioni di Confronto
Pseudo-Istruzioni
Set
Set
Set
Set
Set
Set
Branch if equal
Beq Rs, Rt, Label
Branch if greater than or equal to zero
Bgez Rs, Label
Branch if greater than zero
Bgtz Rs, Label
Branch if less than or equal to zero
Blez Rs, Label
Branch if less than zero
Bltz Rs, Label
Branch if not equal
Bne Rs, Rt, Label
Array
A: .byte 1, 6, 5, 8, 7, 9 # A contiene lindirizzo del primo elemento dellarray
Matrici
mat:
.word 200, 270, 250, 100
.word 205, 230, 105, 235
.word 190, 95, 90, 205
.word 80, 205, 110, 215
Mat[i][j] = mat +(i*dimensione_riga+j)*dimensione_dato
Le procedure
Jal (jump and link) indirizzo_procedura (in $ra(return adress) cio $31 salvaa il
valore da cui ho lasciato il programma)
Jr(jump to register) $ra
Lo Stack
$sp (Stack pointer)
$fp (Frame pointer): punta la pila dove finiscono gli argomenti, cio dove inizio
le cose della procedura
Comandi vari
Salti
goto ETICHETTA: va al punto di codice in cui c quella etichetta
jr (jump to register)
Operazioni
add R1, R2 ((poi faccio mfhi t0(e in t0 salvo il riporto, se c stato overflow)
mflo t1 (in t1 salvo il risultato)))
sub
mul
div R1, R2 (poi faccio mfhi t0(e in t0 salvo il resto) mflo t1 (in t1 salvo il
risultato))
div R1, R2, R3 R1= R2:R3, (il resto si trova sempre in mfhi)