universidade federal fluminense

Propaganda
UNIVERSIDADE FEDERAL FLUMINENSE
INSTITUTO DE COMPUTAÇÃO
DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO
Sistemas de Computação 2016.2
Profa.: Simone Martins
Lista 1
Data de entrega 16/09/2016 por e-mail ([email protected]) com nome do grupo de ate 3 pessoas.
1.
Um programa P foi compilado com um compilador C1 e executado em um processador M1, e verificouse que foram executadas 500 instruções com a seguinte distribuição: 20% das instruções executadas
foram de armazenamento na memória, 25% para leitura de dados da memória, 15% para desvio, 30%
para aritmética com inteiros, 5% para deslocamento de inteiros e 5% para multiplicação de inteiros. As
instruções de leitura e escrita de dados da memória requerem 4 ciclos de relógio para sua execução, as de
desvio, 3 ciclos, as de aritmética e deslocamento 1 ciclo e a de multiplicação de inteiros 10 ciclos. O
relógio desta máquina possui frequência de 1GHz.
O mesmo programa foi recompilado com uma opção de otimização para converter multiplicações em
sequencias de deslocamento e soma com semântica equivalente. Verificou-se que, utilizando esta opção
de otimização na nova execução do programa P, cada instrução em 50% das instruções de multiplicação
executadas anteriormente foi traduzida como uma sequencia de 3 instruções deslocamento/soma. As
outras 50% continuaram a ser executadas como instruções de multiplicações de inteiros.
a) Calcule o valor médio de CPI apresentado na execução deste programa P, utilizando-se C1 sem e
com otimização.
b) Considerando-se a métrica tempo de execução, indique qual processo de compliacao possui um
melhor desempenho quando executando o programa P, com ou sem otimização ?
c) Considerando-se a métrica MIPS (Milhões de Instruções Por Segundo), qual das opções de
compilacao possui um melhor desempenho quando executando o programa P, com ou sem
otimização ?
2.
Dado o conjunto de bits abaixo
1010 0111 0000 1000 1100 0001 0000 0000
indique o que ele representa, assumindo-se que ele é:
a)
b)
c)
d)
3.
um inteiro em complemento a 2 (decimal)
um inteiro sem sinal (decimal)
um número ponto flutuante em precisão simples padrão IEEE 754 (decimal)
uma instrução MIPS
Considere o formato abaixo utilizado para representar números em ponto flutuante, utilizando-se as
mesmas premissas do padrão IEEE 754.
S
1
Expoente Mantissa Frac.
6
17
a) Mostre como será a representação de -10,125.
b) Calcule o valor em decimal dos seguintes números:
b.1) Maior número normalizado positivo
b.2) Menor número normalizado positivo
b.3) Maior número denormalizado positivo
b.4) Menor número denormalizado positivo
4.
As instruções na tabela abaixo não existem para o processador MIPS. Elas são chamadas pseudo
instruções e podem ser utilizadas pelo programador porque são traduzidas pelo montador para uma seqüência
de instruções MIPS existentes. Produza para cada uma delas uma seqüência de instruções MIPS reais que
executem o que está indicado na definição da instrução. Você pode utilizar o registrador $at como auxiliar, se
precisar. O identificador big indica um número específico que precisa de 32 bits para ser representado.
Pseudo instrução
move $t5, $t3
clear $t5
lw $t5, big ($t3)
addi $t5, $t3, big
beq $t5, big, L
ble $t5, $t3, L
Definição
$t5 = $t3
$t5 = 0
$t5=Memória[$t3+big]
$t5 = $t3+big
if ($t5 = big) go to L
if ($t5 <= $t3) go to L
4.
5.
Suponha que para implementar um controle de estoque de uma pequena livraria você utilize um
vetor de registros. Cada registro é uma estrutura implementada em C que contém o código do
livro, o titulo do livro, a quantidade total do livro em estoque, o valor unitário do livro e o nome da
editora.
Suponha que a seguinte estrutura de dados seja definida para este problema:
typedef struct registrolivro{
short codigo;
char titulo[80];
int quantidade;
float preco;
char editora[40];
} livro;
livro estoque[1000];
a)
As variáveis do tipo char ocupam 1 byte, do tipo short ocupam 2 bytes, do tipo float e do tipo int
ocupam 4 bytes, e do tipo ponteiro ocupam 4 bytes e os endereços das variáveis devem ser alinhados
de acordo com o espaço que elas ocupam. Indique como cada elemento do vetor será armazenado na
memória respeitando-se as restrições de alinhamento.
b) Suponha que você deseje implementar uma função em MIPS equivalente à função C mostrada
abaixo. Esta função recebe como parâmetros de entrada o endereço inicial do estoque, o código do
livro e a quantidade do livro que foi adquirida. A função atualiza a quantidade do livro em estoque.
Caso o código não tenha sido encontrado, o valor -1 deve ser retornado, caso contrário deve ser
retornado o valor 0.
int atualizaquant ( livro estoque[1000], short codigo, int quant);
{
int achou;
int i;
/* aponta para início do vetor */
i=0;
/* inicializa variável de controle da busca */
achou=0;
while ((i< 1000) && (achou==0)) {
if (estoque[i].codigo == codigo) {
/* achou livro com código, então atualiza quantidade no estoque */
estoque[i].quantidade=estoque[i].quantidade+quant;
achou=1;
}
else {
/* aponta para próximo elemento */
i=i+1;
}
}
/* caso código do livro não tenha sido encontrado, retorna valor -1 */
if (achou != 1)
return(-1)
else
return (0);
}
Assuma que o endereço inicial do vetor é passado no registrador $a0, o código do livro em $a1 e a
quantidade em $a2. O valor de retorno deve ser colocado em $v0. Você pode utilizar a pilha para
salvar valores que achar necessários.
6.
Considere os três procedimentos com algumas instruções especificadas como a seguir:
Procedimento A:
Segmento de texto
Segmento de dados
(último dado)
Endereço (hexadecimal)
0
4
...
24
...
FC
0
4
...
1C
Instrução
lw $al, Y
jal C
...
sw $s0,W
...
jr $ra
(Y)
Endereço (hexadecimal)
0
4
8
...
20
2FC
0
4
...
2C
Instrução
lw $a1, X
jal C
beq $v0, 0, L1
...
lw $t1,Z
jr $ra
(X)
(Z)
...
(K)
Endereço
0
...
3C
0
...
C
Instrução
sw $al, M
...
jr $ra
(M)
...
(T)
...
(W)
Procedimento B:
Segmento de texto
L1
Segmento de dados
(último dado)
Procedimento C:
Segmento de texto
Segmento de dados
(último dado)
Para cada um dos três procedimentos, complete a tabela abaixo referente ao código gerado pelo montador
para as instruções e dados mostrados acima. O montador assume que o segmento de texto e o segmento de
dados de cada procedimento iniciam no endereço 0. O registrador $gp é utilizado para endereçar as variáveis
localizadas no segmento de dados.
Cabeçalho
Segmento de texto
Nome
Tamanho de texto
Tamanho de dados
Endereço
Instrução
.
Segmento de dados
Endereço
Informação de relocação
Endereço
Tipo de instrução
Tabela de símbolos
Label
Endereço
Dependência
Após o procedimento de montagem os três procedimentos são ligados na ordem A, B e C. O segmento de
texto deve ser localizado a partir do endereço 400000, o segmento de dados a partir do endereço 10000000
(todos expressos em hexa) e o registrador $gp é carregado com o valor 10008000. Complete a tabela abaixo
com as informações geradas pelo ligador.
Cabeçalho
Segmento de texto
Nome
Tamanho de texto
Tamanho de dados
Endereço
Instrução
Segmento de dados
Endereço
Download