Università degli Studi dell’Insubria Dipartimento di Scienze Teoriche e Applicate
Manualino minimale MIPS
Marco Tarini
Operazioni aritmetiche
Nome completo Esempio Significato Commenti .
add add $1,$2,$3 $1 = $2 + $3 2 operandi registro;
subtract sub $1,$2,$3 $1 = $2 – $3 2 operandi registro;
add immediate addi $1,$2,100 $1 = $2 + 100 operandi: registro e costante;
add unsigned addu $1,$2,$3 $1 = $2 + $3 2 operandi registro;
subtract unsignedsubu $1,$2,$3 $1 = $2 – $3 2 operandi registro;
add imm. unsign.addiu $1,$2,99 $1 = $2 + 99 operandi: registro e costante;
multiply mult $2,$3 Hi | Lo = $2 x $3 prodotto con segno: res in 64 bit multiply unsignedmultu $2,$3 Hi | Lo = $2 x $3 prodotto senza segno: res in 64 bit divide div $2,$3 Lo = $2 ÷ $3, Lo = quoziente, Hi = resto
Hi = $2 mod $3
divide unsigned divu $2,$3 Lo = $2 ÷ $3, Quoziente e resto senza segno Hi = $2 mod $3
Move from Hi mfhi $1 $1 = Hi Copia Hi in un registro Move from Lo mflo $1 $1 = Lo Copia Lo in un registro
Comando Sintassi (es) Semantica (es) Commenti
add add $1,$2,$3 $1 = $2 + $3 operandi: 2 registri
subtract sub $1,$2,$3 $1 = $2 – $3 operandi: 2 registri
add immediate addi $1,$2,99 $1 = $2 + 99 operandi: registro e costante add unsigned addu $1,$2,$3 $1 = $2 + $3 operandi: 2 registri subtract unsigned subu $1,$2,$3 $1 = $2 – $3 operandi: 2 registri add immediate
unsigned addiu $1,$2,99 $1 = $2 + 99 operandi: registro e costante
multiply mult $2,$3 Hi | Lo = $2×$3 prodotto con segno:
(risulato in 64 bit) multiply unsigned multu $2,$3 Hi | Lo = $2×$3 idem, ma senza segno
divide div $2,$3 Lo = $2 ÷ $3,
Hi = $2 mod $3
Lo = quoziente Hi = resto
divide unsigned divu $2,$3 Lo = $2 ÷ $3, idem, ma senza segno
Operazioni Logiche
Nome completo Esempio Significato Commenti .
add add $1,$2,$3 $1 = $2 + $3 2 operandi registro;
subtract sub $1,$2,$3 $1 = $2 – $3 2 operandi registro;
add immediate addi $1,$2,100 $1 = $2 + 100 operandi: registro e costante;
add unsigned addu $1,$2,$3 $1 = $2 + $3 2 operandi registro;
subtract unsignedsubu $1,$2,$3 $1 = $2 – $3 2 operandi registro;
add imm. unsign.addiu $1,$2,99 $1 = $2 + 99 operandi: registro e costante;
multiply mult $2,$3 Hi | Lo = $2 x $3 prodotto con segno: res in 64 bit multiply unsignedmultu $2,$3 Hi | Lo = $2 x $3 prodotto senza segno: res in 64 bit divide div $2,$3 Lo = $2 ÷ $3, Lo = quoziente, Hi = resto
Hi = $2 mod $3
divide unsigned divu $2,$3 Lo = $2 ÷ $3, Quoziente e resto senza segno Hi = $2 mod $3
Move from Hi mfhi $1 $1 = Hi Copia Hi in un registro Move from Lo mflo $1 $1 = Lo Copia Lo in un registro
MIPS Instruction Set Architecture
Architettura degli elaboratori - 3 -
Comando Sintassi (es) Semantica (es) Commenti
and and $1,$2,$3 $1 = $2 & $3 AND bit a bit
or or $1,$2,$3 $1 = $2 v $3 OR bit a bit
xor xor $1,$2,$3 $1 = $2 $3 XOR bit a bit
nor nor $1,$2,$3 $1 = ~($2 |$3) NOR bit a bit
and immediate andi $1,$2,10 $1 = $2 & 10 AND tra reg. e costante or immediate ori $1,$2,10 $1 = $2 | 10 OR tra reg. e costante xor immediate xori $1, $2,10 $1 = $2 10 XOR tra reg. e costante shift left logical sll $1,$2,10 $1 = $2 << 10 Shift a sinistra di una costante shift right logical srl $1,$2,10 $1 = $2 >> 10 Shift a destra di una costante shift right arithm. sra $1,$2,10 $1 = $2 >> 10 Idem, ma con est. in segno shift left logical sllv $1,$2,$3 $1 = $2 << $3 Shift a sinistra di una variabile shift right logical srlv $1,$2,$3 $1 = $2 >> $3 Shift a destra di una variabile
Letture e scritture RAM
Istruzione Commento
sw $3, 500($4) Storeword sh $3, 502($2) Storehalf sb $2, 41($3) Storebyte
lw $1, 30($2) Loadword lh $1, 40($3) Loadhalfword
lhu $1, 40($3) Loadhalfword unsigned lb $1, 40($3) Loadbyte
lbu $1, 40($3) Loadbyte unsigned lui $1, 40($3) LoadUpper Immediate
(16 bits shifted left by 16)
MIPS Instruction Set Architecture
Architettura degli elaboratori - 4 -
da registro a mem (store)
da mem a registro
(load)
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,
blt rs, rt, dest branch less then – salta se R[rs] < R[rt]
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 >=
bgezalrs, dest come sopra «…and link»
bltz rs, dest less-than zero <
bltzalrs, dest come sopra «…and link»
MIPS Instruction Set Architecture
Architettura degli elaboratori - 5 -
(pseudo-istruzione)
Jumps (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
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 slti $1,$2,100 if ($2 < 100) $1=1; else $1=0 immediate <costante (complemento a 2)
set on less than sltu $1,$2,$3 if ($2 < $3) $1=1; else $1=0
unsigned < (numeri senza segno)
set less then sltiu $1,$2,100 if ($2 < 100) $1=1; else $1=0 immediate unsigned <costante (numeri senza segno)
MIPS Instruction Set Architecture
Architettura degli elaboratori - 7 -
Inizializzazione / copia valori / etc
move $t0, $t1 (copia $t1 in $t0)
li $t0, val (load immediate, copia il valore val in $t0) la $t0, etichetta (load address, copia l’indirizzo addr in $t0)
nop (non fare nulla)
syscall (chiamata di sistema: viene invocato
il servizio indicato dal valore di $v0 – vedi tabella)
MIPS Instruction Set Architecture
Architettura degli elaboratori - 8 -
Funzioni di sistema
Programmazione ASM MIPS
Architetture - 9 -
Servizio Codice
(in $v0) Argomenti Risultato
print integer 1 $a0 = valore da stampare (nessuno)
print float 2 $f12 = valore da stampare (nessuno)
print double 3 $f12 = valore da stampare (nessuno)
print string 4 $a0 = indirizzo della stringa da stampare (nessuno)
read integer 5 (nessuno) $v0 = valore letto
read float 6 (nessuno) $f0 = valore letto
read double 7 (nessuno) $f0 = valore letto
read string 8 $a0 = indirizzo dove mettere la stringa
$a1 = quanti caratteri leggere + 1 (nessuno)
memory allocation 9 $a0 = numero di byte richiesti $v0 = address del blocco
exit 10 (nessuno) (nessuno)
print character 11 $a0 = integer (nessuno)
read character 12 (nessuno) $v0 = carattere letto
Sinonimi dei registri
Registro: $0 $1 $2 $3 $4 $5 $6 $7
Sinonimo: $r0 $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 Sinonimo: $t8 $t9 $k0 $k1 $gp $sp $s8 $ra
Convenzioni nell'uso dei registri
$at , $k0-$k1: riservati (per l'assemblatore e il system calls risp.)
$a0 - $a3 : argomenti per routine (e system calls)
$v0 - $v1 : risutlati di routine (e system call)
$t0 - $t9 : valori temporanei,
$s0 - $s7 : valori stabili (salvati nelle chiamate)
$gp : puntatore globale (quale “blocco” di memoria da 64K nel viene usato)
$sp : è lo stack pointer,
indirizza la pos libera in cima allo stack
$fp : frame pointer (vedremo).
$ra : return address,
l'indirizzo di rientro dalla chiamata di procedura.
Programmazione ASM MIPS
Architetture - 11 -
Direttive
Generali:
.data Inizio segmento dati
.text Inizio segmento programma
.globl e L’etichettae è visibile da altri file (per progetti multifile) Dati:
.word «Memorizza i literal numero successivi in 4 byte ciascuno»
.half «Memorizza i literal numero successivi in 2 byte ciascuno»
.byte «Memorizza i literal numero successivi in 1 byte ciascuno»
.ascii «Memorizza i literal stringa succ. come sequenze di byte»
.asciiz «Memorizza i literal stringa succ. come sequenze di byte, terminate da 0»
.space n «Lascia nBytes liberi qui »
.align n «Padding per allinearsi a 2n bytes»
Programmazione ASM MIPS
Architetture - 12 -