Prova P4/PS Disciplina: Organização de Computadores-EC Professor: Ney Laert Vilar Calazans Aluno: 30/novembro/2016 1. [3 pontos] Dado o programa em linguagem de montagem do MIPS abaixo, gere código objeto para as linhas 3, 6 e 8 dele. Inicie por computar o endereço onde cada instrução começa anotando este na coluna correspondente. Note que o endereço inicial do trecho, em hexadecimal é 0x00400068. Cuidado com os pressupostos de geração de código para deslocamentos em cada instrução, bem como com a possibilidade de existência de pseudo-instruções no trecho, e sua correspondência com instruções reais. Número de Linha 1 2 3 4 5 6 7 8 Rótulo loop3: blez lw beq addiu addiu j rstflag: li endl3: beq Instrução $t2,endl3 $t1,0($s2) $t0,$t1, rstflag $s2,$s2, 4 $t2,$t2, -1 loop3 $t9,0 $t9,$zero,loop3 Endereço inicial do código objeto Código objeto 0x00400068 2. (3,0 pontos) Verdadeiro ou Falso. Abaixo aparecem 10 afirmativas. Marque com V as afirmativas verdadeiras e com F as falsas. Se não souber a resposta correta, deixe em branco, pois cada resposta correta vale 0,3 pontos, mas cada resposta incorreta desconta 0,2 pontos do total positivo de pontos. Não é possível que a questão produza uma nota menor do que 0 pontos. a) ( ) O código objeto 0x11090003 do MIPS corresponde a uma instrução beq que quando saltar, o faz necessariamente para uma instrução que está três instruções antes (acima) deste beq. b) ( ) Dois processadores da família x86 da Intel, o Pentium-Pro e o Pentium-II possuem barramentos de dados de 32 bits e barramentos de endereços de 36 bits. Como o endereçamento de memória destes processadores é a byte, seu mapa de memória é de 64 Gigabytes. c) ( ) Suponha que o registrador $t0 do MIPS contém o valor 0xFFFFFFFF. Dado este fato, executar a instrução addiu $t0,$t0,2 ou a instrução andi $t0,$t0,0x1 tem como resultado escrever exatamente o mesmo valor final em $t0. d) ( ) O modo de endereçamento pseudo-absoluto no MIPS usa um campo de 26 bits para referenciar um endereço do mapa de memória deste processador. Assim, este modo permite referenciar qualquer endereço de uma região correspondente a 1/32 (um 32 avos) de todo o mapa de memória do MIPS. e) ( ) A instrução addi $t1,$zero,0xFFFE seguida da instrução or $t0,$t0, $t1 deixa em $t0 um número negativo. f) ( ) A codificação lb $t0,xuxu corresponde não a uma instrução do MIPS, mas a uma pseudoinstrução equivalente a duas instruções reais do processador. g) ( ) Uma instrução no MIPS sempre referencia explicitamente de 1 a 3 operandos. h) ( ) Se a área de dados de um programa em linguagem de montagem do MIPS é composta por uma cadeia de 399 caracteres ASCIIE declarada com a diretiva .asciiz e um vetor de 150 inteiros armazenado na forma mais natural oferecida pelo processador, esta área necessita de exatamente 1.000 bytes para seu armazenamento. i) ( ) Suponha que se executa um programa MIPS com a sequência de instruções lui $t0,0xD000; slt $t1,$t0,$zero; beq $t1,$zero,xuxu. Assuma que o rótulo xuxu não se refere à instrução imediatamente após a instrução beq desta sequência. A instrução executada após executar o beq será aquela associada à posição de memória identificada pelo rótulo xuxu, e não a que segue o beq. j) ( ) No MIPS o código objeto da instrução jalr $k0,$t8 é 0x0300D009. Rs 3. [4 pontos] Considere a organização do bloco de dados multiciclo, que dá suporte à execução de um subconjunto da arquitetura do conjunto de instruções do MIPS. Considere também como realizadas as modificações necessárias nesta organização para dar suporte à instrução LH, similar a instrução usada no trabalho TP3 deste semestre. Responda às questões abaixo. end_mul quociente Rs Decodificação DIV rst_md 11111 IR[20:16] IR[15:11] i adD NPC PC wpc I/ salta_in pc=i_address IR[25:21] Memória de Instruções dtpc IR[20:16] CY1 R1 Banco de Registradores Rs AdRP2 R2 wreg Rt i Hi Hi x“000000” & data[7:0] i i outalu RALU walu Rt op2 i instruction i i IR[15:0] EXT SINAL << 2 IR[25:0] IR[15:0] “0000” & IR[25:0] & “00” cte_im i Rs Rt EXT ZERO MDR wmdr data rw ce IMED IMED CY2 ce rw bw whilo Rs CY2 DataRP2 IR[20:16] produto(63 downto 32) npc op1 AdRP1 DataRP1 i IR_IN=IR=IR_OUT IR resto comparador CY1 pc=i_address RIN AdWP DataWP adS +4 MULT ALU NPC inc_pc produto(31 downto 0) rst_md i MDR i Rt MDR_int RESULT Memória de Dados NPC npc=NPC_OUT=NPC Lo Lo RALU=d_address wreg wpc CY1 whilo rw CY2 rst_md ce walu bw wmdr whilo D_Lo end_div IR i D_Hi Máquina de Estados salta_in= salta= salta_out Rt Rt a) [1 ponto] Marque no desenho acima e/ou descreva com palavras todos os caminhos do bloco de dados efetivamente usados pela instrução LH Rt, Offset(Rs). Isto significa marcar e/ou descrever em texto todos os caminhos por onde passa informação útil relevante à execução da instrução, ou seja, dados e sinais de controle que esta instrução realmente necessita manipular durante sua execução. b) [1 ponto] Diga qual operação é executada pela unidade lógica-aritmética (ALU) no terceiro ciclo de relógio da instrução LH Rt, Offset(Rs), justificando sua resposta. c) [1 ponto] No processo de execução da instrução LH Rt, Offset(Rs) existe alguma modificação de hardware necessária no bloco de dados (BD) do processador? Se sim, explique qual. Em qualquer caso, explique os motivos que levam à modificação ou não do BD. d) [1 ponto] Suponha que se deseja modificar o processador para poder executar esta instrução em apenas 4 ciclos de relógio. Descreva a modificação do bloco de dados que poderia viabilizar esta otimização. Lista de associação de números e mnemônicos para os registradores do MIPS Número (Decimal) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Nome $zero $at $v0 $v1 $a0 $a1 $a2 $a3 $t0 $t1 $t2 $t3 $t4 $t5 $t6 $t7 Número (Decimal) 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Nome $s0 $s1 $s2 $s3 $s4 $s5 $s6 $s7 $t8 $t9 $k0 $k1 $gp $sp $fp $ra Prova P4/PS Disciplina: Organização de Computadores-EC Professor: Ney Laert Vilar Calazans Aluno: 30/novembro/2016 Gabarito 1. [3 pontos] Dado o programa em linguagem de montagem do MIPS abaixo, gere código objeto para as linhas 3, 6 e 8 dele. Inicie por computar o endereço onde cada instrução começa anotando este na coluna correspondente. Note que o endereço inicial do trecho, em hexadecimal é 0x00400068. Cuidado com os pressupostos de geração de código para deslocamentos em cada instrução, bem como com a possibilidade de existência de pseudo-instruções no trecho, e sua correspondência com instruções reais. Número de Linha 1 2 3 4 5 6 7 8 Instrução Endereço inicial do código objeto $t2,endl3 $t1,0($s2) $t0,$t1, rstflag $s2,$s2, 4 $t2,$t2, -1 loop3 $t9,0 $t9,$zero,loop3 0x00400068 0x0040006c 0x00400070 0x00400074 0x00400078 0x0040007C 0x00400080 0x00400084 Rótulo loop3: blez lw beq addiu addiu j rstflag: li endl3: beq Código objeto 0x11090003 0x0810001A 0x1320FFF8 Solução da Questão 1 Partindo do endereço inicial dado, geram-se os endereços de quatro em quatro para cada linha do programa. A seguir, pode-se gerar o código objeto das instruções solicitadas. a) (1,0 ponto) Linha 3: beq $t0, $t1, rstflag. O formato da instrução beq é: beq rs,rt, label 0x4 rs rt offset Número de bits/campo: 6 5 5 16 O código objeto é então: 000100 (4 em seis bits) concatenado com o endereço do Rs no banco ($t0=8 ou 01000 em binário), concatenado com o endereço do Rt no banco, 01001 ($t1=9), concatenado com o offset. Segundo a definição da arquitetura, este é o valor de 16 bits que corresponde à distância, em instruções, da linha abaixo do beq até a linha do rótulo rstflag ou seja, 3, ou em binário 0000 0000 0000 0011. Juntando os 32 bits (000100 01000 01001 0000 0000 0000 0011) e traduzindo-os de 4 em 4 em valores hexadecimais, obtém-se 0x11090003, no endereço da memória de instruções 0x00400070. b) (1,0 ponto) Linha 6: j loop3. O formato da instrução j é: j label 2 address Número de bits/campo: 6 26 O código objeto é então: 000010 (2 em seis bits) concatenado com um valor de 26 bits, que corresponde ao bits 27 a 2 do endereço do rótulo loop3. Como loop3 está na linha cujo endereço associado é 0x00400068, basta pegar os bits 27 a 2 deste valor de 32 bits. Juntando os 32 bits, tem-se (000010 00000100000000000000011010) e traduzindo-os de 4 em 4 em valores hexadecimais, obtém-se 0x0810001A, no endereço da memória de instruções 0x0040007C. c) (1,0 pontos) Linha 8: beq $t9, $zero, loop3. beq 0x4 Número de bits/campo: 6 O formato da instrução beq é: rs,rt, label rs rt offset 5 5 16 O código objeto é então: 000100 (4 em seis bits) concatenado com o endereço do Rs no banco ($t9=25 ou 11001 em binário), concatenado com o endereço do Rt no banco, 00000 ($zero=0), concatenado com o offset. Segundo a definição da arquitetura, este é o valor de 16 bits que corresponde à distância, em instruções, da linha abaixo do beq até a linha do rótulo loop3. Como loop3 está antes desta linha o valor é negativo, e vai ser -8, ou em binário 1111 1111 1111 1000. Juntando os 32 bits (000100 11001 00000 1111111111111000) e traduzindo-os de 4 em 4 em valores hexadecimais, obtém-se 0x1320FFF8, no endereço da memória de instruções 0x00400084. Fim da Solução da Questão 1 2. (3,0 pontos) Verdadeiro ou Falso. Abaixo aparecem 10 afirmativas. Marque com V as afirmativas verdadeiras e com F as falsas. Se não souber a resposta correta, deixe em branco, pois cada resposta correta vale 0,3 pontos, mas cada resposta incorreta desconta 0,2 pontos do total positivo de pontos. Não é possível que a questão produza uma nota menor do que 0 pontos. Solução da Questão 2 a) (F) O código objeto 0x11090003 do MIPS corresponde a uma instrução beq que quando saltar, o faz necessariamente para uma instrução que está três instruções antes (acima) deste beq. Falso. Trata-se de um beq, pois os seis primeiros bits de 0x11090003 são 000100, que é o opcode do beq. Contudo, o deslocamento (offset) está nos 16 últimos bits do código objeto, e vale 0x0003, um número positivo. Logo, o salto é para baixo e não para cima. b) (V) Dois processadores da família x86 da Intel, o Pentium-Pro e o Pentium-II possuem barramentos de dados de 32 bits e barramentos de endereços de 36 bits. Como o endereçamento de memória destes processadores é a byte, seu mapa de memória é de 64 Gigabytes. Verdadeiro, pois com 36 bits no barramento de endereços o mapa terá 2*36=64Giga endereços. Como cada endereço contém 1 byte (endereçamento a byte) o tamanho do mapa é 64Gbytes. c) (V) Suponha que o registrador $t0 do MIPS contém o valor 0xFFFFFFFF. Dado este fato, executar a instrução addiu $t0,$t0,2 ou a instrução andi $t0,$t0,0x1 tem como resultado escrever exatamente o mesmo valor final em $t0. Verdadeiro. O valor inicial em $t0 é -1 em complemento de 2. Ora somar 2 a -1 gera em $t0 o valor 1. Por outro lado, a instrução andi com uma máscara 1 em 16 bits usa extensão de 0 para gerar 1 em 32 bits. O and deste valor com qualquer coisa gera em $t0 um valor onde todos os bits são zero, exceto o bit 0 que é uma cópia do bit 0 do valor original, que era 1. Isto vai gerar o mesmo número 0x00000001 em $t0. d) (F) O modo de endereçamento pseudo-absoluto no MIPS usa um campo de 26 bits para referenciar um endereço do mapa de memória deste processador. Assim, este modo permite referenciar qualquer endereço de uma região correspondente a 1/32 (um 32 avos) de todo o mapa de memória do MIPS. Falso. Os 26 bits são sempre concatenados com dois bits 00 à direita e com os 4 bits mais significativos do PC à esquerda. Assim o número de endereços abrangidos é 2*26, que corresponde a 1/64 do mapa de memória. Contudo, os endereços sempre são múltiplos de 4. Assim estes 1/64 dos endereços vão de 4 em 4 em uma região de tamanho total de 1/16 do mapa de memória. e) (V) A instrução addi $t1,$zero,0xFFFE seguida da instrução or $t0,$t0, $t1 deixa em $t0 um número negativo. Verdadeiro. A addi usa extensão de sinal. Assim, ela coloca em $t1 o resultado da soma 0x00000000(conteúdo de $zero)+0xFFFFFFFE(0xFFFE com sinal estendido)=0xFFFFFFFE. Ao se fazer o or do valor em $t1 com o que quer que exista em $t0, todos os bits que estão em 1 de $t1 ou em $t0 ficarão em 1. Logo, dependendo do conteúdo inicial de $t0, apenas um de dois valores pode resultar escrito em $t0: 0xFFFFFFFE ou 0xFFFFFFFF, e ambos são números negativos. f) (V) A codificação lb $t0,xuxu corresponde não a uma instrução do MIPS, mas a uma pseudoinstrução equivalente a duas instruções reais do processador. Verdadeiro. Como não foi especificado um deslocamento, será gerada uma instrução lui para carregar a parte alta do endereço xuxu em $at e este será o registrador base do lb, que terá como deslocamento a parte baixa do endereço xuxu. As duas instruções são lui $at,parte alta de xuxu; lb $t0, parte baixa de xuxu($at). g) (F) Uma instrução no MIPS sempre referencia explicitamente de 1 a 3 operandos. Falso. Um contra-exemplo é a instrução syscall, que não tem operandos explícitos. h) (V) Se a área de dados de um programa em linguagem de montagem do MIPS é composta por uma cadeia de 399 caracteres ASCIIE declarada com a diretiva .asciiz e um vetor de 150 i) j) inteiros armazenado na forma mais natural oferecida pelo processador, esta área necessita de exatamente 1.000 bytes para seu armazenamento. Verdadeiro. Usando a diretiva asciiz, uma cadeia ocupa exatamente um caracter a mais que o texto que ela referencia, devido ao acréscimo automático do caractere NULL para indicar o fim da cadeia. O formato mais natural para representar inteiros no MIPS é usar a diretiva .word, que reserva 32 bits ou 4 bytes por numeral inteiro. Assim, a área de dados necessária é 399+1+250*4=1000 bytes. (F) Suponha que se executa um programa MIPS com a sequência de instruções lui $t0,0xD000; slt $t1,$t0,$zero; beq $t1,$zero,xuxu. Assuma que o rótulo xuxu não se refere à instrução imediatamente após a instrução beq desta sequência. A instrução executada após executar o beq será aquela associada à posição de memória identificada pelo rótulo xuxu, e não a que segue o beq. Falso. A instrução lui deixa em $t0 o valor 0xD0000000, que corresponde a um número negativo em complemento de 2, pois seu bit 31 é 1. Logo, a instrução slt, que faz uma comparação de valores considerando os mesmos como inteiros escreve em $t1 o valor 0x00000001, pois $t0 é menor que 0. Finalmente, a condição do beq será falsa, e não há salto. (V) No MIPS o código objeto da instrução jalr $k0,$t8 é 0x0300D009. Verdadeiro. O formato da instrução jalr usada aqui é: jalr 0x0 rd, rs rs 0 rd 0 9 Número de bits/campo: 6 5 5 5 5 6. O código objeto é então: 000000 (0 em seis bits) concatenado com o endereço do rs no banco ($t8=24 ou 11000 em binário), concatenado com 5 bits em 0, concatenado com o endereço do rd no banco, 11010 ($k0=26), concatenado com 5 bits em 0 e concatenado com 001001 (9 em seis bits). Juntando os valores dos seis campos tem-se (000000 11000 00000 11010 00000 001001). Agrupando os bits de 4 em 4 obtém-se o código objeto no formato desejado, que é 0x0300D009. Fim da Solução da Questão 2 3. [4 pontos] Considere a organização do bloco de dados multiciclo, que dá suporte à execução de um subconjunto da arquitetura do conjunto de instruções do MIPS. Considere também como realizadas as modificações necessárias nesta organização para dar suporte à instrução LH, similar a instrução usada no trabalho TP3 deste semestre. Responda às questões abaixo. D_Lo end_mul end_div IR quociente Rs Decodificação DIV rst_md RESULT 11111 IR[20:16] IR[15:11] i adD dtpc PC wpc I/ salta_in pc=i _address DataRP1 R1 Rs CY1 IR[20:16] DataRP2 R2 wreg i CY2 AdRP2 Rt x“000000” & data[7:0] outalu RALU walu Rt op2 i instruction i i IR[15:0] EXT SINAL << 2 IR[25:0] IR[15:0] “0000” & IR[25:0] & “00” EXT ZERO cte_im i data Rs Rt salta_in= salta= salta_out Rt MDR wmdr Sig_extend(Data( 15 downto 0)) rw ce IMED IMED CY2 ce rw bw Rs i Banco de IR_IN=IR =IR_OUT R egistradores IR Hi whilo i op1 AdRP1 IR[25:21] i Hi produto(63 downto 32) npc adS IR[20:16] resto c omparador pc =i_address M emória de Instruções CY1 RIN AdWP DataWP NPC MULT ALU NPC inc_pc +4 produto(31 downto 0) rst_md i MDR i Rt MDR_int NPC npc =NPC_OUT=NPC Lo Lo Memória de Dados wreg wpc CY1 whilo rw CY2 rst_md ce walu bw wmdr whilo RALU=d_ address i D_Hi Máquina de Estados Rt a) [1 ponto] Marque no desenho acima e/ou descreva com palavras todos os caminhos do bloco de dados efetivamente usados pela instrução LH Rt, Offset(Rs). Isto significa marcar e/ou descrever em texto todos os caminhos por onde passa informação útil relevante à execução da instrução, ou seja, dados e sinais de controle que esta instrução realmente necessita manipular durante sua execução. b) [1 ponto] Diga qual operação é executada pela unidade lógica-aritmética (ALU) no terceiro ciclo de relógio da instrução LH Rt, Offset(Rs), justificando sua resposta. c) [1 ponto] No processo de execução da instrução LH Rt, Offset(Rs) existe alguma modificação de hardware necessária no bloco de dados (BD) do processador? Se sim, explique qual. Em qualquer caso, explique os motivos que levam à modificação ou não do BD. d) [1 ponto] Suponha que se deseja modificar o processador para poder executar esta instrução em apenas 4 ciclos de relógio. Descreva a modificação do bloco de dados que poderia viabilizar esta otimização. Solução da Questão 3 a) (1,0 ponto). Ver desenho. Depois da busca da instrução, os bits 25:21 do IR são usados para endereçar a Porta de leitura 1 do banco de registradores, o que provoca a recuperação de uma valor do banco, que é colocado no registrador Rs. Este valor vai para a entrada superior da ALU. Na entrada inferior da ALU chega o deslocamento, proveniente dos bits 15:0 do IR, que passa pelo bloco de extensão de sinal, o registrador IMED e dois multiplexadores. A ULA soma estes valores, gerando o endereço de leitura que é enviado à memória ao ser armazenado no registrador RALU. A memória é lida e o dado no endereço gerado é mandado de volta ao processador. Na entrada do processador, usa-se apenas os 16 bits inferiores do dado de 32 bits lido, que tem seu sinal estendido para gerar um valor de 32 bits. Este é então armazenado no registrador MDR. Para finalizar, o conteúdo do MDR é escrito no banco, no registrador endereçado pelos bits 20:16 do IR (endereço do registrador Rt). b) (1,0 ponto). A operação executada é uma soma, conforme explicado no item a). c) (1,0 ponto). Sim, é necessário acrescentar um módulo que faça a extensão de sinal dos 16 bits inferiores do barramento de dados (sinal data(15 downto 0). A saída deste módulo constitui uma terceira entrada do mux que gera a entrada do registrado MDR. O mux em questão deve obviamente ser modificado também. d) (1,0 ponto). Isto é facilmente realizado, embora tenha um custo em termos de desempenho. Uma solução é fazer com que a saída do novo módulo de extensão de sinal não vá para o mux que gera a entrada do MDR, e sim para o mux que gera o sinal result. Claro que o bloco de controle deve ser modificado para gerar os sinais de controle de acordo. Fim da Solução da Questão 3