1. [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
    

  2. [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:
    

  3. [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
    

  4. [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
    

  5. [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