- [1.5] Analise o trecho de programa a seguir e
descubra os desvios feitos pelo programa. É essencial justificar sua resposta:
ldi r16, $fe ; sem sinal fe < ff,
ldi r17, $ff ; e com sinal fe= -2 e ff=-1 (complemente e some 1)
cp r16,r17
brlt la ;salto com sinal: -2 < -1 logo desvia para la
aqui: nop
nop
la: brsh longe ; sem sinal fe < ff logo nao desvia para longe
perto: nop ; executará esta instrução
nop
longe: rjmp pc
- [3.5] Escreva um trecho de programa (apenas as instruções relevantes) para:
(i) transferir os 4 bits mais significativos de r0 para os 4 bits menos significativos de r16.
(ii) zerar os 4 bits mais significativos de r16.
(iii)gerar em r16 o caracter "ASCII hexadecimal" correspondente aos 4 bits menos significativos de r16
mov r16,r0
swap r16 ; (i) poderia ser: lsr lsr lsr lsr
andi r16,$0f ; (ii)
ldi r17, '0' ; (iii) começa aqui
add r16,r17
cpi r16, '9'+1 ; ou cpi r16,$3a
brlo fim ; se <= '9' nao pecisa ajuste
subi r16, -7 ; senao soma 7 para obter 'A' ou 'B'....'F'
fim:
- [1.0] Escreva uma macro loadcte16 com o objetivo de armazenar uma constante de 16 bits em um dos
pares de registradores X, Y ou Z passado como parâmetro. Parâmetros de entrada:
@0: uma constante de 16 bits, @1: um dentre X, Y ou Z . Parâmetro de saída: @1. Dê um exemplo de invocação da macro.
.macro loadcte16 ; cte16, W
ldi @1l, low(@0)
ldi @1h, high(@0)
.endm
loadcte16 $abcd, X ; invocação
- [1.0] Escreva uma macro soma16 com o objetivo de somar valores de 16 bits contidos em
dois pares de registradores do AVR. Parâmetros de entrada @0 e @1.
Parâmetro de saída: @0. Dê um exemplo de invocação da macro.
.macro soma16 ; W, W
add @0l, @1l
adc @0h, @1h
.endm
soma16 Y, Z ; Y ← Y + Z
- [3.0] Escreva uma subrotina fib16 cujos parametros são os pares de registradores
x,y e z onde: x contem um elemento da sequencia de Fibonacci, y o elemento seguinte e z
é um apontador para armazenar o próximo elemento da sequencia na memória RAM, ou seja,
a subrotina deve:
(i) calcular a soma x+y com precisão de 16 bits,
(ii) armazenar a soma na RAM no formato little endian (low, high) e,
(iii) deixar no par x o valor que estava em y
e no par y o novo valor calculado. (Portanto, sucessivas chamadas de fib16 armazenarão na memória RAM
a sequencia de Fibonacci com precisão de 16 bits.
Comente cuidadosamente a sua subrotina.
fib16: ;calcula o proximo elemento da sequencia de Fibonacci (16 bits)
;entrada: X elemento anterior
; Y proximo elemento
; Z aponta para RAM onde vai armazenar X+Y em little endian
;saida: X ← o que estava em Y
; Y ← o novo valor calculado, X+Y
; Z aponta para proxima posição na RAM
;destroi r1, r0
;**************************************************************
add xl,yl ; novo valor parte low
adc xh,yh ; novo valor parte high
st z+,xl ; salva low na RAM
st z+,xh ; salva high, z aponta p/ prox posicao livre
movw r1:r0, x ; salva novo valor em r1:r0
movw x,y ; X ← valor novo anterior
movw y,r1:r0 ; y ← valor calculado
ret