MC404 - 2º Semestre 2010
Profs. Mario L. Côrtes, Paulo Centoducatte, Ricardo Pannain
Atividade opcional: Vários
A) Escreva um trecho de programa contendo apenas uma instrução
lógica e saltos
condicinais apropriados, para verificar se um inteiro com sinal
em um registrador
é
positivo, negativo, par ou ímpar. Desenhe os arcos onde há saltos e
verifique se o
número de cruzamentos de arcos é mínimo.
B) Modifique o exemplo de
botões que acendem leds
de forma que os botões funcionem
como "toggles" ou seja o led não deve apagar quando
o botão é liberado, somente quando
for pressionado novamente.
Dica: guarde o estado do botão e da sua ação.
C) Escreva uma subrotina que toma como parâmetros em X um inteiro
sem sinal de 16 bits
e
em Y um endereço na memória RAM a partir do qual você deve
armazenar a representação
em ASCII do valor decimal de X, ou seja a subrotina faz a conversão
de binario
para decimal
ASCII.
Sugestão: se você armazenar as constantes 10000, 1000, 100 e
10 na memória
de
programa (use a diretiva .dw para isso) poderá fazer a conversão
com uma subrotina contendo
apenas 21 instruções! Ela seria util em aplicações onde você
queira, por exemplo,
visualizar em
decimal num display LCD valores binários de 16 bits.
D) Desafio: este exercício explora a sobreposição de espaços de endereçamento do AVR:
escreva duas rotinas, savgpr e rstgpr para,respectivamente, salvar na
pilha e restaurar da pilha
o valor de todos os 32 registradores de uso geral.
Cada rotina deve ter um comprimento de até
20 instrucoes , e pode usar até 35 posições na pilha.
A rotina savgpr pode destruir quaisquer
registradores, depois de salvá-los, obviamente,
e pode deixar o que quiser na pilha, em qualquer
ordem, respeitado o limite acima.
A rotina rstgpr deve desfazer completamente o que foi feito
por savgpr, restaurando
todos os 32 registradores para seus valores imediatamente antes da
chamada de savgpr;
a pilha deve também ser deixada exatamente como estava imediatamente
antes da chamada
de savgpr.