Buscar

Microprocessadores - Procedimentos Recursivos

Prévia do material em texto

Aluno: Lucas Costa Vichinsky
Professor: Roberto Chura Chambi
QUESTÃO 1
Elabore:
a) Um procedimento chamado soma_ vetor que calcule a soma dos elementos
de um vetor v. O procedimento tem como parâmetro de entrada o endereço base do
vetor v (endereço do vetor v[0]) e o número de elementos do vetor. O parâmetro de
de saída é a soma de todos os elementos do vetor. (considere que o espaço que
ocupa um elemento do vetor é uma word).
b) O programa principal deve armazenar inicialmente o vetor no endereço
0x10010000 (tome como exemplo o seguinte vetor vetorG [] = {4,2,6,4,9}), salve
em dois registradores o endereço base da vetor e o número de elementos do vetor.
Após a inicialização do vetor deve fazer a chamada a procedimento do item (a), veja
no quadro um exemplo disto (qualquer expressão após o simbolo # é um
comentario e não faz parte do código).
RESOLUÇÃO
Como primeiro passo devemos estar cientes que utilizaremos a pilha para
realizar essa soma. O procedimento possui dois argumentos de entrada chamados
de $a0 e $a1 e possuirá um argumento de saída $v0. tendo esses fatores em
mente, a dedução do problema fica ainda mais fácil:
soma_vet
Endereço base
($a0)
Número de
termos da soma
($a1)
Soma total do
vetor
($v0)
Bom para o código do programa teremos o seguinte:
#Área de dados
.data 0x10010000
.vetorG: .word 4,2,6,9
#Área de código
.text
main: la $a0, vetorG
li $a1, 5
jal soma_vetor
move $t5, $v0
li $v0, 10
syscall
#Até esse ponto o programa está do jeto que foi dado na questão, a partir de agora
iremos fazer o que foi pedido na questão.
#a)
soma_vetor: addi $sp, $sp, (-4)
sw $ra, 0($sp)
addi $t2, $a0, 0
slti $t0, $a1, 1
beq $t0, $0, som
addi $sp, $sp, 4
jr $ra
som: addi $a1, $a1, -1
addi,$t2, $t2, 4
jal soma_vetor
lw $ra, 0($sp)
lw $t3, 0($t2)
add $v0, $v0, $t3
addi $t2, $t2, -4
addi $sp, $sp, 4
jr $ra
v[0]
v[1]
....
v[n]
O vetor v possui n componentes todas elas
com início no endereço base de v ($a0).
sum[v]=v[0]+v[1]+...+v[n]
Memória
Endereço
Base
(II)
(I)
(III)
(IV)
(V)
(I) O procedimento é inicializado, com isso
alguns passos foram tomados o primeiro é
carregar o conteúdo de $a0 em $t2 com o
intuito de manipular seus dados. O segundo
passo é definir um salto que pula para a o
endereço de som. Note que esse salto ele irá
pular quando a condição for FALSA. A
explicação virá a seguir. Aqui ele realiza o
primeiro salto
(II) No procedimento som o número de
elementos é subtraído em 1 e a posição do
ponteiro na memória para o vetor v é
apontada para o segundo elemento. Após isso
o vetor repete esse mesmo procedimento “n”
vezes até que o valor de $a1 seja igual a zero.
(III) No terceiro passo, serão carregados o
endereço de retorno que foi salvo em cima
que está apontando justamente uma instrução
depois de jal soma_vetor e será desempilhado
os registradores que está apontando para o
mesmo endereço. Ao realizar isso também é carregado o valor do vetor v[n] no
registrador $t3.
(IV) Após isso é realizada a soma entre o argumento de saída e o elemento de
ordem n do vetor, é subtraido 4 do valor do endereço de $t2 e é somado quatro do
ponteiro de pilha. O que está acontecendo é que quando se subtrai quatro do valor
de $t2 está se procurando o elemento anterior do vetor. Já ao $sp está
desempilhando a pilha com o intuito de procurar o endereço de retorno anterior.
Esse processo se repetirá “n” vezes.
(V) Por último é realizada a saída do procedimento, onde o ponteiro de pilha é
retornado à origem. E o procedimento retorna ao programa principal.
#b) na alternativa B o procedimento é mais simples:
#Trecho de procedimento
la $t2, vetorG
addi $t0, $0, 5
soma_vetor:addi $sp,$sp, -4
sw $ra, 0($sp)
slti $t1, $t0, 1
Beq $t1, $0, som
addi $sp, $sp, 4
som: addi, $t0, $t0, -1
addi, $t2, $t2, 4
jal soma_vetor
lw $ra, 0($sp)
lw $t3, 0($t2)
addi $v0, $t3, $v0
addi $sp, $sp, 4
jr $ra

Continue navegando