# Laboratório 3
# Exercico de casa
# by Martim Bento
Resolução:
# ZONA I: Definicao de variaveis
.data
    x: .word 3
    y: .word 9
# ZONA II: Codigo
.text
# Programa principal: programa que recebe dois numeros inteiros positivos, x e y, e retorna o valor de x^y
    lw a0, x
    lw a1, y
    addi sp, sp, -8
    sw a0, 4(sp)
    sw a1, 0(sp)
    jal Pow
    lw a0, 0(sp)
    li a7, 1
    ecall
    li a7, 10
    ecall
# Pow: Rotina que efectua o calculo de x^y, sendo x e y dois numeros inteiros positivos
#     Entradas:     a0 - x
#                  a1 - y
#    Saidas:       a0 - resultado
#     Efeitos:      ---
Pow:
    #salvaguardar return address e s1
    addi sp, sp, -8
    sw ra, 4(sp)
    sw s1, 0(sp)
    lw t0, 8(sp) #t0 = y
    lw t3, 12(sp) #t3 = x
    srli t2, t0, 1
    beq t0, zero, ret1 #if y = 0 => pow(x,h) = 1
    li t1, 1
    beq t1, t0, impar #if y = 1 => return x*pow(x,h)
    andi t1, t0, 1
    blt zero, t1, impar #if y%2 = 1 => return x*pow(x,h)
par:
addi sp, sp, -8
sw t3, 4(sp)
sw t2, 0(sp)
jal Pow
lw s1, 0(sp)
addi sp, sp, -4
sw s1, 0(sp)
jal Mult
lw s1, 0(sp)
addi sp, sp, 4
j EndLoop
impar:
addi sp, sp, -8
sw t3, 4(sp)
sw t2, 0(sp)
jal Pow
lw s1, 0(sp)
addi sp, sp, -4
sw s1, 0(sp)
jal Mult
lw s1, 0(sp)
addi sp, sp, 4
addi sp, sp, -8
sw s1, 4(sp)
sw t3, 0(sp)
jal Mult
lw s1, 0(sp)
addi sp, sp, 4
j EndLoop
ret1:
li s1, 1 #pow(x,h) = 1
EndLoop:
    sw s1, 12(sp)
    lw s1, 0(sp)
    lw ra, 4(sp)
    addi sp, sp, 12
    ret
# Mult: Rotina que efectua o calculo de a*b, sendo a e b numeros inteiros positivos
#     Entradas:    0(sp), 4(sp) - numeros a multiplicar
#    Saidas:        0(sp) - resultado
#    Efeitos:    ---
Mult:
    addi sp, sp, -12
    sw s1, 8(sp)
    sw s2, 4(sp)
    sw s3, 0(sp)
    lw s2, 16(sp)
    lw s1, 12(sp)
    li s3, 0
    beq s2, zero, OutMul
    beq s1, zero, OutMul
MulLoop:
    add s3, s3, s1
    addi, s2, s2, -1
    bne s2, zero, MulLoop
OutMul:
    sw s3, 16(sp)
    lw s3, 0(sp)
    lw s2, 4(sp)
    lw s1, 8(sp)
    addi sp, sp, 16
    ret
# Lab de Segunda feira - by Martim Bento

Resolução
.data
n:    .word 10
    .text
    lw a0, n
    li s1, 0
    addi sp, sp, -8
    sw s1, 4(sp)
    sw a0, 0(sp)
    jal Un
    lw a0, 0(sp)
    li a7, 1
    ecall
    li a7, 10
    ecall
Un:
    addi sp, sp, -8
    sw ra, 4(sp)
    sw s1, 0(sp)
    lw t1, 8(sp) #t2 = x
    li t0, 1
    beq t1, t0, endrec
    andi t0, t1, 1
    bne t0, zero, impar
par:
srli t2, t1, 1 #t2 = n/2 = x
addi sp, sp -4
sw t2, 0(sp)
jal Un
lw s1, 0(sp)
li t3, 2
mul s1, s1, t3
j EndLoop
impar:
addi t2, t1, -1 #t2 = (n-1)/2 = x
srli t2, t1, 1
addi sp, sp -4
sw t2, 0(sp)
jal Un
lw s1, 0(sp)
li t3, 3
mul s1, s1, t3
j EndLoop
endrec:
li s1, 1
EndLoop:
sw s1, 12(sp)
lw s1, 0(sp)
lw ra, 4(sp)
addi sp, sp, 12
ret
# by Martim Bento e João Rodrigues

Resolução:
 .data
n:    .word 18
    .text
    lw a0, n
    li s1, 0
    addi sp, sp, -8
    sw s1,4(sp)
    sw a0,0(sp)
    jal Un
    lw a0, 0(sp)
    li a7, 1
    ecall
    li a7, 10
    ecall
Un:
    addi sp, sp, -8
    sw ra, 4(sp)
    sw s1, 0(sp)
    li t0, 1
    lw t1, 8(sp)
    bge t0, t1, endrec
    andi t0, t1, 1
    addi t0, t0, -1
    beq t0, zero, impar
par:
srai t2, t1, 1 #t2 = x = n/2
addi sp, sp, -4
sw t2, 0(sp)
jal Un
li t3, 2
lw s1, 0(sp)
mul s1, s1, t3 #2*U(n/2)
j EndLoop
impar:
addi t2, t1, -1
srai t2, t2, 1 #t2 = x = (n-1)/2
addi sp, sp, -4
sw t2, 0(sp)
jal Un
lw s1, 0(sp)
addi t3, s1, 0 #mv t3, s1
mul s1, s1, t3
j EndLoop
endrec:
li s1, 1
EndLoop:
    sw s1, 12(sp)
    lw s1, 0(sp)
    lw ra, 4(sp)
    addi sp, sp, 12
    ret
# Lab de Sexta feira
# by Rodrigo Coimbra e André Teodósio
Resolução:
# Programa L3 
#Exercicio:
#U(n) = 1, se n <= 1
#U(n) = U(n-1) * U(n/2), se n e par
#U(n) = 2 U((n-1)/2), se n e impar
# ZONA I: Definicao de variaveis
.data
    n: .word 14
# ZONA II: Codigo
.text
# Programa principal: programa que recebe dois numeros inteiros positivos, x e y, e retorna o valor de x^y
	lw a5, n
	addi sp, sp, -4
	sw a5, 0(sp)    #n
	jal U
	lw a0, 0(sp)
	li a7, 1
	ecall
	li a7, 10
	ecall
U:   
	addi sp, sp, -16
	sw s1, 12(sp) 
	sw ra, 8(sp)           
	sw a1, 4(sp)				  
	sw a0, 0(sp)				 
	lw a1, 16(sp)									
	
	li t1, 1
	bgt a1, t1, else1
	li a0, 1
	j end
else1:
	li t0, 2
	rem t4, a1, t0       #s4 = y%2
	bnez t4, else2    
	#par1    
   addi a1, a1, -1        #a2 = n-1
   
   addi sp, sp,-4        
	sw a1, 0(sp)                   
   jal U       
	lw a0, 0(sp)
	addi sp, sp, 4
	mv s1, a0
	#par2
   addi a1,a1,1  #meter o valor de n original, ou seja, (n-1)+1= n
	srli a1,a1,1  #a1 = n = (y/2)
   addi sp, sp, -4
	sw a1, 0(sp)                   
   jal U          
	lw a0, 0(sp) 
	addi sp, sp, 4
   mul a0,a0,s1
   j end
else2:                    
	#impar
	addi a1, a1, -1
	srli a1, a1, 1         #a1 = n = (y-1/2)
   addi sp, sp, -4      
	sw a1, 0(sp)            	       
   jal U        
	lw a0, 0(sp)
	addi sp, sp, 4
	li t2, 2            #para multiplicar por 2    
	mul a0, a0, t2        
end:
	sw a0, 16(sp)
	lw s1, 12(sp)
	lw ra, 8(sp)            
	lw a1, 4(sp)				  
	lw a0, 0(sp)		
	addi sp, sp, 16		
	jalr x0, ra, 0