(5 pontos) Faça na linguagem de montagem do Mips um código para ler 96 valores inteiros do teclado e armazenar na memória de dados. Para ler um inteiro o valor em $v0 deve ser 5. Em seguida, os valores lidos que forem múltiplos de 4 devem ser atribuídos o valor -1.
Passo 1
O enunciado pede para criar um programa em assembly MIPS que:
. Leia
valores inteiros do teclado (usando syscall de código
).
. Armazene esses
valores em um vetor na seção de dados.
. Depois de lidos, percorra o vetor e, para cada elemento múltiplo de
, substitua seu valor por
.
Para resolver, vamos criar:
Para resolver, vamos criar:
- Na seção de dados, um espaço para
words. - Um loop de leitura que usa syscall
e armazena cada inteiro. - Um segundo loop que testa o bit menos significativo (usando
andi
com máscara) para detectar múltiplos de e, se for caso, faz sw -\(1\)
.
Passo 2
Definimos na seção de dados um vetor de
inteiros inicialmente não inicializados:
.data
vetor: .space \(384\) # \(96\) * \(4\) bytes \(=384\) bytes
Aqui words.
vetor
aponta ao primeiro byte do espaço destinado às
Passo 3
Na seção de texto, fazemos o loop de leitura:
.text
.globl main
main:
la \(t\(2\), vetor #\)t\(2\) será o ponteiro corrente de escrita
li $t\(3\), \(96\) # contador de quantos ler (\(96\))
leitura:
li $v\(0\), \(5\) # syscall \(5= read_int\)
syscall
sw \(v\(0\), \(0\)(\)t\(2\)) # armazena inteiro lido em vetor[i]
addiu \(t\(2\),\)t\(2\), \(4\) # avança ponteiro para próxima posição
addiu \(t\(3\),\)t\(3\), -\(1\) # decrementa contador
bgtz $t\(3\), leitura # se ainda não leu \(96\), continua
Passo 4
Agora percorremos o vetor para substituir múltiplos de
por
:
la \(t\(2\), vetor # reseta\)t\(2\) ao início de vetor
li $t\(3\), \(96\) # contador de \(96\) posições
processa:
lw \(t\(4\), \(0\)(\)t\(2\)) # carrega vetor[i] em $t\(4\)
andi \(t\(5\),\)t\(4\), \(3\) # testa os \(2\) bits menos significativos
bne \(t\(5\),\)zero, prox # se !\(=0\), não é múltiplo de \(4\)
li $t\(4\), -\(1\) # carga valor -\(1\)
sw \(t\(4\), \(0\)(\)t\(2\)) # armazena -\(1\) em vetor[i]
prox:
addiu \(t\(2\),\)t\(2\), \(4\) # avança ponteiro
addiu \(t\(3\),\)t\(3\), -\(1\) # decrementa contador
bgtz $t\(3\), processa # repete até processar \(96\)
Passo 5
Por fim, encerramos o programa:
li $v\(0\), \(10\) # syscall \(10=\) exit
syscall
Resposta
.data
vetor: .space # espaço para
inteiros
vetor: .space
.text
.globl main
main:
# Loop de leitura de inteiros
la $t , vetor
li $t ,
leitura:
li $v ,
syscall
sw , ()t
)
addiu ,)t ,
addiu ,)t , -
bgtz $t , leitura
# Loop de leitura de
la $t
li $t
leitura:
li $v
syscall
sw ,
addiu ,)t
addiu ,)t
bgtz $t
# Loop de processamento: múltiplos de \(4\) viram -\(1\)
la $t\(2\), vetor
li $t\(3\), \(96\)
processa:
lw , ()t
)
andi ,)t ,
bne ,)zero, prox
li $t , -
sw , ()t
)
prox:
addiu ,)t ,
addiu ,)t , -
bgtz $t , processa
lw ,
andi ,)t
bne ,)zero, prox
li $t
sw ,
prox:
addiu ,)t
addiu ,)t
bgtz $t
# Exit
li $v\(0\), \(10\)
syscall