Atividade 3
Atualizado em 21-09-2012. Prazo de submissão: 18-10-2012
- 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(*).
- 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 (*).
- "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!).
- 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.