Baixe o app para aproveitar ainda mais
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
Compartilhar