|
Intel 8086 versus AVR AT90S2313:
modos de endereçamento |
|
Prof. Célio Guimarães
Atualizado em: 14/09/2004
Este documento procura mostrar semelhanças e diferenças entre os
modos de endereçamento do Intel 8086 e do microcontrolador
AVR 90S2313 da Atmel, de forma a facilitar a transição da
programação em linguagenm de montagem do 8086 para o AVR 90S2313.
Uma boa introdução à arquitetura do AVR 90S2313 encontra-se na seção
"Architectural Overview" do datasheet manual, pgs 5 - 18.
Leia-a antes de qualquer outra coisa.
Por ter uma arquitetura RISC todas as instruções do AVR 90S2313 possuem o mesmo tamanho,
16 bits, com exceção das instruções de endereçamento direto, LDS e STS que ocupam
32 bits. Um ponto importante a lembrar é que a arquitetura dita Harvard
dos microcontroladores AVR possui internamente barramentos separados para instruções
(16 bits) e para dados (8 bits). Estes espaços distintos de endereçamento são
chamados de área de programa (read only) e área de dados (read/write). Uma instrução
especial (LPM) permite ler dados (constantes) armazenados na área de programa.
As primeiras 32 posições de memória RAM funcionam como registradores de propósito
geral, denotados R0 a R31. A notação Rr refere-se a um deles como operando fonte
de uma instrução e Rd como operando destino. Além disso os pares de registradores
(R26, R27), (R28, R29) e (R30, R31) podem ser usados como apontadores de 16 bits
e são chamados, respectivamente de X, Y e Z. Este recurso é inestimável para operar
com vetores e na implementação do compilador C para a família AVR.
O registrador de estado (SREG), apontador para pilha (SP), e vários outros
registradores para contrôle de E/S e de interrupções encontram-se nas 64 posições
seguintes da memória RAM (endereços 0x20-0x5F), que são chamadas de espaço de E/S.
A memória RAM para dados (denominada SRAM - Static RAM) ocupa os 128 bytes
subsequentes (endereços 0x60 a 0xDF no modelo AT90S2313).
1. Instruções de movimentação de dados
São semelhantes ao MOV do 8086, porém com vários (infelizmente) mnemônicos especializados:
- as instruções LD (LoaD) e LDD (Load with Displ) carregam num registrador um byte
da memória SRAM apontado por um dos indexadores X, Y ou Z (coletivamente chamados W, a seguir);
- as instruções ST(STore) e STD (STore with Displ) armazenam um registrador (8 bits)
no byte da memória SRAM apontado por um dos indexadores X, Y ou Z;
- os registradores X, Y e Z podem adicionalmente usar pós-decrementação
(indicado por W+) ou pré-decrementação (indicado por -W).
- a notação a seguir: [W] (do NASM) indica que o operando é a posição de memória apontada
por W. Observe que os manuais do AVR usam a notação: (W)
- LPM é a única instrução que permite ler (em R0) constantes armazenadas na área de programa
(apontadas pelo registrador Z: como a área de programa é endereçada pela CPU a nivel de
16 bits, o endereço colocado em Z deve ser sempre: rótulo * 2).
Instrução | Efeito |
MOV Rd, Rr | Rd := Rr |
LD Rd, W | Rd := [W] Obs: W = X, Y ou Z |
LD Rd, W+ | Rd := [W], W := W + 1
|
LD Rd, -W | W := W - 1, Rd := [W], |
ST W, Rr | [W] := Rr |
ST W+, Rr | [W] := Rr, W := W + 1, |
ST -W, Rr | W := W - 1, [W] := Rr |
LDD Rd, W+q | Rd := [W + q] , 0 ≤ q ≤ 63 |
STD W+q, Rd | [W + q] := Rd , 0 ≤ q ≤ 63 |
LDS Rd,end | Rd := [end]
Endereçamento direto à RAM: end tem 16 bits (instrução: 32 bits) |
STS end, Rd | [end] := Rd
Endereçamento direto à RAM: end tem 16 bits (instrução: 32 bits) |
LPM | R0 := [Z]
byte apontado por Z na região de instruções |
2. Instrução de comparação seguida de salto condicional
Admite tanto comparação de operandos de 8 bits com sinal como sem sinal.
As instruções de salto condicional são mais restritas no AVR que no 8086,
conforme mostra a tabela de equivalências abaixo
(onde na significa não se aplica):
Comparação 8086 x AVR 90s2313
|
com sinal |
sem sinal |
operação |
8086 |
AVR |
8086 |
avr |
= |
je (jz) |
breq |
je (jz) |
breq |
!= |
jne (jnz) |
brne |
jne (jnz) |
brne |
< |
jl |
brlt |
jb |
brlo |
<= |
jle |
na |
jbe |
na |
>= |
jge |
brge |
jae |
brsh |
> |
jg |
na |
ja |
na |
3. Operandos imediatos
-
As instruções LDI, SUBI, CPI, ANDI, ORI e SBCI tomam como 2º operando uma constante
de 8 bits ( 0 ≤ valor ≤ 255) e como 1º operando um dos registradores
R16 - R31 (ou seja, os primeiros 16 registradores não podem usá-las).
- As instruções de precisão dupla (16 bits)
ADIW e SBIW somam/subtraem a/de um dos registradores apontadores X, Y ou Z,
uma constante de 6 bits (0 ≤ valor ≤ 63).
- Observe que existe uma instrução para subtração de um valor imediato de
um registrador (SUBI) mas não uma de adição com valor imediato.
Quando quiser somar uma constante a um registrador, digamos, Rd,
Você pode usar o truque baseado na equivalência matemática:
Rd + K ≡ Rd - (-K) e codificar:
SUBI Rd,-K
4. Instruções de salto e chamada de subrotina
- As instruções RJMP e RCALL (salto relativo e chamada relativa) permitem
saltar (chamar) para um endereço relativo ao PC (-2048 a 2047 instruções).
- As instruções IJMP e ICALL (indirect Jump, Indirect Call) permitem
saltar (chamar) para o endereço (na área de programa) contido no registrador Z.
- O registrador apontador para o topo da pilha SPL (SPL = end I/O 0x3D)
deve ser previamente inicializado para que as instruções RCALL e ICALL possam
ser usadas (elas empilham o endereço de retorno em 2 bytes da pilha, porém
decrementando o SP após empilhar o endereço de retorno)
5. Programando em assembler no AVR AT90S2313
-
Um resumo do conjunto de instruções do modelo AT90S2313 está no documento
avr_instr_set.pdf, que é suficiente para
fazer programas simples.
O manual completo do conjunto de instruções
(instruction set) detalha todas as instruções da
família de microcontroladores AVR (alguns com capacidade de endereçamento de instruções
e de dados bem maior que a do AVR AT90S2313). Algumas delas não estão disponiveis
no AT90S2313.
- Diretivas e sintaxe da linguagem
de montagem (assembler) encontram-se neste manual sucinto
assembler user guide
- Para dominar os vários recursos de E/S e de interrupções do AT90S2313
V. deve consultar o manual do
datasheet.
- O ambiente Windows de programação/simulação AVR Studio é livre e bastante
simples de usar. Será detalhado em aula; no documento a seguir
V. encontrará um manual sucinto de uso do AVR Studio.
V. encontrará um arquivo de instalação
aqui.
Hospedado na sourceforge.net existe um compilador C/C++ (avr-gcc)
para a família AVR no ambiente Windows. Você pode baixar a partir deste
link o programa de instalação do ambiente
WinAVR.