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