/* inv.c Programa que copia uma cadeia de caracteres da area de programa para a RAM e em seguida inverte a cadeia na RAM - tamanho com otimização 0s: 158 bytes MC 404 2º Sem 2007 Prof Célio G Atualizado em: 25 Out 2007 ***************************************************************************************************/ #include #include // biblioteca para tratar dados na area de programa #include void reset(void) __attribute__((naked,section(".vectors"))); void reset(void){ asm("clr r1"); SP=RAMEND; SREG=0; asm("rjmp __ctors_end"); } void jmp_main(void) __attribute__((naked,section(".init9"))); void jmp_main(void){ asm("rjmp main"); } char mystring[] PROGMEM= "ABCDEFGHI"; // define uma cadeia C na área de programa char buffer[20] __attribute__((section("*.noinit"))); // __attribute__((section("*.noinit"))); // qdo não queremos inicializar variavel global; register unsigned char temp asm("r2"); //nao alterou o tamanho do código = 158 bytes void exchange (char * i, char * f){ while (i < f ){ // caminha no vetor enquanto i < f temp= *--f; // predecrementa f, salva ultimo byte em temp *f = *i; // coloca no ultimo byte o valor do primeiro *i++= temp; // agora no primeiro coloco o valor salvo e incrementa i } } int main(){ char *i, *f; strcpy_P(buffer, mystring);//copia a cadeia para a RAM i=buffer; //apontador para o inicio da cadeia f= buffer + strlen(buffer); //aponta para o fim da cadeia + 1 exchange (i, f); }