Pequeno resumo de assembly
Explique a funcionalidade do seguinte código comentando-o:
inic:
ser r16 ; Manipulação do registo r16 colocando todos os seus bits a “UM”; out PORTA,r16 ; Passagem do conteúdo de r16 para PORTA. Prevenção tomada antes de definir o Porto como entrada ou saída de dados; out DDRA,r16 ; Passagem do conteúdo de r16 para DDRA que vai definir o “Porto A” como saída da dados; clr r16 ; Manipulação do registo r16 colocando todos os seus bits a “ZERO”; sts DDRF,r16 ; “Repõe-se” o valor contido em r16 em DDRF o que vai fazer com que o “Porto F” funcione como entrada de dados pois o valor de DDRF = “0”; ldi r16,0b11000000 ; Carregamento imediato do valor “0b11000000” para o registo r16; sts PORTF,r16 ; “Repõe-se” o valor contido em r16 em PORTF o que vai fazer com que o “Porto F” tenha ZERO nos 6 bits menos significativos e UMs nos restantes dois bits, mais significativos. ret ;Devolve o endereço da stack e volta da função inic para onde estava;
Caracterização das instruções: * LDS/STS – Comandos para movimentar dados de ou para a Memória de Dados SRAM. O comando LDS vai carregar os dados de uma dada posição da memória que queremos mover ou utilizar para um registo e, mais tarde, o comando STS vai repor os dados novamente para a memória mas no novo local para onde desejamos move-los. * IN/OUT – Comandos para movimentar dados da ou para a Memoria ou Portos de Input/Output ou dos endereços $0020 ao $005F da Memória de dados SRAM.
NOTA: As instruções IN/OUT necessitam de menos ciclos do clock do que as instruções LDS/STS, para serem realizadas. * LDI – Comando que realiza um carregamento imediato de um valor para um registo na memória. Registo este que só pode ser utilizado para registos de R16 até R31. * MOV – Comando normalmente utilizado para copiar o conteúdo de um registo para outro, por exemplo, para que não se perca a