Você está na página 1de 7

Instrues em Assembly MIPS

Registradores:

Nome Uso
$0 Constante de valor 0
$at Temporario do Assemby
$v0 - $v1 Valor de retorno na funo
$a0 - $a3 Argumentos da funo
$t0 - $t7 Variaveis temporarias
$s0 - $s7 Saved temporary
$t8 - $t9 Variaveis temporarias
$k0 - $k1 Temporarias operando no sistema
(OS)
$gp Ponteiro global
$sp Ponteiro estatico
$fp Ponteiro frame
$ra Endereo de retorno da funo

Imprimindo Texto

.data
Mensagem: .asciiz Mensagem a ser Imprimida
.text
li $v0, 4
la $a0, Mensagem
syscall

Imprimindo um caracter

.data
Caracter: .byte c
.text
li $v0, 11
la $a0, Caracter
syscall

Imprimindo um inteiro

.data
Numero: .word 25
.text
li $v0, 1
lw $a0, Numero
syscall

Imprimindo um Float

.data
Const: .float 3,14
.text
li $v0, 2
lwc1 $f12, Const
syscall

Fazendo adio de inteiros e imprimindo



.data
Num1: .word 5
Num2: .word 10
.text
lw $t0, Num1($zero)
lw $t1, Num2($zero)
add $t2, $t0, $t1 #$t2=$t0+$t1

li $v0, 1
add $a0, $zero, $t2 #Forma de passar o valor de $t2 para $a0 p/ imprim
syscall

Fazendo subtrao de inteiros e imprimindo


.data
Num1: .word 20
Num2: .word 8
.text
lw $s0, Num1
lw $s1, Num2
sub $t0, $s0, $s1 #$t2=$t0-$t1 $to = 20-8

li $v0, 1
move $a0, $t0 #Outra Forma de passar o valor de $t0 p/ $a0 p/ imprimir
syscall
Fazendo multiplicao (MUL) de inteiros e imprimindo

.data

.text
addi $s0, $zero, 10
addi $s1, $zero, 4
mul $t0, $s0, $s1 #$t0=$s0*$s1 $t0 = 10*4

#Mostrando o resultado da multiplicao
li $v0, 1
add $a0, $zero, $t0
syscall

Fazendo multiplicao (MULT) de inteiros e imprimindo



.data

.text
addi $t0, $zero, 2000
addi $t1, $zero, 10
mult $t0, $t1 #lo=$t0*$t1 lo = 2000*10

#Movendo do registrador especial lo para $s0
mflo $s0
#Como o produto no to alto no usa o hi
#Mostrando o resultado da multiplicao
li $v0, 1
add $a0, $zero, $s0
syscall

Fazendo multiplicao (SLL) de inteiros e imprimindo



uma instruo especial que permite voc mudar
sll Shift Left Logical
um bit para esquerda. Por que util? Porque permite voc multiplicar de uma
maneira bem eficiente (srl shiftrightlogical- permitedividirdeumaformabem
eficiente).
Sll um jeito rapido de multiplicar por 2N :
sll $t0, $s0, 2 Multiplica $s0 por 4 (22)
sll $t0, $s0, 2 Multiplica $s0 por 8 (23)
sll $t0, $s0, 2 Multiplica $s0 por 16(24)
(...)

interessante usar esse comando quando se trabalha com array voc precisa
calcular um numero no array e assim voc pode pegar o valor no array.

.data

.text
addi $s0, $zero, 4
sll $t0, $s0, 2 # 4*2
2
=4*4=16

#Mostrando o resultado da multiplicao
li $v0, 1
add $a0, $zero, $t0
syscall

Fazendo diviso (DIV) de inteiros e imprimindo



.data

.text
addi $t0, $zero, 30
addi $t1, $zero, 5
div $s0, $t0, $t1 #$s0 = 30/5

li $v0, 1
add $a0, $zero, $s0
syscall
ou
.text
addi $t0, $zero, 30
addi $t1, $zero, 5
div $s0, $t0, 10 #$s0 = 30/10

li $v0, 1
add $a0, $zero, $s0
syscall
ou
.text
addi $t0, $zero, 30
addi $t1, $zero, 6
div $t0, $t1
mflo $s0 #Resultado $s0 = 30/6
mfhi $s1 #Resto $s1 = 30%6
li $v0, 1
add $a0, $zero, $s0
syscall

Comparando Dois nmeros (beq -> Branching if is EQual)



.data
Mensagem: .asciiz O numero igual
Mensagem2: .asciiz Nada acontece
.text
main:
addi $t0, $ zero, 5
addi $t1, $ zero, 20
beq $t0, $t1, NumerosIguais #$s0 = 30/5

NumerosIguais:
li $v0, 4
la $a0, Mensagem
syscall

Comparando Dois nmeros (bne -> Branch if is No Eq ual)



.data
Mensagem: .asciiz Os numeros so diferentes
Mensagem2: .asciiz Nada acontece
.text
main:
addi $t0, $ zero, 5
addi $t1, $ zero, 20
bne $t0, $t1, NumerosNaoIguais

NumerosNaoIguais:
li $v0, 4
la $a0, Mensagem
syscall
H variaes como:
b destino: (branch) que apenas desvia para a funo de destino
bnez destino: (branch if is not equal to zero) que desvia para a
funo de destino se o valor for diferente de zero
bgt $t0, $t1, destino: (Branch if Greater Than) que um
pseudo-branch que desvia para a funo de destino se $t0 for maior
que $t1
blt $t0, $t1, destino: (Branch if Less Than) que desvia para a funo
de destino se $t0 for menor que $t1
bgtz $t0, destino: (Br anch if Greater Than Zero) ou blt $t0,destino:
(Branch if Less Than Ze ro) que desvia para a funo de destino se
$t0>0 e $t0<0, respectivamente

Comparando Dois nmeros (slt -> set less than)



.data
Mensagem: .asciiz Os numeros menor que o outro
.text
main:
addi $t0, $ zero, 5
addi $t1, $ zero, 20
slt $s0, $t0, $
t1 #Se $t0 for menor que $t1, $s0=1 (true)
bne $s0, $zero, ImprimeMensagem

ImprimeMensagem:
li $v0, 4
la $a0, Mensagem
syscall

Rotina de Repetio (loop)



.data
.text
main:
addi $t0, $ zero, 0 #$t0 seria-> i=0

while:
bgt $t0, 10, saida #Condio de parada do while ()
jal ImprimeNumero
addi $t0, $ t0, 1 #Isso seria-> i++ ou i=i+1
j while #Volta pro inicio do while, fazendo a repetio

ImprimeNumero:
li $v0, 1
addi $a0, $t0, $zero
syscall
jr $ra #Retorna onde chamou, volta dentro do while


Vetores (array) e imprimindo um vetor com Rotina de Repetio (loop/whiel)

.data
Vetor: .space 12 #Aloca um vetor de int com 3 espaos (4*3)
Linha: .asciiz \n
.text

addi $s0, $zero, 4 # $s0=0
addi $s1, $zero, 10 # $s1=10
addi $s2, $zero, 12 # $s2=12

#Posio no vetor->$t0, iniciando em $t0=0
addi $t0, $ zero, 0 # $t0=0
sw $s0, Vetor($t0) # Coloca o valor de #s0 no posio $t0 do
vetor
addi $t0, $ t0, 4 #$t0=4, vai para a 2 pos do vetor
sw $s1, Vetor($t0) # Coloca o valor de #s1 no posio $t0 do
vetor
addi $t0, $ t0, 4 #$t0=8, vai para a 3 pos do vetor
sw $s2, Vetor($t0) # Coloca o valor de #s2 no posio $t0 do
vetor

addi $t0, $zero, 0 #Zerar $t0 para iniciar a cont. no while

while:
beq $t0, 12, saida #Condio de parada do while ()
lw $t6, Vetor($t0) # Poe contedo de Vetor[$t0] em $t6
#Imprime o valor que $t6 acabou de receber do vetor
li $v0, 1
move $a0, $t6
syscall
#Pula uma linha, imprimindo a mensagem \n
li $v0, 4
la $a0, Linha
syscall
addi $t0, $ t0, 4 #Acrescentando $t0 de 4 em 4 pois cada int
ocupa 4 bits e cada posio do vetor de int foi reservada de 4 em 4 bits
j while #Volta pro inicio do while, fazendo a repetio

saida:
li $v0, 10
syscall