(
pontos) Escreva um código em linguagem de montagem de processador MIPs equivalentes aos códigos em C abaixo:
#define n 500
int main()
{
int vetor[n];
int i,sum;
sum=0;
for( i=0; i<n; i++)
{
vetor[i] = i;
}
for( i=0; i<250; i++)
{
vetor[i] = vetor[i]+vetor[n-i];
}
}
#define n 500
int main()
{
int vetor[n];
int i,sum;
sum=0;
for( i=0; i<n; i++)
{
vetor[i] = i;
}
for( i=0; i<250; i++)
{
vetor[i] = vetor[i]+vetor[n-i];
}
}
Passo 1
O enunciado pede para converter o seguinte trecho em C:
#define n \(500\)
int main()
{
int vetor[n];
int i,sum;
sum \(=0\);
for (i \(=0\); i < n; i\(++\)) {
vetor[i] \(=\) i;
}
for (i \(=0\); i < \(250\); i\(++\)) {
vetor[i] \(=\) vetor[i] \(+\) vetor[n - i];
}
}
em código MIPS. Vamos alocar o array
(
inteiros
bytes) na pilha, usar registradores preservados (
para
,
para
) e registradores temporários (
–
) para os cálculos de endereço e soma.
Passo 2
Montamos o stack frame reservando
bytes (
para para salvar bytes). Guardamos
vetor
\(ra
, \)s\(0\)
e \(s\(1\)
, alinhado a
\)ra
, \(s\(0\)
e \)s\(1\)
no início do frame. A base de vetor
fica em \(16\)($sp)
.Passo 3
Inicializamos até
armazenando em cada posição de
sum \(=0\)
em \(s\(1\)
e i \(=0\)
em \)s\(0\)
, depois fazemos o primeiro loop de
vetor
o valor de i
: li $s\(1,0\) # sum \(=0\)
li $s\(0,0\) # i \(=0\)
loop\(1\):
bge $s\(0,500\),endloop\(1\)
sll \(t\(0\),\)s\(0,2\) # $t\(0=\) i * \(4\)
add \(t\(0\),\)t\(0\),$sp
addi \(t\(0\),\)t\(0,16\) # $t\(0=\) endereço de vetor[i]
sw \(s\(0,0\)(\)t\(0\)) # vetor[i] \(=\) i
addi \(s\(0\),\)s\(0,1\)
j loop\(1\)
endloop\(1\):
Passo 4
Reiniciamos até
: carregamos
i \(=0\)
em $s\(0\)
e fazemos o segundo loop de
vetor[i]
, carregamos vetor[n-i]
com n \(=500\)
, somamos e armazenamos de volta em vetor[i]
. li $s\(0,0\) # i \(=0\)
loop\(2\):
bge $s\(0,250\),endloop\(2\)
# endereço de vetor[i]
sll \(t\(0\),\)s\(0,2\)
add \(t\(0\),\)t\(0\),$sp
addi \(t\(0\),\)t\(0,16\)
lw \(t\(1,0\)(\)t\(0\)) # $t\(1=\) vetor[i]
# calcula índice n - i em $t\(2\)
li $t\(2,500\)
sub \(t\(2\),\)t\(2\),\(s\(0\) #\)t\(2=500\) - i
sll \(t\(2\),\)t\(2,2\)
add \(t\(2\),\)t\(2\),$sp
addi \(t\(2\),\)t\(2,16\) # $t\(2=\) endereço de vetor[\(500\)-i]
lw \(t\(3,0\)(\)t\(2\)) # $t\(3=\) vetor[\(500\)-i]
add \(t\(4\),\)t\(1\),\(t\(3\) #\)t\(4=\) vetor[i] \(+\) vetor[\(500\)-i]
sw \(t\(4,0\)(\)t\(0\)) # vetor[i] \(=\) $t\(4\)
addi \(s\(0\),\)s\(0,1\)
j loop\(2\)
endloop\(2\):
Passo 5
Restauramos os registradores salvos, ajustamos a pilha e retornamos:
lw \(s\(1,8\)(\)sp)
lw \(s\(0,4\)(\)sp)
lw \(ra,\(0\)(\)sp)
addi \(sp,\)sp,\(2016\)
jr $ra
Resposta
.data
.text
.globl main
main:
addi sp,-
# reserva frame
sw ()sp) # salva $ra
sw ()sp) # salva $s (índice i)
sw ()sp) # salva $s (sum)
.text
.globl main
main:
addi
sw ()sp) # salva $ra
sw ()sp) # salva $s
sw ()sp) # salva $s
li $s\(1,0\) # sum \(=0\)
li $s\(0,0\) # i \(=0\)
loop
:
bge sp
addi ,)t
sw ()t ) # vetor[i]
i
addi ,)s
j loop
endloop :
bge sp
addi ,)t
sw ()t
addi ,)s
j loop
endloop
li $s\(0,0\) # i \(=0\)
loop
:
bge sp
addi ,)t
lw ()t ) # $t
vetor[i]
bge sp
addi ,)t
lw ()t
li $t\(2,500\)
sub \(t\(2\),\)t\(2\),$s\(0\) # t\(2=500\) - i
sll \(t\(2\),\)t\(2,2\)
add \(t\(2\),\)t\(2\),$sp
addi \(t\(2\),\)t\(2,16\)
lw \(t\(3,0\)(\)t\(2\)) # $t\(3=\) vetor[\(500\)-i]
add \(t\(4\),\)t\(1\),\(t\(3\) #\)t\(4=\) vetor[i] \(+\) vetor[\(500\)-i]
sw \(t\(4,0\)(\)t\(0\)) # vetor[i] \(=\) $t\(4\)
addi \(s\(0\),\)s\(0,1\)
j loop\(2\)
endloop
:
lw \(s\(1,8\)(\)sp) # restaura $s\(1\)
lw \(s\(0,4\)(\)sp) # restaura $s\(0\)
lw \(ra,\(0\)(\)sp) # restaura $ra
addi \(sp,\)sp,\(2016\) # libera frame
jr $ra # retorna de main