# Problemas 3
# EX1 - by Martim Bento
Resolução
.data
x: .word 50
y: .word 0
# if (x<10) => (if (y<1) => x-=10) ELSE x+=10
.text
la x10, x
la x11, y
lw x12, 0(x10)
lw x13, 0(x11)
li x14, 11
li x15, 1
bge x14, x12, else #if not x<10 => jump to else
blt x15, x13, success
jal x0, nothing #x<10, but y>=1
else:
addi x12, x12, 10 #x+=10
jal x0, nothing
success:
addi x12, x12, -10
nothing:
sw x12, 8(x10)
li x17, 10
# EX2 - by Martim Bento
- Resolução
#Exerício 2 Corrigido
.data
var: .word 0x0F0F
.text
lw x11, var
li x10, 0
li x12, 32
loop:
ble x12, zero, end
andi x13, x11, 1
add x10, x10, x13
srli x11, x11, 1
addi x12, x12, -1
j loop
end:
li x17, 1
ecall
li x17, 10
ecall
# EX2 - by Rodrigo Coimbra
- Resolução
.data
x: .word 127
.text
lw x12,x
li x13, 32
li x10, 0
for: mv x11, x12
andi x11, x11, 1
add x10, x11, x10
addi x13, x13, -1
srli x12, x12, 1
blt x0, x13, for
end:
li x17, 1
ecall
li x17, 10
ecall
# EX3 - by Martim Bento
- Resolução
.data
n_valores: .word 8
valores: .word 1, 2, 3, 4, 5, 6, 7, 8
.text
la x10, n_valores
lw x11, 0(x10)
la x12, valores
lw x13, 0(x12)
li x14, 0
while:
add x14, x14, x13
addi x11, x11, -1
addi x12, x12, 4
lw x13, 0(x12)
bge x11, x0, while
sw x14, 0(x10)
li x17, 0
# EX4 - by Martim Bento
- Resolução
.data
.text
li x10, 10
li x11, 4
addi x2, x2, -8
sw x10, 4(x2)
sw x11, 0(x2)
lw x10, 0(x2)
lw x11, 4(x2)
addi x2, x2, 8
li x17, 10
# EX5 - by Martim Bento
- Resolução
.data
x: .word 4
y: .word 7
z: .word 7
w: .word 3
.text
#5a)
#Salvaguarda dos valores de x, y, z e w
addi sp, sp, -16
lw x10, x
sw x10, 12(sp)
lw x10, y
sw x10, 8(sp)
lw x10, z
sw x10, 4(sp)
lw x10, w
sw x10, 0(sp)
jal x1, Soma3
jal x1, Subtrai
addi sp, sp 12
#Guardar valor final
sw x10, 0(sp)
jal x0, EOF
#5b) ??
#Soma(a,b)
Soma:
add x10, x10, x11
jalr x0, x1, 0
Soma3:
#salvaguarda de x1
addi x2, x2, -4
sw x1, 0(x2)
#colocar em x10 e x11 os valores dos operandos
lw x10, 16(sp)
lw x11, 12(sp)
jal Soma
#selecionar o proximo operando
lw x11, 8(sp)
jal Soma
#Repor x1
lw x1, 0(x2)
addi x2, x2, 4
jalr x0, x1, 0
Subtrai:
#Selecionar operando
lw x11, 0(sp)
sub x10, x10, x11
jalr x0, x1, 0
#Final
EOF:
li x17, 1
ecall
li x17, 10
ecall
#5c) No ponto maximo tem 5 palavras guardadas: x, y, z, w e x1.
# No final do programa so tem o resultado guardado.
# EX5 - by Tomás Martins
Resolução
.data
a: .word 4
b: .word 7
c: .word 7
d: .word 3
.text
#subtrai(soma3(4,7,7),3)
addi sp, sp, -12
lw x11,a
sw x11,8(sp)
lw x11,b
sw x11,4(sp)
lw x11,c
sw x11, 0(sp)
jal x1,soma3
#lw x10,0(sp)=a+b+c
addi sp,sp,-4
lw x11,d
sw x11,0(sp)
jal x1,sub
addi sp,sp,8
li x17,1
ecall
li x17,10
ecall
sub:
lw x10,4(sp)
lw x11,0(sp)
sub x10,x10,x11
ret
soma:
add x10,x10,x11
ret
soma3:
addi sp,sp, -4
sw x1,0(sp)
lw x10, 12(sp)
lw x11, 8(sp)
jal x1,soma
lw x11, 4(sp)
add x10,x10,x11
lw x1,0(sp)
addi sp,sp,12
sw x10, 0(sp)
ret
# EX7 - by Martim Bento
- Resolução
#Exercício 7
.data
.text
li x10, 7
jal fatorial
li x17, 1
ecall
li x17, 10
ecall
fatorial:
ble x10, zero, end #if (i==0) return 1;
#salvaguarda de contexto
addi sp, sp, -8
sw x1, 4(sp)
sw x18, 0(sp) #x18 � um saved register
mv x18, x10
addi x10, x10, -1
jal fatorial
mul x10, x10, x18
#reposi��o de contexto
lw x18, 0(sp)
lw x1, 4(sp)
addi sp, sp, 8
ret
end:
li x10, 1
ret
#para poder voltar a funcao mae
# EX8 - by Martim Bento
- Resolução
.data
.text
li x10, 7
li x11, 5
jal power
li x17, 1
ecall
li x17, 10
ecall
power:
addi sp, sp, -16
sw x1, 12(sp)
sw x18, 8(sp) #i
sw x19, 4(sp) #y
sw x20, 0(sp) #x
li x19, 1
mv x18, x11
mv x20, x10
loop:
ble x18, zero, end
mv x10, x19
mv x11, x20
jal multiplica
mv x19, x10
addi x18, x18, -1
j loop
end:
lw x1, 0(sp)
lw x18, 4(sp) #i
lw x19, 8(sp) #y
lw x20, 12(sp) #x
addi sp, sp, 16
ret
multiplica:
mul x10, x10, x11
ret