ARQUITECTURA DE COMPUTADORES P. Exercícios de Testes e Exames Problema 24: [Exame de Recurso de 27/7/01] Converta o seguinte código C para o código MIPS. Suponha que k corresponde ao registo $s0 e que o array de palavras A começa no endereço de memória 0xa0000000: Switch(k) { case 0: A[10]= A[10]+10; break; otherwise: A[10]= A[10]+20; break; } Problema 25: [Exame de Recurso de 27/7/01] Dado um segmento de código MIPS; a i, j e k correspondem os registos $s3, $s4 e $s5 e o array de words A começa no endereço indicado no registo $s6. Loop: add add add lw bne add j Exit: jr $t1, $t1, $t1, $t0, $t0, $s3, Loop $ra $s3, $s3 $t1, $t1 $t1, $s6 0($t1) $s5, Exit $s3, $s4 a) Indique em linguagem C, qual a estrutura de controlo a que corresponde o segmento MIPS e comente todas as linhas do segmento de código MIPS b) Se consideramos que o label Loop corresponde ao endereço 0x80000, obtenha o código MIPS em linguagem máquina, indicando o endereço de cada instrução e o conteúdo de cada campo separadamente. Problema 26: [Exame de Recurso de 27/7/01] Faça um procedimento denominado múltiplos que mostre no ecrã os n primeiros múltiplos de 7. O valor de n supõe-se ser enviado por parâmetro no registo $a0, pelo programa principal. Faça o programa principal que chama o procedimento anterior. O valor de n deve ser introduzido através do teclado pelo utilizador. Problema 27: [Frequência de 7/12/01] Dado um segmento de código MIPS, i corresponde ao registo $t2, a constante 5 está contida no registo $t3, o array de words A começa no endereço indicado no registo $t0 e o array de words B começa no endereço indicado no registo $t1. 1) Indique em linguagem C, qual a estrutura de controlo a que corresponde o segmento MIPS dado e comente todas as linhas do mesmo segmento de código. 2) Se consideramos que o label Loop corresponde ao endereço 4194320, obtenha o código MIPS em linguagem máquina hexadecimal do segmento L1, indicando o endereço de cada instrução e o conteúdo de cada campo separadamente. Loop: sub $t4, $t3, $t2 add $t4, $t4, $t4 add $t4, $t4, $t4 add $t8, $t0, $t4 add $t5, $t2, $t2 add $t5, $t5, $t5 9 ARQUITECTURA DE COMPUTADORES lw $t7, 0($t8) add $t6, $t1, $t5 sw $t7, 0($t6) beq $t2, $t3, Exit addi $t2, $t2, 1 j Loop Exit: jr $ra L1: Problema 28: [Frequência de 7/12/01] Escreva um procedimento em linguagem MIPS denominado contaletras. O procedimento deve ter um único argumento que é o ponteiro de um string terminado por NULL, colocado no registo $a0. O procedimento deve localizar o primeiro caracter d no string e deve retornar o seu endereço no registo $v0. Se o string não tem nenhum caracter d deve retornar o endereço do caracter NULL no fim do string. Por exemplo se o argumenta aponta para o string “modulo” então o valor retornado deve apontar para o endereço de memória do 3º caracter. Problema 29: [Frequência de 7/12/01] Escreva um programa em linguagem MIPS que determine qual o maior valor contido num array de n=7 elementos. O endereço de base do array está associado ao label numeros bem como o total de números está associado ao label n, são definidos por directivas para o segmento de dados. O resultado deve ser impresso na consola. Use a seguinte sequência de valores para teste: 36, 29, 27, 15, 1, 62, 41. Problema 30: [Exame de 15/1/02] Traduza as seguintes instruções em linguagem assembly MIPS para a linguagem máquina MIPS e escreva o conteúdo de cada instrução em hexadecimal a) b) c) d) add $s1, $t4, $t8 addi $s5, $22, -44 lw $t5,12($s3) jal contabits #A label contabits corresponde ao endereço (4194412)10 Problema 31: [Exame de 15/1/02] Escreva um procedimento em linguagem assembly MIPS que determine o número de vezes que ocorre um bit 1 numa palavra de 32 bits. Implemente o procedimento com parâmetro de entrada $a0, no qual está a palavra de 32 bits, e o resultado é posto em $v0. 1) Para o procedimento anterior, escreva o programa principal que proceda à leitura pela consola dum número inteiro e que depois é guardado numa word numero, a definir no segmento de dados, e que imprima na consola o número de ocorrências do bit 1, recebido do procedimento em $v0. Problema 32: [Exame de 15/1/02] Escreva um programa em linguagem assembly MIPS que determine o máximo divisor comum (mdc) de dois números e o coloque na palavra mdc, contida no segmento de dados do programa. Considere que os números são lidos através do teclado no programa e guardados nos registos $s0 e $s1. Utilize o código C a seguir, como algo ritmo para realizar o programa solicitado, em que se coloca o valor calculado na posição de memória mdc, correspondendo a return a: int mdc(int a, int b) { while(a != b) { if (a < b) b = b – a; 10 ARQUITECTURA DE COMPUTADORES else a = a – b; } return a; } Problema 33: [Exame de recurso de 29/1/02] Traduza o seguinte segmento em linguagem assembly MIPS para linguagem máquina MIPS e escreva o conteúdo de cada instrução em hexadecimal ciclo: addi $t0, $zero, 1 add $t2, $t0, $t1 lw $s4, 0($t2) bne $t0, $s1, ciclo j end NOTA: Os endereços associados a ciclo e end são 4 192 312 e 4 192 340, respectivamente Problema 34: [Exame de recurso de 29/1/02] Escreva um programa em linguagem MIPS que determine qual o maior valor contido num array de n=7 elementos. O endereço de base do array está associado ao label numeros bem como o total de números está associado ao label n. São ambos definidos por directivas para o segmento de dados. O resultado deve ser impresso na consola. Use a seguinte sequência de valores para teste: 36, 29, 27, 15, 1, 62, 41. Problema 35: [Exame de recurso de 29/1/02] Escreva um procedimento em linguagem assembly MIPS que determine o número de vezes que ocorre um bit 1 numa palavra de 32 bits. Implemente o procedimento com parâmetro de entrada $a0, no qual está a palavra de 32 bits, e o resultado é posto em $v0. 1) Para o procedimento anterior, escreva o programa principal que proceda à leitura dum string de 4 letras pelo teclado, que depois é guardado num endereço associado à label palavra, a definir no segmento de dados, e que imprima na consola o número de ocorrências do bit 1, recebido do procedimento em $v0. 11