Atividade 3

Atualizado em 21-09-2012. Prazo de submissão: 18-10-2012

  1. Conversão de binário para decimal (ASCII)
    Escreva uma subrotina bin2ascii que toma como parametro de entrada um inteiro de 16 bits em X e um apontador em Y para uma área de memória na RAM. O objetivo da subrotina é converter o inteiro em X numa cadeia apontada por Y, contendo a representação decimal em ASCII do inteiro em X (terminando a cadeia por um byte 0, como na linguagem C). Y deverá apontar no final para o primeiro digito significativo (isto é diferente de 0) da cadeia. Por exemplo, se X=$FFFF então a cadeia será '65535',0 ou em hexadecimal:36 35 35 33 35 00 (brancos colocados apenas para legibilidade). Se X= 10 a cadeia final será 0A00. Se X=0 a cadeia final será 3000.
    Sugestão: obtenha cada digito da cadeia dividindo sucessivamente X por 10000, 1000, 100, 10, 1. Como o ATmega 88 não tem instrução de divisão isto poderá ser feito via subtrações sucessivas de forma relativamente eficiente (escreva uma subrotina para este fim). Simplifique seu código colocando as constantes acima na memória de programa usando a diretiva .dw (que armazena uma constante de 16 bits no formato little endian, bastante conveniente para esta aplicação). Se codificada com cuidado sua subrotina não ocupará mais do que 25 instruções(*).

  2. Conversão de decimal-ASCII para binário
    Escreva uma subrotina ascii2bin que toma como parametro de entrada um apontador em Y para uma cadeia ASCII de tamanho variável armazenada na RAM (terminada por 0, como no caso acima), representando um número decimal. O objetivo da subrotina é converter a cadeia para um inteiro de 16 bits no par X (parâmetro de saída).
    Sugestão:pegue cada caracter(dígito) da cadeia da direita para a esquerda, converta-o para binário multiplicando o 1o por 1 (desnecessário), o 2o por 10 e assim sucessivamente até 10000, e somando em X cada um dos produtos enquanto existirem dígitos na cadeia (no máximo 5). Observe que cada multiplicação (acima de 100) e as somas devem ser feitas com precisão de 16 bits; se ocorrer overflow o CY deve ser ligado (sendo, portanto, um parâmetro de saída), por exemplo no caso da cadeia com 5 dígitos '65587'. Se as constantes forem colocadas na memória de programa usando a diretiva .dw o seu código ficará simplificado e a subrotina pode ser codificada em cerca de 21 instruções (*).

  3. "Parsing" de uma linha de comando contendo operadores aritméticos
    Escreva um programa para analisar um comando contendo caracteres ASCII na memória RAM com 2 operandos representando números decimais em ASCII separados por um operador para as 4 operações aritméticas '+','-','*', '/', 'C' (clear) e 'E' (enter). O resultado do parsing deverá ser apontadores para 2 cadeias no formato dos dois problemas acima, uma para cada operando e um caracter para um dos operadores citados. A principal dificuldade (não trivial) do seu programa é que ele deverá deverá ser robusto no que diz respeito a erros na cadeia, como falta. excesso, erro em algum dos operandos, falta ou erro no operador, etc, etc (a quantidade de erros possíveis é enorme e quanto mais você detetá-los maior será sua nota - é importante relacionar os erros que seu programa deteta!).

  4. Onde será usada esta atividade: na atividade 4 que é a implementação gráfica de uma calculadora que implementa as 4 operações aritméticas com inteiros com precisão de 16 bits usando os recursos gráficos do Hapsim.


(*) Existem algoritmos bem mais eficientes (lineares no tamanho da entrada) para fazer ambas conversões, usando unicamente operações de deslocamento que geram a cadeia (deslocando os bits do valor binário, no caso de binário para ASCII) ou que a partir da cadeia geram o valor binário (há até chips para implementá-los), mas são mais complexos dos que os descritos acima.