Prévia do material em texto
Curso: Bacharel em Sistemas de Informação Turma: BSI2 Disciplina: Arq. e Organização de Computadores CH: 60 horas Período: 2013/1 Professor: Flávio Giraldeli Validador de CPF em C e Assembly OBJETIVO Implementar um pequeno programa de validação de números de CPF usando a linguagem Assembly x86 (16 bits) e C. Após a implementação em alto e baixo nível, uma análise comparativa deverá ser feita a fim de evidenciar os detalhes de Arquitetura de Computadores que são ocultados pela linguagem de alto nível, C. GRUPOS Deverão ser formados grupos com 3 alunos, a serem escolhidos livremente (contando que pelo menos um domine os aspectos básicos de programação em C). No caso do número de alunos da turma não ser múltiplo de 3, a decisão deverá ficar a critério do professor. PONTUAÇÃO O referido trabalho será avaliado de 0 a 100 e corresponderá a 20% da nota semestral. A nota do trabalho será calculada da seguinte forma: Não serão admitidos, em hipótese alguma, trechos de código comuns ou semelhantes entre grupos. Isto será rigorosamente observado. Assim sendo, evitem a “cooperação” entre os grupos. A mesma observação vale “pesquisas na internet”. Lembre-se, o professor também sabe fazer essas pesquisas. DA IMPLEMENTAÇÃO Em ambas as implementações, o comportamento do programa executável deverá ser indistinto, ou seja, em execução, ambos têm que se comportar exatamente da mesma forma do ponto de vista do usuário. Para tanto, solicite, via mensagem de texto, o número do CPF a ser validado. Para facilitar, você pode entrar apenas com os caracteres numéricos. Após análise, informe se o número é válido ou não. Simples assim. O grupo poderá criar cada algoritmo da forma que julgar melhor (lembre-se de, se necessário, justificar/explicar as decisões tomadas no relatório). No entanto, uma obrigatoriedade lhes será imposta no que diz respeito à modularização do algoritmo: Algoritmo em C: Deverá ser criada uma função, cujo protótipo será int verificaCPF(char *cpf); que, dado um vetor de chars (11 caracteres) representando o CPF, retorne 1 se o CPF for válido ou 0 caso contrário. Essa função deverá ser chamada após o algoritmo principal (no main) capturar o CPF digitado pelo usuário. Algoritmo em Assembly: Deverá ser criado um procedimento em Assembly cuja funcionalidade é análoga à função em C acima descrita. No entanto, o grupo deverá pensar na forma mais apropriada de se passar o parâmetro e de se retornar o resultado, de acordo com o que fora visto nas aulas de Assembly, já que em baixo nível as coisas não são tão simples. OBS: Lembre-se de implementar o backspace (quando você estiver programando você irá entender...). Fica a cargo do grupo criar (ou não) outras funções (C) ou procedimentos (Assembly) que julgar necessários. Porém a única obrigatoriedade é a descrita acima, uma vez que envolve importantes aspectos de arquitetura de computadores. A implementação em C poderá ser feita no compilador que o grupo desejar (ou que já esteja acostumado a usar). Ou, se quiser uma dica, pode começar a usar uma IDE profissional como o Microsoft Visual Studio Express 2012 para Windows Desktop (Gratuito). (Link: http://www.microsoft.com/visualstudio/ptb/products/visual-studio-express-for-windows-desktop) Já a implementação em Assembly deverá fazer uso do emu8086, enviado por email. O formato do arquivo Assembly poderá ser um .com, cuja estrutura “mono-segmento” é bem mais simples que um .exe. Nenhum procedimento/macro pré-pronto poderá ser chamado diretamente. No entanto, você poderá abrir o arquivo inc\emu8086.inc e copiar uma ou outra rotina básica e inserir diretamente no seu código. As rotinas (macro/procedimento) deverão ser traduzidas e plenamente compreendidas pelo grupo. A qualidade da sua implementação, usando corretamente os recursos aprendidos (como chamadas a procedimento, macros, uso da pilha, saltos, variáveis, etc...) será avaliado. Faça uso extensivo do emulador. Lembre-se que o objetivo primário é o aprendizado de AOC, e não a programação em Assembly. O emulador possui simulação passo a passo da execução, sendo possível visualizar todas as informações de estado (registradores, memória, pilha, variáveis, etc...) em tempo real. DO RELATÓRIO É necessária a confecção de um relatório escrito do trabalho, correspondendo a 40% da nota, conforme o tópico anterior. Apesar de haver certo grau de liberdade na elaboração do relatório escrito, os seguintes tópicos devem ser abordados: Todos os aspectos da linguagem de baixo nível que a implementação em C simplesmente “oculta”, ou seja, você sequer precisa saber que aquilo existe em Assembly ao implementar em C. Dê exemplos. Comparação da quantidade de instruções relevantes presentes em C/Assembly; Explicação do funcionamento básico de todas os macros/procedimentos que foram copiados do inc\emu8086.inc. Avaliação do grupo do tempo necessário para cada implementação. Tome a implementação em C como referência e estime o percentual de tempo a mais necessário para a implementação em Assembly. Conclusão, incluindo uma auto avaliação do aprendizado adquirido; DA ENTREGA A data limite para entrega do trabalho, via email do professor, é o dia 05/09 até as 23:59. Tal prazo é necessário para que dê tempo de corrigir todos os trabalhos e entregar as notas parciais a tempo da prova final, marcada para o dia 09/09. Instruções para envio do email com o trabalho: Assunto: [AOC – 2013-1] Trabalho 2 - Aluno1, Aluno2, Aluno3 Anexo: Pacote compactado (zip/rar) com o mesmo nome usado no campo assunto e contendo: Implementação em C num arquivo .c único (cpf.c); Implementação em Assembly num arquivo .asm (cpf.asm); Relatório em formato PDF conforme recomendações acima citadas (relatorio.pdf). Siga estritamente as regras acima, ou seu trabalho poderá ser desclassificado. Principalmente as normas de nomenclatura. É SÉRIO! SEREI MUITO RÍGIDO QUANDO A ISSO E NÃO ACEITAREI RECLAMAÇÕES SOB HIPÓTESE ALGUMA! O objetivo é facilitar a correção/análise por parte do professor. O ALGORITMO DE VALIDAÇÃO DO CPF DESCRIÇÃO No Brasil existe o CPF (Cadastro de Pessoas Físicas) que serve para identificar cada indivíduo no país. O número do CPF é composto de 11 dígitos, sendo os dois últimos os dígitos de verificação. A fórmula para verificar a validade do número do CPF é simples e é explicada abaixo: Vamos tomar como exemplo o número 123.456.789-09 1º DÍGITO VERIFICADOR Primeiro calculamos a soma da multiplicação dos 9 primeiros dígitos por 10, 9, 8, ... , 3, 2, respectivamente. Ou seja: Soma = (1*10) + (2*9) + ... + (8*3) + (9*2) Em seguida, dividimos e multiplicamos por 11. (Nota: Ao multiplicarmos utilizamos o valor inteiro da divisão). Valor = (Soma/11) * 11 Por fim, subtraímos Valor de Soma: Resultado = Soma - Valor Note que acabamos de realizar o módulo de Soma e 11. As duas operações anteriores podem ser substituídas por: Resultado = Soma módulo 11. Agora analisamos Resultado: Se Resultado for igual à 1 ou à 0, então o 1º dígito verificador é 0; Caso contrário, o 1º dígito verificador é igual a 11- Resultado. 2º DÍGITO VERIFICADOR Primeiro calculamos a soma da multiplicação dos 9 primeiros dígitos por 11, 10, 9, ... , 4, 3, respectivamente e em seguida somamos com (Digito1*2), sendo que Digito1 é o valor encontrado para o 1º dígito verificador. Ou seja, Soma = (1*11) + (2*10) + ... + (8*4) + (9*3) + (Digito1*2) O resto é semelhante ao que foi feito anteriormente. Dividimos e multiplicamos por 11. (Nota: Ao multiplicarmos utilizamos o valor inteiro da divisão). Valor = (Soma/11) * 11 Por fim, subtraímos Valor de Soma. Resultado = Soma - Valor Agora analisamos Resultado: Se Resultado for igual à 1 ou à 0, então o 2º dígito verificador é 0; Caso contrário, o 2º dígito verificador é igual a 11- Resultado. No nosso exemplo (123.456.789-09)o número é válido. Bom Trabalho!