MC404E    -    1º Semestre 2008

Prof. Célio Guimarães - IC1 - sala 40

Atualizado em: 17/03/08

Atividade 1a (obrigatória) Produto escalar de dois vetores de inteiros de 8 bits sem sinal

Escreva um programa em linguagem de montagem do AVR que calcula o produto escalar de dois vetores de inteiros de 8 bits sem sinal, localizados na memória de programa. Cada vetor é delimitado pelo valor ff que não faz parte do vetor. Você deve copiar para a memória RAM apenas o 1º vetor a fim de facilitar o cálculo. O produto escalar deve ser calculado com precisão de 16 bits e no finsl do cálculo deve ser armazenado em dois bytes da memória RAM no formato little endian (byte menos signif, byte mais signif). Faça um teste com dois vetores de 4 elementos cada com dígitos extraídos dos CPFs das pessoas do seu grupo, considerados como dígitos hexadecimais(Obs:o resultado do produto escalar deve ser maior do que ff) e verifique a correção com a calculadora do Windows.
Exemplo de declaração dos vetores:
Vetor1:   db 0x74, 0x55, 0x32,0x68, 0xff
Vetor2:   db 0x50, 0x46, 0x88,0x70, 0xff
e o resultado do produto escalar é: 0x838e

Atividade 1b (obrigatória): soma parcial com inteiros de 16 bits sem sinal

Escreva um programa em linguagem de montagem do AVR que calcula a soma parcial dos elementos de um vetor fonte contendo inteiros sem sinal de 16 bits, localizado na memória de programa, colocando o resultado da soma parcial num vetor destino na memória RAM do AVR. O vetor original não deve ser copiado para a memória SRAM e os primeiros 2 bytes do vetor original contêm o número de elementos do vetor. Caso numa das somas parciais ocorra overflow o programa deve ser interrompido (faça um teste específico para verificar este caso).
Exemplo de declaração do vetor fonte:
Fonte:   dw 0x0006, 0x0012, 0x0038, 0x0015, 0x0098, 0x0042, 0x0068h 
Observe que o montador armazena constantes de 16 bits na área de programa no formato little-endian, ou seja, primeiro o byte menos significativo e em seguida o byte mais significativo, o que é conveniente para fazer somas com precisão estendida; no exemplo acima as constantes seriam armazenadas em endereços crescentes da seguinte forma (em hexadecimal): 0600, 1200, 3800, 1500, 9800, 4200, 6800. No final da execução com este exemplo o vetor destino deverá conter os seguintes valores no formato little-endian: 0x1200, 0x4A00, 0x5F00, 0xF700, 0x3901, 0xA101.
Obs: (i) faça um teste com pares de dígitos extraídos dos CPFs das pessoas do seu grupo, considerados como dígitos hexadecimais.
(ii)os dados do teste devem ser tais que o valor final da soma deve ser superior a 0x00ff
(iv)Verifique a correção do programa comparando visualmente o conteúdo do vetor destino (selecione View → Memory Window 2 → Data) com uma calculadora em hexadecimal (por exemplo, a de Windows)

Opcional: escreva o seu programa usando uma subrotina somaparcial que recebe como parâmetros de entrada no par Z o endereço do vetor na memória de programa e no par X o endereço do começo da RAM.