- [1.0] Considere um microcontrolador cuja palavra tem 12 bits.
Escreva em hexadecimal os seguintes valores de 12 bits:
(i)o maior valor inteiro positivo com sinal no formato complemento de 2
(ii)o menor valor inteiro negativo com sinal no formato complemento de 2
(iii)o menor valor inteiro negativo com sinal no formato complemento de 1
(iv) o maior inteiro (positivo) sem sinal
- [1.0] Escreva um trecho de programa para ligar apenas o bit 2 do registrador TIMSK0
Obs: consulte com atenção a folha de regs de E/S
lds r16, TIMSK0
ori r16, 4
sts TIMSK0, r16
- [1.0] Escreva uma macro soma16 com 2 parâmetros onde onde o 1º parametro (@0) é um dos
pares de registradores X, Y ou Z e o 2º parâmetro (@1) é uma constante de 16 bits.
O objetivo da macro é somar a constante de 16 bits ao par passado como parâmetro.
- [2.0 ] Escreva uma subrotina comentada strinlen com o objetivo de calcular
com precisão de 16 bits o
tamanho de uma cadeia de caracteres ASCII armazendada na memória RAM e delimitada pelo valor binário 0.
Parâmetro de entrada: X: apontador para o inicio do vetor.
Parâmetro de saida: Y: tamanho da cadeia
Escreva apenas o código da subrotina
srinlen:
clr yl
clr yh ; zera parametro de saida
loop:
ld r0, X+ ; obtem um elemento da cadeia, X aponta para o proximo
tst r0 ; fim de cadeia ou cadeia vazia
breq fim
adiw y,1
rjmp loop
fim: ret
- [3.5] Escreva uma subrotina comentada somaestendida com o objetivo de calcular a
soma com precisão estendida de dois
inteiros "grandes" localizados em dois vetores na memória RAM no formato little endian
(byte menos significativo primeiro) e deixando o resultado no 1º vetor.
Parâmetros de entrada: X: apontador para o byte - significativo do 1º inteiro
Y: apontador para o byte - significativo do 2º inteiro
r0: tamanho em bytes do inteiro (vetor)
Excetuando os parâmetros, você deve salvar/restaurar na/da pilha os registradores
que for usar.
Escreva apenas o código da subrotina
Dica: as instruções dec e inc não alteram o CY
somaestendida: ;suposição: r0 >0
push r16 ; só precisamos de 2 registradores
push r17 ; para obter um byte de cada vetor
clc ; preciso zerar o CY por causa da 1a soma
loop:
ld r16, x ; mantem x apontado para o byte corrente
ld r17, y+ ; mas y passa a apontar para o próximo byte
adc r16,r17 ; soma 2 bytes com CY, pode gerar novo CY
st x+, r16 ; põe soma no byte apontado por x e x aponta para próximo byte
dec r0 ; dec preserva o CY da soma acima
brne loop ; volta se r0 > 0
pop r17
pop r16
ret
- [1.5] Detalhe as funções dos seguintes registradores de E/S
do Timer/Counter 0 do ATMega 88
(com o fim de ser usado para interrupção do tipo Overflow): TCCR0B, TCNT0, TIMSK0, TIFR0.