Prévia do material em texto
Exercícios Capítulo 2 - Patterson 4ª Edição 1. Os seguintes problemas tratam da tradução de C para assembler RISC-V. Supor que as variáveis g, h, i, e j estão dadas e podem ser consideradas inteiros de 32 bits como declarado no programa C. a. f = g - h; b. f = g + (h - 5); 1.1 Para os comandos C acima, qual é o código correspondente do RISC-V? Use um número mínimo de instruções do assembler do RISC-V. 1.2 Para os comandos C acima, quantas instruções do RISC-V são necessárias para implementar o código C ? 2. Os problemas seguintes tratam a tradução de RISC-V para C. Supor que as variáveis f, g e h são dadas e poderiam ser consideradas inteiros de 32 bits como declarado no programa C. a. addi f, f, 4 b. add f, g, h add f, f, i 2.1 Para as instruções RISC-V acima, qual é o código correspondente em C? 2.2 Se as variáveis f, g e h têm os valores 1, 2 e 3, respectivamente, qual é o valor final de f? 3. Os seguintes problemas tratam da tradução de C para assembler RISC-V. Supor que as variáveis g, h, i, e j estão dadas e podem ser consideradas inteiros de 32 bits como declarado no programa C. a. f = f + g + h + i + j + 2; b. f = g - (f + 5); 3.1 Para os comandos C acima, qual é o código correspondente do RISC-V? Use um número mínimo de instruções do assembler do RISC-V. 3.2 Para os comandos C acima, quantas instruções do RISC-V são necessárias para implementar o código C ? 3.3 Se as variáveis f, g, h, i e j têm os valores 1, 2, 3, 4 e 5, respectivamente, qual é o valor final de f? 4. Os seguintes problemas tratam da tradução de C para assembler RISC-V. Supor que as variáveis g, h, i, e j estão associadas aos registradores s0, s1, s2, s3 e s4, respectivamente. Assuma que os endereços base dos arranjos A e B estão nos registradores s6 e s7. a. f = - g + h - A[4]; b. B[8] = A[i - j]; 4.1 Para os comandos C acima, qual é o código correspondente do RISC-V? Use um número mínimo de instruções do assembler do RISC-V. 4.2 Para os comandos C acima, quantas instruções do RISC-V são necessárias para implementar o código C ? 4.3 Para os comandos C acima, quantos registradores diferentes do RISC-V são necessários para implementar o código C ? 5. Os problemas seguintes tratam a tradução de RISC-V para C. Supor que as variáveis f, g, h, i e j estão associadas aos registradores s0, s1, s2, s3 e s4, respectivamente. Assuma que os endereços base dos arranjos A e B estão nos registradores s6 e s7, respectivamente. a. slli s2, s4, 1 add s0, s2, s3 add s0, s0, s1 b. add t0, s6, s0 add t1, s7, s1 lw s0, 0(t0) addi t2, t0, 4 lw t0, 0(t2) add t0, t0, s0 sw t0, 0(t1) 5.1 Para as instruções RISC-V acima, qual é o código correspondente em C? 5.2 Para as instruções RISC-V acima, reescreva o código assembler para minimizar o número de instruções (se possível) necessárias para executar a mesma função. 5.3 Quantos registradores são necessários para executar o código RISC-V acima ? Se você reescrevesse o código, qual seria o menor número de registradores possível ? 6. Nos seguintes problemas, nós estaremos investigando operações de memória no contexto de um processador RISC-V. A tabela abaixo mostra os valores de uma disposição armazenada na memória. a. Endereço Dados 12 1 8 6 4 4 0 2 b. Endereço Dados 16 1 12 2 8 3 4 4 0 5 6.1 Para as posições de memória na tabela acima, escreva o código de C para ordenar os dados do menor ao maior, colocando o mais baixo valor na menor posição de memória mostrada acima. Supor que os dados mostrados representam um arranjo de tipo inteiro. Assuma que os endereços são de byte e os dados consistem de 4 bytes cada (usar uma sequência de lw's e sw's para colocar os dados na ordem correta) 6.2 Para classificar o arranjo acima, quantas instruções são exigidas para o código do RISC-V? Se não é permitido você usar o campo imediato em lw e sw, quantas instruções dos RISC-V você precisa? 7. Os seguintes problemas exploram a tradução de números hexadecimais a outros formatos de número. a. 0x12345678 b. 0xbeadf00d 7.1 Traduza os números hexadecimais acima em decimais. 7.2 Mostre como os dados seriam ordenados nos formatos litte-endian e big-endian. Assuma que os dados são armazenados a partir do endereço 0. 8. Para o código abaixo, supor que os registradores s0, s1, s2, s3, contenhamos valores 10, 20, 30, e 40, respectivamente. Supor também que o registo s6 contem o valor 256, e que a memória contem os seguintes valores: Endereço Dado 256 100 260 200 264 300 Código: a. sub s0, s0, s1 sub s0, s0, s3 add s0, s0, s1 b. addi t0, s6, 4 add t1, s6, zero sw t1, 0(t0) lw t0, 0(t0) add s0, t1, t0 8.1 Encontre o valor de s0 no final da execução do código assembler. 8.2 Para cada instrução RISC-V, mostre o valor dos campos op, rs, e rt. Para instruções I-type, mostre o valor do campo imediato Imm, e para instruções R-Type, mostre o valor do campo rd. 9. Os seguintes problemas exploram conversões de números binários com sinal e sem sinal para números decimais. a. 1010 1101 0001 0000 0000 0000 0000 0010 b. 1111 1111 1111 1111 1011 0011 0101 0011 Para os números binários acima, realize as conversões para: • inteiro em complemento de 2 • inteiro sem sinal • hexadecimal 10. Os seguintes problemas tratam a extensão de sinal e overflow. Os registos s0 e s1 tem os valores segundo as indicações da tabela abaixo. Você será solicitado a executar uma operação dos RISC-V nestes registos e mostrar o resultado. a. s0 = 0x80000000, s1 = 0xD0000000 b. s0 = 0x00000001, s1 = 0xFFFFFFFF 10.1 Para os conteúdos dos registradores s0 e s1 como especificado acima, qual é o valor de t0 para o seguinte código do assembler: add t0, s0, s1 O resultado é o desejado ou houve overflow ? 10.2 Para os conteúdos dos registos s0 e s1 como especificado acima, qual é o valor de t0 para o seguinte código: sub t0, s0, s1 É o resultado em t0 o resultado desejado, ou houve overflow? 10.3 Para os conteúdos dos registradores s0 e s1 como especificado acima, qual é o valor de t0 para o seguinte código do assembler: add t0, s0, s1 add t0, t0, s0 Ocorreu overflow ? 11. Nos seguintes problemas, a tabela dos dados contem bits que representam o opcode de uma instrução. Você será pedido para traduzir as entradas no código assembler e determinar qual o formato da instrução RISC-V os bits representam. 11.1 Para as entradas binárias acima, que instrução representam? 11.2 Que tipo (I-type, R-type) de formato de instrução as entradas binárias acima representam? 11.3 Se as entradas binárias acima fossem bits de dados, que número hexadecimal representariam? 12. Nos problemas a seguir, a tabela de dados contém várias modificações que podem ser feitas na arquitetura do conjunto de instruções RISC-V. Você investigará o impacto dessas alterações no formato de instrução da arquitetura RISC-V. a. 128 registradores b. Número de instruções quatro vezes maior 12.1 Se o conjunto de instruções do processador dos RISC-V é modificado, o formato de instrução deve igualmente ser mudado. Para cada um das mudanças sugeridas acima, mostre o tamanho dos campos de instrução do formato R-type. Qual o número total de bits para cada instrução ? 12.2 Se o conjunto de instruções do processador dos RISC-V é modificado, o formato de instrução deve igualmente ser mudado. Para cada um das mudanças sugeridas acima, mostre o tamanho dos campos de instrução do formato I-type. Qual o número total de bits para cada instrução ? 12.3 Por que a mudança sugerida na tabela acima poderia diminuir o tamanho de um programa assembler do RISC-V? Por que podia a mudança sugerida na tabela acima aumentar o tamanho de um programa assembler do RISC-V? 13. Para este exercício, você explorará o alcance de instruções de salto nos RISC-V. Para os seguintes problemas, use os dados hexadecimais na tabela abaixo. a. 0x00001000b. 0xFFFFFF00 13.1 Se o PC está no endereço 0x00000000, quantos branch's (nenhuma instrução de jump) você precisa para chegar nos endereços acima? 13.2 Se o PC está no endereço 0x00000000, quantas instruções de jump (nenhuma instrução de branch ou jr) estão exigidas para obter os endereços acima ? 14. Neste exercício, você explorará constantes de 32 bits no RISC-V. Para os problemas abaixo, você estará usando os dados binários na tabela abaixo. 14.1 Escreva o código dos RISC-V que cria as constantes de 32 bits listadas acima e as armazenam no registrador t1. 14.2 Se o valor atual do PC é 0x00000000, pode você usar uma única instrução de salto para colocar no PC os endereços indicados na tabela acima? 14.3 Se o valor atual do PC é 0x00000600, pode você usar uma única instrução de branch para obter o endereço do PC segundo as indicações da tabela acima? 15 Escreva o algoritmo C abaixo em assembler do RISC-V. Passe o parâmetro para a função através do registrador a0 e retorne o valor no registrador a0. Assuma que a função só possa usar registradores salvos. Assuma que a pilha está vazia e que o stack pointer começam nos endereços 0x7FFF FFFC. Assuma as convenções de chamada de rotinas apresentadas em aula: Preservados Não preservados Registradores s0 a s11 Registradores temporários: t0 a t6 Stack pointer sp Argumentos: a0 a a7 Return address ra Pilha abaixo do stack pointer Pilha acima do stack pointer Frame Pointer (fp) e Global Pointer (gp) se utilizados main() { leaf_function(1); } int leaf_function (int f) { int result; result = f + 1; if (f > 5) return result; leaf_function(result); } Mostre o conteúdo da pilha a cada chamada da função.