# 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

single precision

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

single precision

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  
    
Last Updated: 6/27/2021, 11:11:21 PM