Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Programação Assembly MIPS Este documento apresenta a descrição de um procedimento para converter um código fonte em alguma linguagem de programação para a linguagem Assembly do MIPS. A Figura 1 apresenta um código em Java para ordenar um vetor de inteiros usando o algoritmo de ordenação Bubblesort, sem nenhuma otimização. Figura 1: Algoritmo de ordenação BubbleSort em Java. A partir deste algoritmo, pode-‐se criar um pseudocódigo como passo intermediário antes de escrever o código Assembly do MIPS. O objetivo desse pseudocódigo é eliminar o uso de comandos de repetição (como while e for), substituindo-‐os por rótulos e comandos ‘if ... goto’. O pseudocódigo também elimina o de expressões aritméticas dentro de outros comandos ou como índices de vetores. A Figura 2 e a Figura 3 apresentam um pseudocódigo que corresponde ao código Java acima. Figura 2: Pseudocódigo para o algoritmo BubbleSort, parte 1. class BubbleSort { public static void main(String[] args) { int vetor[] = {10,9,8,7,6,5,4,3,2,1}; boolean troca = true; int aux; while (troca) { troca = false; for (int i = 0; i < vetor.length - 1; i++) { if (vetor[i] > vetor[i + 1]) { aux = vetor[i]; vetor[i] = vetor[i + 1]; vetor[i + 1] = aux; troca = true; } } } } } // Variáveis na memória int vetor[] = {10,9,8,7,6,5,4,3,2,1}; int tam = 10; // Variáveis locais int troca; int s; int i0, i1; int v0, v1; 2 Figura 3: Pseudocódigo para o algoritmo BubbleSort, parte 2. Construído desta forma, cada comando do pseudocódigo corresponde a uma instrução do MIPS. As variáveis na memória ficarão no segmento de dados do código Assembly e o endereço do vetor e as variáveis locais serão mapeadas para os registradores de propósito geral do MIPS, como está representado na Tabela 1. Dado Registrador Endereço de vetor $t0 s $t1 troca $t2 i0 $t3 v0 $t5 i1 $t6 v1 $t7 Tabela 1: Mapeamento dos dados do pseudocódigo para registradores MIPS. Usando essa convenção, o código Assembly do MIPS correspondente é apresentado na Figura 4. Cada elemento do vetor ocupa 4 bytes. Por isso, o incremento do índice foi feito somando 4 no código Assembly, diferente do pseudocódigo, onde foi usado o incremento unitário. troca = 1; s = tam-1; loop0: if (troca == 0) goto end_loop0; troca = 0; i0 = 0; loop1: if (i0>=s) goto end_loop1; if0: i1 = i0+1; v0 = vetor[i0]; v1 = vetor[i1]; if (v0<=v1) goto end_if0; vetor[i0] = v1; vetor[i1] = v0; troca=1; end_if0: i0=i0+1; goto loop1; end_loop1: goto loop0; end_loop0: // FIM 3 Figura 4: Código Assembly do MIPS para o algoritmo de ordenação Bubblesort.
Compartilhar