Lista de Exercício de Organização de Computadores
Por: Airton de Sousa • 29/8/2016 • Trabalho acadêmico • 2.043 Palavras (9 Páginas) • 392 Visualizações
Questão 1 (1 ponto): Mostre como o assembly MIPS acessa os ı́ndices de um vetor. Apresente um código em assembly MIPS que instancie um vetor de 5 posições e percorra o mesmo preenchendo as posições com valores informados pelo usuário.
.data
vetor: .space 20
tam: .word 5
str: .asciiz "\nDigite um valor: "
str2: .asciiz "\nResultado: "
.text
main: la $t0, vetor
la $t1, tam
lw $t1, 0($t1)
loop: beq $t1, $zero, fim
li $v0, 4
la $a0, str
syscall
li $v0, 5
syscall
sw $v0, 0($t0)
addi $t0, $t0, 4
addi $t1, $t1, -1
j loop
fim: la $t0, vetor
la $t1, tam
lw $t1, 0($t1)
li $v0, 4
la $a0, str2
syscall
loop2: beq $t1, $zero, fim2
li $v0, 1
lw $a0, 0($t0)
syscall
addi $t0, $t0, 4
addi $t1, $t1, -1
j loop2
fim2: li $v0, 10
syscall
Questão 2 (1 ponto): Qual o registrador MIPS que armazena o endereço de retorno de chamadas empilhadas? Mostre um código em assembly MIPS que mostre chamadas recursivas a uma função qualquer.
O registrador responsável por essa tarefa é o $ra. O código a seguir mostra o seu uso na função de Fibonacci:
.data
str: .asciiz "Digite um numero:\n"
str2: .asciiz "\nResultado:\n"
.text
main: li $v0, 4
la $a0, str
syscall # imprime a string str
li $v0, 5
syscall # le um valor
add $a0, $v0, $zero # salva em a0
jal fib
add $t0, $v0, $zero # salva o resultado em t0
li $v0, 4
la $a0, str2 # imprime a string str2
syscall
li $v0, 1
add $a0, $t0, $zero
syscall # imprime o resultado
li $v0, 10
syscall # finaliza o programa
fib: addi $sp, $sp, -12 # cria a pilha
sw $ra, 0($sp) # salva endereco de retorno,
sw $s0, 4($sp) # o argumento da funcao pai e
sw $s1, 8($sp) # o resultado da funcao irma
add $s0, $a0, $zero
bne $s0, $zero, naoeh0 # se s0 != 0 entao naoeh0
li $v0, 0 # fib(0) = 0
j sair
naoeh0: addi $t1, $zero, 1
bne $s0, $t1, naoeh1 # se s0 != 1 entao naoeh1
li $v0, 1 # fib(1) = 1
j sair
naoeh1: addi $a0, $s0, -1
jal fib # v0 = fib(a0 = s0 - 1)
add $s1, $v0, $zero # s1 = fib(s0 - 1)
addi $a0, $s0, -2
jal fib # v0 = fib(a0 = s0 - 2)
add $v0, $s1, $v0 # v0 = fib(s0-1) + fib(s0-2)
sair: lw $ra, 0($sp) # recupera os dados da pilha
lw $s0, 4($sp)
lw $s1, 8($sp)
addi $sp, $sp, 12 # oblitera a pilha
j $ra # volta para a funcao pai
Questão 3 (1 ponto): Implemente o código do SelectionSort em assembly MIPS para um vetor de 20 posições e valores inteiros distintos informados pelo usuário.
.data
vetor: .space 80
string: .asciiz "\nDigite um valor: "
string2: .asciiz "\nResultado: "
string3: .asciiz " "
tam: .word 20
.text
main: la $s0, vetor # s0 = &vetor
la $s1, tam # s1 = &tam
lw $s1, 0($s1) # s1 = tam
scan: beq $s1, $zero, fimscan # if s1 == 0 -> fimscan
li $v0, 4
la $a0, string
syscall # imprime string
li $v0, 5
syscall # le um valor
sw
...