Lista de Exercícios Linguagem de Montagem Esta lista de exercício tem como objetivo o desenvolvimento de programas em linguagem de montagem para uma CPU simples. A CPU simples que será utilizada é baseada em um processador MIPS que foi simplificado para torna-lo adequado para atividades didáticas Como no processador MIPS, essa CPU didática também tem 3 tipos de instruções, as instruções do tipo R (envolve operações sobre registradores), I (envolve o acesso à memória para o acesso de dados e operações com dados imediatos) e J (envolve o cálculo de um endereço de memória dado pelo campo endereço). O banco de registradores é apresentado na Tabela 1 e as instruções suportadas pela CPU estão especificadas na Tabela 2. Todas as instruções obedecem ao formato padrão de instruções MIPS de 32 bits. Registrador $zero $at $v0 $v1 $a0 $a1 $a2 $a3 $t0 $t1 $t2 $t3 $t4 $t5 $t6 $t7 Instrução add addi sub and or ori xor sll srl lui lw sw beq bne slt slti j jal jr Número 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Tipo R I R R R I R R R I I I I I R I J J J Tabela 1: Registradores da CPU Uso Registrador Número $s0 Valor constante igual a zero 16 $s1 Assembler temporário 17 $s2 Retorno de função 18 $s3 Retorno de função 19 $s4 Argumento de função 20 $s5 Argumento de função 21 $s6 Argumento de função 22 $s7 Argumento de função 23 $t8 Variáveis temporárias 24 $t9 Variáveis temporárias 25 $k0 Variáveis temporárias 26 $k1 Variáveis temporárias 27 $gp Variáveis temporárias 28 $sp Variáveis temporárias 29 $fp Variáveis temporárias 30 $ra Variáveis temporárias 31 Uso Variáveis salvas por função Variáveis salvas por função Variáveis salvas por função Variáveis salvas por função Variáveis salvas por função Variáveis salvas por função Variáveis salvas por função Variáveis salvas por função Variáveis temporárias Variáveis temporárias Temporárias para S.O. Temporárias para S.O. Apontador global Apontador de pilha Apontador de quadro Endereço de retorno Tabela 2: Instruções suportadas pela CPU Exemplo Significado add $s0 $s1 $s2 $s0 := $s1 + $s2 addi $s0 $s1 2 $s0 := $s1 + 2 sub $s0 $s1 $s2 $s0 := $s1 - $s2 and $s0 $s1 $s2 $s0 := $s1 and $s2 or $s0 $s1 $s2 $s0 := $s1 or $s2 ori $s0 $s1 0x10000000 $s0 := $s1 or 2 xor $s0 $s1 $s2 $s0 := $s1 xor $s2 sll $s0 $s0 1 $s0 := $s0 << 1 ($s0 := $s0 * 2^1) srl $s0 $s0 1 $s0 := $s0 >> 1 ($s0 := $s0 / 2^1) lui $s0 0x1000 $s0 := $s0 << 16 ($s0 := 0x10000000) lw $s0 4($s1) $s0 := memória[4+$s1] sw $s0 4($s1) Memória[4+$s1] = $s0 beq $s0 $s1 0x0020003C Se $s0 == $s1 desvie para o endereço 0x0020003C beq $s0 $s1 0x0020003C Se $s0 != $s1 desvie para o endereço 0x0020003C slt $s0 $s1 $s2 $s0 = ($s1 < $s2)?1:0 slti $s0 $s1 2 $s0 = ($s1 < 2)?1:0 j 0x0020003C Desvia para o endereço 0x0020003C jal 0x0020003C Desvia para o endereço 0x0020003C e $ra := PC + 4 jr $ra Desvia para o endereço armazenado em $ra Questão 01 Escreva um programa em assembly, para trocar o conteúdo de dois registradores $t0 e $t2. Você não pode usar outros registradores. Organização e Arquitetura de Computadores I Prof. Dr. Max Santana Rolemberg Farias [email protected] Lista de Exercícios Linguagem de Montagem Questão 02 Substitua o código abaixo em assembly. As variáveis x, y e m devem ser armazenadas nos registradores $s0, $s1, $s2 respectivamente. if (x > y) m = x; else m = y; Questão 03 Substitua o código abaixo em assembly. As variáveis temp e x devem ser armazenadas nos registradores $s0 e $s1 respectivamente. switch(temp){ case 10: x = 10; break; case 25: x = 25; break; default: x = 0; } Questão 04 Substitua o código abaixo em assembly. As variáveis i e x devem ser armazenadas nos registradores $s0 e $s1 respectivamente. while(i == 8){ x = i++; } Questão 05 Escreva um programa em linguagem de montagem, para a CPU proposta, que gere um novo número inteiro com os dígitos em ordem inversa do número 5382. Ou seja, o programa vai gerar o número 2835. Questão 06 A série de Fibonacci é definida assim: os dois primeiros termos têm o valor 1 e cada termo seguinte é igual à soma dos dois anteriores. 1 1 2 3 5 8 13 21 ... Escreva um programa em linguagem de montagem, que calcule o valor do 9º termo. Organização e Arquitetura de Computadores I Prof. Dr. Max Santana Rolemberg Farias [email protected] Lista de Exercícios Linguagem de Montagem Questão 07 Os computadores só conseguem entender números, por isso, os computadores utilizam o código ASCII para representar numericamente os caracteres como ”a” ou “@” ou uma ação de algum tipo. Abaixo está a tabela de caracteres ASCII com os 32 caracteres não imprimível. Escreva um programa em linguagem de montagem, que troca cada letra da string “ascii”. Ou seja, o programa deve trocar os caracteres minúsculos pelo seu caractere maiúsculo. Questão 08 Mostre como a string “SOS” seria armazenada na memória de uma CPU big-endian. Sendo que o endereço inicial da memória é 0x1000100C. Use o diagrama de memória abaixo, para indicar claramente o endereço de memória de cada byte. Endereço 0x1000100C Memória Organização e Arquitetura de Computadores I Prof. Dr. Max Santana Rolemberg Farias [email protected] Lista de Exercícios Linguagem de Montagem Questão 09 Mostre como a string “SOS” seria armazenada na memória de uma CPU little-endian. Sendo que o endereço inicial da memória é 0x1000100C. Use o diagrama de memória abaixo, para indicar claramente o endereço de memória de cada byte. Endereço 0x1000100C Memória Questão 10 Represente o código em linguagem de máquina. Escreva as instruções em hexadecimal. add $t0 $s0 $s1 lw $t0 0x20($t7) addi $s0 $zero -10 “Se as pessoas não acreditam que a matemática é simples, é só porque eles não percebem a quão complicada a vida é.” John Von Neumann Organização e Arquitetura de Computadores I Prof. Dr. Max Santana Rolemberg Farias [email protected]