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.