Você está na página 1de 51

Algoritmos e Estrutura

de Dados Avançado
Exemplos de Linguagens de máquina e
linguagem de montagem Assembly utilizando
ATmega328p

Prof. PhD. Antonio C. Zena

E-mail: antonio.zena@anhanguera.com
ATmega328
ATmega328P É um microcontrolador criado pela Atmel, pertencente à série
megaAVR. Atualmente pertence à Microchip. Em relação aos seus parâmetros e
características técnicas mais destacadas são:
•Arquitetura AVR de 8 bits
•Flash de 32 KB
•1 KB EEPROM
•SRAM de 2 KB
•23 linhas de E / S de uso geral
•32 registros de uso geral
Linguagem Assembly e Linguagem de Máquina
➢ Linguagens de baixo nível.
➢ Programação mais complexa e exige maior esforço.
➢ Permitem obter o máximo de desempenho.
➢ Cada processador possui conjunto próprio de instruções.
➢ O ATmega328 possui 131 instruções.
➢ Mmneumônicos para representar as instruções assembly.
➢ Assembly é diferente da “Linguagem de máquina”.
Estrutura do ATmega328
O núcleo AVR utiliza 32 registradores de trabalho
diretamente conectados à Unidade LógicoAritmética
(ALU – Arithmetic Logic Unit), permitindo que dois
registradores independentes sejam acessados com uma
simples instrução em um único ciclo de clock. R0 a
R15 não carregam constantes diretamente. Apenas os
registradores de R16 a R31 carregam uma constante
imediatamente com a instrução LDI.
Seis desses registradores podem ser usados
como registradores de endereçamento indireto
de 16 bits (ponteiros para o acesso de dados),
denominados X, Y e Z.
São capazes de apontar endereços da SRAM
com até 16 bits (X, Y ou Z) ou localizações na
memória do programa (Z).
Instruções
Instruções - Legenda
Conjunto de Instruções 17:55
Todas as instruções que operam com registradores de uso geral têm acesso
direto em um único ciclo a todos eles. As exceções são as cinco instruções
lógicas e aritméticas entre uma constante e um registrador, SBCI, SUBI, CPI,
ANDI e ORI, e a instrução para carga de constante imediata, LDI. Essas
instruções se aplicam somente a metade superior dos registradores de uso
geral (R16...R31). As instruções SBC, SUB, CP, AND, OR e as demais
operações entre um ou dois registradores se aplicam a todo o banco de
registradores.
Primeiro Programa em Assembly

Como somar 0x0B + 0x73?


Primeiro Programa em Assembly

Como somar 0x0B + 0x73?


01: ; Calculo da soma dois valores em assembly
02: início:
03: LDI R16,0x0B ;carrega val1 em R16
04: LDI R17,0x73 ;carrega val2 em R17
05: ADD R16,R17 ;R16 = R16 + R17
06: loop:
07: RJMP loop ;Retorna para Loop
aver and sam download archive
Memória SRAM – Acesso direto

➢ Instrução STS (STore direct to data Space) - Armazena o conteúdo de um


registrador em um endereço da memória de dados.
➢ Instrução LDS (Load direct from data Space) – Carrega o conteúdo de um
endereço da memória de dados para um registrador.
➢ Conforme visto anteriormente, a memória SRAM inicia seu endereço a partir do
endereço 0x0100.
Memória SRAM – Acesso direto

01: inicio:
02: LDI R16, 0x87;carrega R16 com 0x87
03: STS 0x100, R16 ;copia o conteúdo do R16 para; o endereço
de memória 0x100
04: LDS R20, 0x100 ;Copia o conteúdo do endereço; de memória
0x100 para R20
05: loop:
06: RJMP loop
Divisão em Assembly - Fluxograma

Lenda:
R0 ← Dividendo
R1 ← Divisor
R2 ← Divisão
R3 ← Resto
Divisão em Assembly - Fluxograma
00: inicio:
01: LDI R16,220 ;carrega R16 com dividendo
02: MOV R0 ,R16 ;copia o valor de R16 para R0
03: LDI R16,15 ;carrega R16 com divisor
04: MOV R1 ,R16 ;copia o valor de R16 para R1
05: RCALL divide ;chama a rotina de divisão
06: loop:
07: RJMP loop ;Retorna para loop
08: divide:
09: CLR R2 ;Limpa R2
10: MOV R4,R0 ;Copia R0 para R4 para preservar R0
11: div_loop:
12: SUB R4,R1 ;Subtrai R4 <- R4 - R1
13: BRLO div_sair ;Desvia se R4 < R1 antes da subtração
14: INC R2 ;Incrementa R2
15: RJMP div_loop ;Retorna para div_loop
16: div_sair:
Lenda:
17: ADD R4,R1 ;Calcula resto R4 <- R4 + R1
R0 ← Dividendo
18: MOV R3,R4 ;Copia R3 <- R4
R1 ← Divisor
19: RET ;Sai da função
R2 ← Divisão
R3 ← Resto
Perguntas?

13/03/2024

Você também pode gostar