Intel 8086 versus AVR AT90S2313:
modos de endereçamento

Prof. Célio Guimarães
Atualizado em: 20/08/2007  

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.
O tamanho de espaço de endereçamento de programa é de 64KB (2**16 bytes) e o do espaço de dados é também 64KB, porém a capacidade instalada no modelo 90S2313 é muito menor, apenas 2KB para instruções (1K instruçoes de 16 bits cada) e 96 bytes para dados, incluindo os registradores de propósito geral, veja a seguir (a capacidade física da memória de programa e de dados varia conforme o modelo da família AVR).

As primeiras 32 posições de memória RAM funcionam como registradores de propósito geral (acumuladores), 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 (indexadores) 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, acessíveis diretamente através das instruções de entrada e saída in e out, tomando como operando um valor de 0 a 0x3F (ou seja, um endereço no espaço de E/S e que o datasheet denomina de Port).
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:

  1. 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);
  2. 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;
  3. os registradores X, Y e Z podem adicionalmente usar pós-decrementação (indicado por W+) ou pré-decrementação (indicado por -W).
  4. 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)
  5. LPM é a única instrução que permite ler (em R0) constantes armazenadas na área de programa (apontadas pelo registrador Z: a área de programa é endereçada pela CPU a nivel de 8 bits, porém o montador calcula o endereço dos rótulos de instruções em palavras de 16 bits, portanto o endereço a ser colocado em Z pelos programas deve ser sempre: rótulo * 2).

InstruçãoEfeito
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

4. Instruções de salto e chamada de subrotina

5. Programando em assembler no AVR AT90S2313

  1. 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.

  2. Diretivas e sintaxe da linguagem de montagem (assembler) encontram-se neste manual sucinto assembler user guide

  3. Para dominar os vários recursos de E/S e de interrupções do AT90S2313 V. deve consultar o manual do datasheet.

  4. 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. A versão 4.12 (para Windows) + Service Pack 4 já inclui o compilador C/C++ avr-gcc e é de uso livre. V. pode baixá-los diretamente do site da Atmel: AVR Studio 4.12 e Service Pack 4.