Professional Documents
Culture Documents
Mips Isa
Mips Isa
Enters
INSTRUCCIONS MIPS
Aritmtico-lgiques
Comparaci
Memria
Moviment de dades
Instruccions de salt
relatiu al PC
addiu
addu
and
andi
div
divu
mult
multu
nor
or
ori
sll
sllv
sra
srav
srl
srlv
subu
xor
xori
slt
sltu
slti
sltiu
rt,
rd,
rd,
rt,
rs,
rs,
rs,
rs,
rd,
rd,
rt,
rd,
rd,
rd,
rd,
rd,
rd,
rd,
rd,
rt,
rd,
rd,
rt,
rt,
rs,
rs,
rs,
rs,
rt
rt
rt
rt
rs,
rs,
rs,
rt,
rt,
rt,
rt,
rt,
rt,
rs,
rs,
rs,
rs,
rs,
rs,
rs,
lb
lbu
lh
lhu
lw
sb
sh
sw
lui
mfhi
mflo
mfc0
mtc0
beq
bne
rt,
rt,
rt,
rt,
rt,
rt,
rt,
rt,
rt,
rd
rd
rt,
rd,
rs,
rs,
off16(rs)
off16(rs)
off16(rs)
off16(rs)
off16(rs)
off16(rs)
off16(rs)
off16(rs)
imm16
MACROS MARS
b
bge
bgeu
bgt
bgtu
ble
bleu
blt
bltu
la
li
move
etiq
rsrc1,
rsrc1,
rsrc1,
rsrc1,
rsrc1,
rsrc1,
rsrc1,
rsrc1,
rdest,
rdest,
rdest,
rsrc2,
rsrc2,
rsrc2,
rsrc2,
rsrc2,
rsrc2,
rsrc2,
rsrc2,
adr
imm
rsrc
etiq
etiq
etiq
etiq
etiq
etiq
etiq
etiq
rt
rt
imm16
imm5
rs
imm5
rs
imm5
rs
rt
rt
imm16
rt
rt
imm16
imm16
rd
rt
rt, etiq
rt, etiq
j
etiq
jal
etiq
jr
rs
eret
Tractament dexcepcions syscall
Instruccions de salt
absolut
imm16
rt
rt
imm16
Coma flotant
add.d
add.s
div.d
div.s
mul.d
mul.s
sub.d
sub.s
fd,
fd,
fd,
fd,
fd,
fd,
fd,
fd,
fs,
fs,
fs,
fs,
fs,
fs,
fs,
fs,
ft
ft
ft
ft
ft
ft
ft
ft
c.eq.d
c.eq.s
c.le.d
c.le.s
c.lt.d
c.lt.s
lwc1
swc1
fs,
fs,
fs,
fs,
fs,
fs,
ft,
ft,
ft
ft
ft
ft
ft
ft
off16(rs)
off16(rs)
mfc1
mov.s
mtc1
rt, fs
fd, fs
rd, fs
bc1f
bc1t
etiq
etiq
INSTRUCCIONS MIPS
A continuaci es detallen les instruccions MIPS ordenades alfabticament. Abans es
descriuen els elements que sutilitzen en la seva sintaxi.
rt, rs, rd:
Especifiquen un registre de propsit general. En el format de la instrucci es representen en 5 bits, que es denoten com ttttt,
sssss i ddddd, respectivament.
imm16:
imm5:
Especifiquen un registre de coma flotant. En el format de la instrucci es representen en 5 bits, que es denoten com ttttt, sssss i
ddddd, respectivament.
off16:
etiq:
Especifica una etiqueta del programa. Quan sutilitza en una instrucci de salt relatiu al PC, en el format de la instrucci no sespecifica ladrea absoluta detiq, sin que es codifica en 16 bits el
desplaament que hi ha en nombre dinstruccions des de la segent
instrucci fins a etiq. Aquest camp es denota amb 16 os. Daltra
banda, quan sutilitza en una instrucci de salt absolut, en el format
de la instrucci sespecifiquen 26 bits, que corresponen als bits
<27:2> de ladrea detiq. Els 4 bits de ms pes de ladrea on hi
ha la instrucci de salt i la del dest del salt han de coincidir. Els dos
bits de menys pes del dest del salt sn 0s i no sespecifiquen. En el
format de la instrucci aquest camp es denota amb 26 ts.
addiu
addiu:
Add Immediate
0010 01ss ssst tttt iiii iiii iiii iiii
rt = rs + SignExt(imm16)
La instrucci addiu realitza la suma aritmtica entera dun registre i de lextensi de signe duna
constant de 16 bits representada en Ca2. Existeix una instrucci anloga (addi) que realitza la
mateixa tasca, per amb la diferncia que genera una excepci si es produeix sobreeiximent en la
suma denters. La instrucci addi no la utilitzarem mai.
addiu rt, rs, imm16
addu
addu:
Add
0000 00ss ssst tttt dddd d000 0010 0001
rd, rs, rt
rd = rs + rt
La instrucci addu realitza la suma aritmtica entera de dos registres. Existeix una instrucci
anloga (add) que realitza la mateixa tasca, per amb la diferncia que genera una excepci si es
produeix sobreeiximent en la suma denters. La instrucci add no la utilitzarem mai.
addu
add.d
add.d:
fd = fs + ft
La instrucci add.d realitza la suma en coma flotant de doble precisi de dos registres de coma
flotant.
add.d fd, fs, ft
add.s
add.s:
fd = fs + ft
La instrucci add.s realitza la suma en coma flotant de simple precisi de dos registres de coma
flotant.
add.s fd, fs, ft
and
AND
and:
rd, rs, rt
rd = rs AND rt
La instrucci and realitza el producte lgic per cada un dels dos bits que ocupen la mateixa posici als registres fonts.
and
andi
AND Immediate
andi:
rt = rs AND ZeroExt(imm16)
La instrucci and realitza el producte lgic per cada un dels dos bits que ocupen la mateixa posici al registre font i a lextensi de zeros duna constant de 16 bits representada en Ca2.
andi rt, rs, imm16
bc1f
bc1f:
$pc = etiq si cc = 0
La instrucci bc1f salta a etiq si el codi de condici de coma flotant cc s 0.
bc1f etiq
bc1t
bc1t:
$pc = etiq si cc = 1
La instrucci bc1t salta a etiq si el codi de condici de coma flotant cc s 1.
bc1t etiq
beq
beq:
Branch On Equal
0001 00ss ssst tttt oooo oooo oooo oooo
bne
bne:
bne
bne
c.eq.d
c.eq.d:
c.eq.s
c.eq.s:
c.le.d
c.le.d:
c.le.s
c.le.s:
c.lt.d
c.lt.d:
c.lt.s
c.lt.s:
div
Divide
div:
div
lo = rs / rt; hi = rs % rt
div
Divide
La instrucci div calcula el quocient i el residu de la divisi entera entre dos registres. El quocient semmagatzema al registre lo i el residu al registre hi. El signe del residu coincideix amb el
signe del dividend. No es genera excepci per sobreeiximent del quocient. En cas de divisi per 0
el resultat resta indefinit.
divu
Unsigned Divide
divu:
lo = rs / rt; hi = rs % rt
La instrucci divu calcula el quocient i el residu de la divisi natural entre dos registres. El quocient semmagatzema al registre lo i el residu al registre hi. En cas de divisi per 0 el resultat
resta indefinit.
divu
rs, rt
div.d
div.d:
fd = fs + ft
La instrucci div.d calcula el quocient de la divisi de dos registres de coma flotant en doble
precisi.
div.d fd, fs, ft
div.s
div.s:
fd = fs + ft
La instrucci div.s calcula el quocient de la divisi de dos registres de coma flotant en simple
precisi.
div.s fd, fs, ft
eret
Exception Return
eret:
llegiu descripci
La instrucci eret activa el bit EXL del Status Register del coprocessador 0 i retorna a la
instrucci apuntada pel registre EPC del coprocessador 0.
eret
Jump
j:
$pc = etiq
La instrucci j salta incondicionalment a etiq.
j
etiq
jal
jal:
etiq
jr
Jump Register
jr:
$pc = rs
La instrucci jr salta incondicionalment a ladrea especificada pel registre rs.
jr
rs
lb
lb:
Load Byte
1000 00ss ssst tttt oooo oooo oooo oooo
rt, off16(rs)
rt = SignExt(Mbyte[rs+SignExt(off16)])
La instrucci lb llegeix un byte de memria a ladrea indicada per la suma del registre rs i
lextensi de signe doff16. La dada es guarda al registre dest fent extensi de signe.
lb
lbu
lbu:
rt = ZeroExt(Mbyte[rs+SignExt(off16)])
La instrucci lbu llegeix un byte de memria a ladrea indicada per la suma del registre rs i
lextensi de signe doff16. La dada es guarda al registre dest fent extensi de zeros.
lbu
rt, off16(rs)
lh
lh:
Load Half
1000 01ss ssst tttt oooo oooo oooo oooo
rt = SignExt(Mhalf[rs+SignExt(off16)])
La instrucci lh llegeix un half (16 bits) de memria a ladrea indicada per la suma del registre
rs i lextensi de signe doff16. La dada es guarda al registre dest fent extensi de signe.
lh
rt, off16(rs)
lhu
lhu:
rt = ZeroExt(Mhalf[rs+SignExt(off16)])
La instrucci lhu llegeix un half (16 bits) de memria a ladrea indicada per la suma del registre rs i lextensi de signe doff16. La dada es guarda al registre dest fent extensi de zeros.
lhu
rt, off16(rs)
lui
lui:
rt31:16 = imm16
rt15:0 = 0
La instrucci lui carrega la constant de 16 bits imm16 a la meitat alta del registre dest. Tamb
posa a 0 la meitat baixa del registre dest.
lui
rt, imm16
lw
lw:
Load Word
1000 11ss ssst tttt oooo oooo oooo oooo
rt, off16(rs)
rt = Mword[rs+SignExt(off16)]
La instrucci lw llegeix una paraula (32 bits) de memria a ladrea indicada per la suma del
registre rs i lextensi de signe doff16.
lw
lwc1
lwc1:
ft = Mword[rs+SignExt(off16)]
La instrucci lwc1 llegeix una paraula (32 bits) de memria a ladrea indicada per la suma del
registre rs i lextensi de signe doff16. La dada es guarda al registre de coma flotant ft.
lwc1 ft, off16(rs)
mfhi
mfhi:
Move From Hi
0000 0000 0000 0000 dddd d000 0001 0000
rd = $hi
La instrucci mfhi copia el registre $hi al registre dest.
mfhi rd
mflo
mflo:
Move From Lo
0000 0000 0000 0000 dddd d000 0001 0010
rd = $lo
La instrucci mflo copia el registre $lo al registre dest.
mflo rd
mfc0
mfc0:
rt = rd (c0)
La instrucci mfc0 copia el registre rd, pertanyent al coprocessador 0, cap al registre de propsit
general rt.
mfc0 rt, rd
mfc1
mfc1:
rt = fs
La instrucci mfc1 copia el registre fs, pertanyent al coprocessador 1, cap al registre de propsit
general rt.
mfc1 rt, fs
mov.s
mov.s:
fd = fs
La instrucci mov.s copia el registre de coma flotant en simple precisi fs a fd.
mov.s fd, fs
mtc0
mtc0:
Move To Coprocesor 0
0100 0001 000t tttt dddd d000 0000 0000
rd (c0) = rt
La instrucci mtc0 copia el registre de propsit general rt cap al registre rd, pertanyent al coprocessador 0.
mtc0 rt, rd
mtc1
mtc1:
Move To Coprocessor 1
0100 0101 000t tttt ssss s000 0000 0000
mtc1
Move To Coprocessor 1
fs = rt
La instrucci mtc1 copia el registre de propsit general rt cap al registre fs, pertanyent al coprocessador 1.
mtc1 rt, fs
mult
Multiply
mult:
lo = low(rs*rt); hi = high(rs*rt)
La instrucci mult calcula el producte enter de dos registres. Els 32 bits de menys pes semmagatzemen al registre lo i els 32 bits de ms pes al registre hi.
mult
rs, rt
multu
Unsigned Multiply
multu:
lo = low(rs*rt); hi = high(rs*rt)
La instrucci mult calcula el producte natural de dos registres. Els 32 bits de menys pes semmagatzemen al registre lo i els 32 bits de ms pes al registre hi.
multu rs, rt
mul.d
mul.d:
fd = fs * ft
La instrucci mul.d calcula el producte en coma flotant de doble precisi de dos registres de
coma flotant.
mul.d fd, fs, ft
mul.s
mul.s:
fd = fs * ft
La instrucci mul.s calcula el producte en coma flotant de simple precisi de dos registres de
coma flotant.
mul.s fd, fs, ft
nor
nor:
NOR
0000 00ss ssst tttt dddd d000 0010 0111
rd = rs NOR rt
La instrucci nor realitza la complementaci de la suma lgica per cada un dels dos bits que
ocupen la mateixa posici als registres fonts.
nor
rd, rs, rt
or
or:
OR
0000 00ss ssst tttt dddd d000 0010 0101
rd, rs, rt
rd = rs OR rt
La instrucci or realitza la suma lgica per cada un dels dos bits que ocupen la mateixa posici
als registres fonts.
or
ori
ori:
OR Immediate
0011 01ss ssst tttt iiii iiii iiii iiii
ori
OR Immediate
sb
sb:
Store Byte
1010 00ss ssst tttt oooo oooo oooo oooo
Mbyte[rs+SignExt(off16)] = rt
La instrucci sb escriu el byte de menys pes del registre rt a memria a ladrea indicada per la
suma del registre rs i lextensi de signe doff16.
sb
rt, off16(rs)
sh
sh:
Store Half
1010 01ss ssst tttt oooo oooo oooo oooo
Mhalf[rs+SignExt(off16)] = rt
La instrucci sh escriu la meitat baixa (16 bits) del registre rt a memria a ladrea indicada per
la suma del registre rs i lextensi de signe doff16.
sh
rt, off16(rs)
sll
sll:
sllv
sllv:
rd = rt << rs
La instrucci sll realitza un desplaament de bits a lesquerra del registre rt. El nombre de bits a
desplaar ve indicat pels 5 bits de menys pes del registre rs.
sllv rd, rt, rs
slt
slt:
rd, rs, rt
sltu
sltu:
slti
slti:
slti
sltiu
sltiu:
sra
sra:
srav
srav:
rd = rt >> rs
La instrucci srav realitza un desplaament aritmtic (amb extensi de signe) de bits a la dreta
del registre rt. El nombre de bits a desplaar ve indicat pels 5 bits de menys pes del registre rs.
srav rd, rt, rs
srl
srl:
rd = rt >>> imm5
La instrucci srl realitza un desplaament lgic (amb extensi de zeros) de bits a la dreta del
registre rt. El nombre de bits a desplaar sindica amb la constant imm5.
srl
srlv
srlv:
rd = rt >>> rs
La instrucci srlv realitza un desplaament lgic (amb extensi de zeros) de bits a la dreta del
registre rt. El nombre de bits a desplaar ve indicat pels 5 bits de menys pes del registre rs.
srlv rd, rt, rs
subu
subu:
Subtract
0000 00ss ssst tttt dddd d000 0010 0011
rd, rs, rt
rd = rs - rt
La instrucci subu realitza la resta entera de dos registres. Existeix una instrucci anloga (sub)
que realitza la mateixa tasca, per amb la diferncia que genera una excepci si es produeix
sobreeiximent en la resta denters. La instrucci sub no la utilitzarem mai
subu
10
sub.d
sub.d:
fd = fs - ft
La instrucci sub.d calcula la resta en coma flotant de doble precisi de dos registres de coma
flotant.
sub.d fd, fs, ft
sub.s
sub.s:
fd = fs - ft
La instrucci sub.s calcula la resta en coma flotant de simple precisi de dos registres de coma
flotant.
sub.s fd, fs, ft
sw
Store Word
sw:
Mword[rs+SignExt(off16)] = rt
La instrucci sw escriu el registre rt a memria a ladrea indicada per la suma del registre rs i
lextensi de signe doff16.
sw
rt, off16(rs)
swc1
swc1:
Mword[rs+SignExt(off16)] = ft
La instrucci swc1 escriu el registre de coma flotant ft a memria a ladrea indicada per la
suma del registre rs i lextensi de signe doff16.
swc1 ft, off16(rs)
syscall
syscall:
System Call
0000 0000 0000 0000 0000 0000 0000 1100
llegiu descripci
La instrucci syscall crida al sistema operatiu generant una excepci. El registre $v0 ha de
contenir el parmetre de la crida al sistema operatiu.
syscall
xor
xor:
XOR
0000 00ss ssst tttt dddd d000 0010 0110
rd = rs XOR rt
La instrucci xor realitza la suma exclusiva per cada un dels dos bits que ocupen la mateixa
posici als registres fonts.
xor
rd, rs, rt
xori
xori:
XOR Immediate
0011 01ss ssst tttt iiii iiii iiii iiii
rt = rs XOR ZeroExt(imm16)
La instrucci xori realitza la suma exclusiva per cada un dels dos bits que ocupen la mateixa
posici al registre font i a lextensi de zeros de la constant de 16 bits imm16.
xori rt, rs, imm16
11
MACROS MARS
A continuaci es descriuen les macros MARS ordenades alfabticament. Abans es
detallen els elements que sutilitzen en la seva sintaxi.
rsrc1, rsrc2, rdest: Especifiquen un registre de propsit general.
imm:
adr:
b
b etiq
Branch
$pc = etiq
$pc = etiq si
rsrc1 >= rscr2
bge
bge rsrc1, rsrc2, etiq
bgeu
bgeu rsrc1, rsrc2, etiq
$pc = etiq si
rsrc1 >= rscr2
$pc = etiq si
rsrc1 > rscr2
$pc = etiq si
rsrc1 > rscr2
$pc = etiq si
rsrc1 <= rscr2
bgt
bgt rsrc1, rsrc2, etiq
Branch On Greater
bgtu
bgtu rsrc1, rsrc2, etiq
ble
ble rsrc1, rsrc2, etiq
bleu
bleu rsrc1, rsrc2, etiq
$pc = etiq si
rsrc1 <= rscr2
$pc = etiq si
rsrc1 < rscr2
$pc = etiq si
rsrc1 < rscr2
blt
blt rsrc1, rsrc2, etiq
Blanch On Lesser
bltu
bltu rsrc1, rsrc2, etiq
12
la
Load Address
la
rdest, adr
rdest = adr
li
li
Load Immediate
rdest, imm
rdest = imm
move
move
Move
rdest, rsrc
rdest = rsrc
13
14