Sei sulla pagina 1di 6

Sommario

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:

Non producono istruzioni macchina


Cominciano sempre con un punto

Direttive:

.data Gli elementi successivi sono memorizzati nel segmento dati


.ascii str (.asciiz str) Memorizza la stringa str (.asciiz la termina
col carattere null)
.byte b1, ..., bn Memorizza gli n valori (b1, ..., bn) in n Byte consecutivi
.word w1, ..., wn Memorizza gli n valori (w1, ..., wn) in n parole da 32 bit
consecutive
.half h1, ..., hn Memorizza gli n valori (h1, ..., hn) su n coppie di Byte
consecutive
.space n Alloca uno spazio di n Byte nel segmento dati
.text Memorizza gli elementi successivi nel segmento testo
.globl lab Dichiara lab come etichetta globale
.align n Allinea il dato successivo a blocchi di 2n byte
.

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)

Per Fare una System Call:


1.
2.
3.
4.

Inserire il codice nel registro $v0


Inserire gli argomenti nei registri $a0-$a3 ($f12-$f15)
Eseguire listruzione syscall
Il valore di ritorno nel registro $v0 ($f0)

Istruzioni di Confronto

slt Rd, Rs, Rt:


if (Rs < Rt) then Rd= 1 else Rd=0
slti Rt, Rs, Imm:
if (Rs < Imm) then Rt=1 else Rt=0
sltiu Rt, Rs, Imm:
if (Rs < Imm) then Rt=1 else Rt=0
sltu Rd, Rs, Rt:
if (Rs < Rt) then Rd= 1 else Rd=0

Pseudo-Istruzioni

Set
Set
Set
Set
Set
Set

equal: seq rdest, rsrc1, rsrc2


greater than equal: sge rdest, rsrc1, rsrc2
greater than equal unsigned: sgeu rdest, rsrc1, rsrc2
greater than: sgt rdest, rsrc1, rsrc2
greater than unsigned: sgtu rdest, rsrc1, rsrc2
less than equal: sle rdest, rsrc1, rsrc2

Set less than equal unsigned: sleu rdest, rsrc1, rsrc2


Set not equal: sne rdest, rsrc1, rsrc2

Istruzioni di salto condizionato

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

Pseudo-Istruzioni di Salto condizionato


Branch:
b label
Branch on equal zero:
beqz rsrc, label
Branch on greater than or equal to:
bge rsrc1, rsrc2, label
Branch on greater than or equal to unsigned:
bge rsrc1, rsrc2, label
Branch on greater than:
bgt rsrc1, rsrc2, label
Branch on greater than unsigned:
bgtu rsrc1, rsrc2, label
Branch on less than equal:
ble rsrc1, rsrc2, label
Branch on less than or equal to unsigned:
bleu rsrc1, rsrc2, label
Branch on less than:
blt rsrc1, rsrc2, label
Branch on less than unsigned:
bltu rsrc1, rsrc2, label
Branch on not equal zero:
bnez rsrc, label

Istruzioni di Load e Store


Trasferimenti tra registri di memoria
sw $3, 500($4) Store word
sh $3, 502($2) Store half
sb $2, 41($3) Store byte
lw $1, 30($2)Load word

lh $1, 40($3) Load halfword


lhu $1, 40($3) Load halfword unsigned
lb $1, 40($3) Load byte
lbu $1, 40($3) Load byte unsigned
lui $1, 40 Load Upper Immediate (16 bits shifted left by 16)

Pseudo-Istruzioni di Load e Store


Load address
la Rdest, label
Load immediate
li Rdest, value
Spostamento di Dati
Move
move Rd, Rs
Move from hi
mfhi Rdest
Move from lo
mflo Rdest

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)

Potrebbero piacerti anche