MAC 211 - Laboratório de Programação
Exercício-Programa 1: Linguagem de Montagem
- Este é um exercício-programa que tem como
objetivo praticar os conceitos básicos de linguagem de montagem e
fazer com que você implemente um programa com uma parte em C e uma
parte em linguagem de montagem.
- A parte em linguagem de montagem consiste na implementação
de uma função que recebe como parâmetros dois inteiros não-negativos de 16 bits (digamos
p e r) e duas cadeias de caracteres: o nome de um arquivo de leitura e o nome de um arquivo
para escrita. O arquivo de leitura contém apenas números inteiros não-negativos de 16
bits, separados entre si por espaços. A função deverá escrever no arquivo de
saída todos os números primos do primeiro arquivo que se encontram entre p e
r (estes inclusive) e devolver o número de números primos escritos no arquivo de
saída.
- Em um programa em C, o protótipo desta função
será declarado como:
int filtra_os_primos (unsigned short int p, unsigned short int r, char * nome_arquivo_entrada,
char * nome_arquivo_saida);
Onde:
- p e r são dois números inteiros não-negativos de 16 bits;
- nome_arquivo_entrada é o nome do arquivo que contém os inteiros a serem
verificados;
- nome_arquivo_saida é o nome do arquivo onde serão armazenados os números
primos.
- A parte em linguagem C consiste na implementação de
um programa que lerá os dados de entrada da entrada padrão
(teclado ou arquivo redirecionado), chamará a função em linguagem
de montagem e imprimirá o resultado na saída padrão. Por exemplo,
se a entrada padrão receber os seguintes parâmetros:
3 10 arquivoLeitura.txt arquivoEscrita.txt
E se arquivoLeitura.txt contiver os seguintes inteiros:
100 20 3 10 3 7 12 17 33 3 5
O programa precisa imprimir na saída padrão:
5 primo(s) encontrado(s).
E o arquivo arquivoEscrita.txt deverá conter os números:
3 3 7 3 5
Observações importantes
- O EP deverá ser implementado utilizando a notação Intel e deverá ser
compatível com o NASM do Linux.
- Na parte em linguagem de montagem, é recomendado criar subrotinas para cada tarefa (uma para ler um inteiro do arquivo, outra para escrever um inteiro no arquivo de saída, outra para verificar se um número é primo, etc.).
- O EP deve ser realizado em duplas (em casos excepcionais, trabalhos
individuais serão aceitos). Cada componente da dupla deve
obrigatoriamente participar de todas as etapas
da solução do exercício. Os alunos que fizerem em duplas devem trabalhar lado a lado no mesmo
computador; trata-se de uma das recomendações de uma metodologia de programação, chamada
programação em pares (pair programming).
- Obrigatório: Para produzir os arquivos de entrada, escreva um programa em linguagem C que crie um arquivo contendo n inteiros não-negativos de 16 bits, escolhidos de forma aleatória, separados por espaços (n e o nome do arquivo podem ser passados como argumentos na chamada do programa). A entrega deste programa é obrigatória.
- Obrigatório: Utilizando o programa de produção de instâncias aleatórias, teste o desempenho de seu EP para entradas de tamanho 10, 10^2, 10^3 e
10^4. Para isso, utilize o comando time do shell do
Linux. Para cada tamanho de instância, o programa deve ser executado 10
vezes. Um arquivo LEIAME deve ser entregue, contendo os a média e o desvio
padrão dos tempos de execução das 10 execuções para cada tamanho da entrada.
- Opcional: (vale 1 pontinho extra) Escreva também a mesma função da parte de linguagem de montagem em
linguagem C e compare o desempenho das duas implementações da função para
entradas de tamanho 10, 10^2, 10^3, 10^4, 10^5 e 10^6. A saída do programa deve ser uma tabela bem formatada e legível apresentando os dados obtidos. Escreva em um arquivo LEIAME2 as conclusões para a possível diferença de desempenho entre as duas versões.
- DATA DE ENTREGA: 6 de abril
Dicas
- Dois exemplos de leitura/escrita em linguagem de montagem: o programa criacaoEscrita.asm, que cria um arquivo de testes e escreve um texto nele,
e o programa leitura.asm, que faz duas leituras do arquivo criado pelo programa anterior.
- Para criar um executável para testes, crie o objeto da sua parte de montagem utilizando o NASM, o objeto da parte em C utilizando o gcc (opção -c)
e ligue os dois utilizando também o gcc.
- Sempre utilize no gcc os parâmetros -ansi -pedantic -Wall.
Página de MAC211
Página do Fabio
Página do DCC