; cond.asm - exemplo de calculos úteis em tempo de montagem: ; dados dois vetores na memória RAM do AVR, copiar o 1o vetor ; para o 2o vetor sem ultrapassar seu tamanho, ou seja ; copiar apenas o numero de bytes do vetor de menor tamanho. ; O tamanho do menor vetor é calculado em "tempo de montagem" ; e a instrução apropriada para carregar o tamanho em r16 ; é gerada "em tempo de montagem" via montagem condicional. ; O exemplo mostra também como declarar variáveis e reservar ; espaço para vetores na memória RAM através das diretivas .dseg e .byte ; MC404 1º sem 2010 - Prof Célio Guimarães ; ;************************************************************* .nolist .include "m88def.inc" .list .def ct=r16 ; usaremos como contador de bytes .dseg ; segmento de dados (na área de dados, RAM) .equ size1 = 8 .equ size2=16 tam: .byte 1 ; vai conter o tamanho do menor vetor tab1: .byte size1 ; reserva size1 bytes para 1o vetor (tab1) tab2: .byte size2 ; reserva size bytes para 2o vetor (tab2) .cseg ; segmento de código (na área de instruções) .ifndef SPH lxi r16, low(RAMEND) out SPL,r16 lxi r16, high(RAMEWND) out SPH, r16 .endif .if size1 <= size2 ; calcula o tamanho do menor vetor e atribui a ct ldi ct, size1 .else ldi ct, size2 .endif sts tam, ct ; tam recebe o tamanho do vetor de menor comprimento ldi xl, low(tab1) ldi xh, high(tab1) ; X aponta para tab1 ldi yl, low(tab2) ldi yh, high(tab2) ; Y aponta para tab2 loop: ld r0, X+ ; pega um byte de tab1 st Y+, r0 ; e armazena em tab2 dec ct brne loop ; até que jejam transferidos min(size1,size2) sts tam,ct rjmp pc