Вы находитесь на странице: 1из 4

Lista de Exercícios de Revisão da I Unidade

Universidade Federal Rural do Semiarido


Departamento de Ciências Exatas e Naturais
Ciência da Computação
Prof. Sílvio Fernandes

Lista de Exercícios de Revisão da I Unidade

Utilize o MARS para todos os exercícios


1. Realize a tradução de C para MIPS. Considere que as variáveis f e g sejam dadas
e possam ser consideradas inteiros de 32 bits, conforme declarado em um
programa C.
a) f = -g -f;
b) f = g + (-f -5);
2. Realize a tradução de C para MIPS. Suponha que as variáveis f, g, h, i e j sejam
atribuídas aos registradores $s0, $s1, $s2, $s3 e $s4, respectivamente. Considere
que o endereço de base dos arrays A e B estejam nos registradores $s6 e $s7,
respectivamente.
a) f = g + h + B[4];
b) f = g – A[B[4]];
c) O item (a) possui 2 somas e o item (b) 1 subtração, se soma e subtração
leva a mesma quantidade de ciclos podemos dizer que o item (b) tem
melhor desempenho? Justifique.
3. Os registradores $s0 e $s1 mantêm os valores mostrados na tabela a seguir. Você
deverá executar uma assembly de instrução de código MIPS sobre os
registradores e mostrar o resultado.
I $s0 = 0x80000000 hex $s1 = 0xD0000000 hex
II $s0 = 0x00000001 hex $s1 = 0xFFFFFFFF hex

a) Qual o valor de $t0 para o código: add $t0, $s0, $s1


b) O resultado em $t0 é o desejado ou houve overflow?
c) No MARS, qual o valor dos registradores EPC e CAUSE no Copro 0? O que
esses valores significam?
4. A seguir, são apresentadas duas funções em C (multiplo_1 e multiplo_2) que são
equivalentes. O valor de n pode ser um inteiro qualquer e o valor de m deve ser
um número de potência de 2 (1, 2, 4, 8, ...). Traduza as duas funções para
assembly MIPS em dois programas separados (p1 e p2).

Prof. Sílvio Fernandes Página 1


Lista de Exercícios de Revisão da I Unidade

int multiplo_1 (int n, int m){


int x = 0;
for(int i=0; i < m; i++)
x = x + n;
return x;
}
int multiplo_2 (int n, int m){
int x = n << m;
return x;
}

a) Execute os dois programas passando os mesmos parâmetros e veja os


resultados. Agora conte a quantidade de instruções de cada um e calcule
o CPI médio de cada programa considerando que cada instrução leva 1
ciclo. Qual programa tem melhor desempenho?
b) No MARS clique no menu “Tools -> Instruction Statistics” e depois no
botão “Connect to MIPS”. Em seguida execute cada um dos programas e
analise a quantidade de instruções. Realize o mesmo cálculo do item
anterior e compare as respostas.
c) Considerando que os programas executaram no mesmo processador
(velocidade de clock é mantida) e que instruções de acesso a memória
leva 2 ciclos enquanto que as outras instruções levam 1 ciclo e que o
tempo de ciclo é 5 ns, qual programa apresenta melhor desempenho e
em quanto é melhor. Utilize os dados da ferramenta “Instruction
Statistics”.
d) Agora considerando que o processador executa a 700 MHz e que a
instrução de shift é 2 vezes mais demorada que a de soma. Um programa
sempre terá melhor desempenho que o outro, utilizando os dados da
ferramenta “Instruction Statistics”? Se não, em que situações um é
melhor que outro e vice-versa?
5. Simule a execução do código a seguir no MARS:

Prof. Sílvio Fernandes Página 2


Lista de Exercícios de Revisão da I Unidade

.data
i: .word 5 # valor 5 armazenado em i
msg_result: .asciiz "O reultado é "

.text
main:
# carregando variaveis
la $t0, i # endereco de "teste" em $t0
lw $a0, 0($t0) # carrega o valor de "i" em $a0
jal func

#salvando o resulado em $s0


add $s0, $v0, $zero # resultado final

#imprime o resultado
la $a0, msg_result # endereco de "msg_result" em $a0
li $v0, 4 # especiica o servico de impressao de string
syscall # faz a chamada de system para imprimir a string

add $a0, $s0, $zero # resultado final


li $v0, 1 # especifica o servido de impressao de inteiros
syscall # imprime o valor de resultado

# Terminando o programa
li $v0, 10 # system call for exit
syscall # we are out of here.

####################
# Funcao
###################
func:
addi $sp, $sp, -8 #ajusta pilha para 2 itens
sw $ra, 4($sp) # salva o endereço de retorno
sw $a0, 0($sp) # salva o argumento n
#Condição
slti $t0, $a0, 1 # teste para n < 1
beq $t0, $zero, L1 # se n>=1 vai para L1
#Senão for maior que 1, devolve o valor 1.
addi $v0, $zero, 1 # retorna 1
addi $sp, $sp, 8 # retira 2 itens da pilha
jr $ra #retorna para depois de jal
#Se for maior que 1
L1: addi $a0, $a0, -1 #arg1 = n – 1;
jal func #chama func(n-1);
#Restaurando registradores.
#A próxima instrução é onde func retorna.
lw $a0, 0($sp) #retorna de jal: restaura n
lw $ra, 4($sp) #restaura endereço de retorno
addi $sp, $sp, 8 #ajusta stack pointer
a) Quais valores são colocados na pilha?
#Devolvendo o novo $v0
mul $v0, $a0, $v0 # retorna n * func( n - 1)
jr $ra # retorna para o procedimento que o chamou
Prof. Sílvio Fernandes Página 3
Lista de Exercícios de Revisão da I Unidade

b) Quais são os endereços de memória (na ordem que são usados) os dados
colocados na pilha são armazenados?
c) Quais os valores dos registradores $sp, $ra e $pc em cada
armazenamento na pilha?
d) O que muda se o valor da variável “i”, no início do programa, mudar para
10?

Prof. Sílvio Fernandes Página 4

Вам также может понравиться