ARM Advanced RISC Machine


I    Evolução da Família;
¡@
II   Esquema geral de funcionamento;
¡@
III  Tipos de dados aceitos;
¡@
IV  Gerenciamento de memória;
¡@
V   Endereçamento de memória;
¡@
VI   Informações de mercado;
¡@
VII  Assembly;
¡@
VIII Estrutura de procedures e functions;
¡@
IX  Exemplos de lógicas em Assembly;
¡@
X   Referências Bibliográficas.

Conjunto de Instruções

A arquitetura do conjunto de instruções do ARM evoluiu significativamente desde sua primeira versão. Para saber quais instruções existem em alguma implementação do ARM, é preciso conhecer as cinco versões principais do conjunto de instruções foram definidas até o momento. Muitas das versões podem ser classificadas através de letras para especificar coleções de instruções que foram incluídas em uma dada versão. Essas coleções variam de bastante pequenas (a letra M indica a adição de apenas 4 novas instruções) a bastante grandes (a letra T indica a adição de todo o conjunto de instruções Thumb). A letra T indica se o processador é capaz de executar código no modo Thumb, enquanto que a letra D indica se o processador possui extensões DSP.

As cinco versões principais do conjunto de instruções do ARM são:

Versão 1: essa versão foi implementada somente no ARM1, e nunca foi utilizada em um produto comercial. Ela continha:

¡V as instruções básicas de processamento de dados (multiplicação não incluída);

¡V instruções de load/store para byte, word e multi-word;

¡V instruções de branch, incluindo uma instrução branch-and-link para chamadas de subrotinas;

¡V uma instrução para interrupção de software, para chamadas ao sistema operacional.

Essa versão possuía um espaço de endereçaamento de apenas 26 bits, e está obsoleta.

 

Versão 2: essa versão estendeu a arquitetura da versão 1 pela adição de:

¡V instruções de multiplicação e multiplicação acumulativa;

¡V suporte a coprocessadores;

¡V dois registradores em banco a mais para o modo de interrupção rápida;

¡V instruções atômicos de load-e-store chamadas SWP e SWPB (numa variação um pouco mais nova chamada versão 2a).

As versões 2 e 2a ainda possuíam apenas 26 bits de espaço de endereçamento, e também estão obsoletas.

¡@

Versão 3: essa versão da arquitetura estendeu o alcance de endereçamento para 32 bits. A informação do status do programa, que até então era armazenada no registrador R15, foi movida para um novo registrador, chamado Current Program Status Register (CPSR), e registradores Saved Program Status Registers (SPSRs) foram adicionados para preservar o conteúdo de CPSR quando da ocorrência de uma exceção. Como conseqüência, houve as seguintes mudanças no conjunto de instruções:

¡V duas instruções (MRS e MSR) fora m adicionadas para permitir o acesso aos novos registradores (CPSR e SPSRs);

¡V a funcionalidade das instruções utilizadas em versões anteriores para retornar de exceções foi modificada para que elas pudessem continuar sendo utilizadas com esse propósito.

A versão 3 também adicionou dois novos modos de uso do processador para possibilitar o uso efetivo das exceções Data Abort, Prefetch Abort e Undefined Instruction no código do sistema operacional. A compatibilidade com as versões de arquitetura 26 bits foi adotada na versão 3, exceto numa variação chamada versão 3G. As diferenças entre as versões 3 e 3G estão obsoletas atualmente.

¡@

Versão 4: essa versão estendeu a arquitetura da versão 3 com a adição de:

¡V instruções de load/store para halfword (16 bits);

¡V instruções para ler e estender o sinal para bytes e halfwords;

¡V nas variações T, uma instrução para transferir para o estado Thumb;

¡V um novo modo de uso privilegiado do processador que usa os registradores do User mode.

Na versão 4 também deixou-se claro quais instruções deveriam causar a exceção Undefined Instruction. A compatibilidade com versões 26 bits deixou de ser obrigatória.

¡@

Versão 5: essa versão estende a versão 4 pela adição de instruções e por pequenas modificações nas definições de algumas instruções existentes para:

¡V aumentar a eficiência do trabalho conjunto ARM/Thumb nas variações T;

¡V permitir que as mesmas t´ecnicas de geração de código das variações T sejam usadas nas demais variações.

¡@

Além disso:

¡V adiciona uma intrução que conta o número de zeros à esquerda, que permite, por exemplo, aumentar a eficiência da divisão inteira e das rotinas de priorização de interrupção;

¡V adiciona uma instrução para breakpoint de software;

¡V adiciona mais opções de instrução para designers de coprocessadores;

¡V torna mais precisa a definição de como as flags são habilitadas por instruções de multiplicação.

 

Formato das instruções

Na figura 1 é mostrada a codificação do conjunto de instruções do ARM. Uma entrada entre colchetes indica que mais informação será fornecida adiante.

1. O campo cond não pode ser 1111 nessa linha;

2. Se o opcode é da forma 10xx e o bit S for 0, uma das linhas em seqüência se aplica no lugar;

3. UNPREDICTABLE em arquiteturas ARM anteriores à versão 4;

¡@

Figura 1: Codificação das instruções ARM

4. UNPREDICTABLE em arquiteturas ARM anteriores à versão 5;

5. Se o campo field é 1111, a instrução é UNPREDICTABLE em arquiteturas ARM anteriores à versão 5;

6. Instruções de transferência dupla de registradores são características das versões Enhanced DSP Extension;

7. Nas variações E das arquiteturas 5 em diante, a instrução de preload de

cache PLD utiliza um pequeno número dessas codificações de instrução.

 

Instruções extras de multiplicação e load/store 

Na figura 2 são mostradas as instruções extras de load/store e de multiplicação. Uma entrada entre colchetes indica que mais informação será fornecida adiante.

Figura 2: Codificação das instruções extras de multiplicação e load/store

1. UNPREDICTABLE em arquiteturas ARM anteriores à versão 4;

2.Instruções características das versões Enhanced DSP Extension.

¡@

Outras instruções

Na figura 3 são mostradas as codificações das instruções ARM remanescentes. Uma entrada entre colchetes indica que mais informação será fornecida adiante.

Figura 3: Codificação das demais instruções

1. Definida na arquitetura ARM versão 5 em diante, e nas variações T da arquitetura ARM versão 4;

2. Essa é uma instrução indefinida na arquitetura ARM versão 4, e é UNPREDICTABLE em arquiteturas anteriores à versão 4;

3. Se o campo cond dessa instrução não é 1110, é UNPREDICTABLE;

4. Instruções específicas de DSP.

 

Tipos de instrução

O conjunto de instruções do ARM pode ser dividido em seis classes:

• Instruções de branch;

• Instruções de processamento de dados (aritmética e lógica);

• Instruções para transferência do registrador de status;

• Instruções de load e store;

• Instruções de coprocessador;

• Instruções para geração de exceções. 

A maioria das instruções de processamento de dados e um tipo de instrução de coprocessador podem atualizar os quatro bits de flags de condição do CPSR (Negative, Zero, Carry e oVerflow) de acordo com o seu resultado.

Quase toda instrução do ARM possui um campo para execução condicional de 4 bits. Um valor desse campo especifica que a instrução é executada incondicionalmente. Outros quatorze valores especificam a execução condicional da instrução. Se no momento que uma instrução for executada os flags de condição indicarem que a condição correspondente é verdadeira, a instrução é executada normalmente, caso contrário a instrução é entendida como um NOP. Essas 14 condições permitem:

• testes para igualdade e desigualdade;

• testes para desigualdade <, <=, > e >=, tanto para valores com ou sem sinal;

• cada flag de código de condição ser testado individualmente.

O décimo sexto valor do campo de condição é usado para algumas instruções que não permitem condição condicional. Na figura 4 são mostrados as condições disponíveis, seus códigos e significados.

Figura 4: Códigos de execução condicional

Quando mnemônicos alternativos são mostrados na mesma linha da tabela da figura 4 significa que há mais de uma forma de se interpretar aquela condição. Por exemplo, na terceira linha o mesmo valor do campo de condição pode ser atribuído pelos mnemônicos CS ou HS. Ambos fazem com que a instrução seja executada somente se o bit C do CPSR está ativo. As alternativas estão disponíveis porque o mesmo teste é usado em diferentes circunstâncias.

Se logo após somar dois números inteiros sem sinal, o programador desejar saber se houve um carry-out na soma, deve usar CS. Se o programador acaba de comparar dois números sem sinal e deseja testar se o primeiro é maior que o segundo, deve usar HS. Essas alternativas para uma mesma condição fazem com que o programador não precise se lembrar que uma comparação sem sinal ativa o carry sempre que o resultado for maior ou igual.

Note que as condições aparecem em pares, onde a segunda condição é o inverso da primeira, de forma que para qualquer condição a oposta também é disponível ¡V com exceção de ¡¦always¡¦, uma vez que ¡¦never¡¦ é reservada. Assim, sempre que um bloco if...then puder ser implementado com instruções sujeitas a uma condição, o bloco do else pode ser implementado com instruções sujeitas à condição inversa.

 

Branch and eXchange (BX)

Essa é uma instrução disponível apenas nos processadores ARM mais recentes e foi adicionada como um mecanismo para fazer o processador executar instruções Thumb. Uma instrução similar Thumb faz a volta para o modo normal ARM 32 bits.

O bit Rm[0] é copiado para o bit T do CPSR e os bits [31:1] ou [31:2] são copiados para o PC:

• Se Rm[0] for 1, o pocessador muda para o modo Thumb e começa a exceutar a partir do endereço indicado em Rm alinhado por palavra (forçando seus 2 bits menos significativos para zero);

• Se Rm[0] for 0, o processador continua executando instruções ARM e começa a executar a partir do endereço indicado em Rm alinhado por palavra (forçando seus 2 bits menos significativos para zero).

Alguns processadores ARM mais novos que não dão suporte a Thumb fazem um trap dessa instrução , permite emulação via software do Thumb. Formato assembler:

 

BX {<condição>} Rm

 

Software Interrupt (SWI)

A instrução de interrupção de software é usada para chamadas ao sistema operacional. Ela faz com que o processador entre em modo supervisor e comece a executar instruções a partir do endereço 0x08. O imediato de 24 bits não influencia na operação da instrução, mas pode ser interpretado pelo sistema. Se a condição é satisfeita o processador entra em modo supervisor usando a seqüência padrão para exceção do ARM. Em detalhes, as ações do processador são:

1. Salvar o endereço seguinte à instrução SWI no shadow register R14 svc;

2. Salvar CPSR em SPSR svc;

3. Entrar em modo supervisor e desabilitar as IRQs (mas não as FIQs), mudando CPSR[4:0] para 100112e CPSR[7] para 0;

4. Muda PC para 0816e começa a executar instruções a partir dali. Formato assembler: 

SWI {<condição>} <imediato de 24 bits>

 

Instruções de procesamento de dados 

As instruções de procesamento de dados do ARM são usadas para modificar os valores dos dados nos registradores. As operações suportadas incluem operações aritméticas e operações lógicas bit a bit entre dois dados de 32 bits. Um operando pode sofrer um shift ou rotação antes de chegar à ALU, permitindo, por exemplo, shift e soma numa única instrução. Instruções de multiplicação usam formatos distintos, e são consideradas separadamente.

As instruções de procesamento de dados do ARm empregam um formato de 3 endereços. Um dos operandos source é sempre um registrador, enquanto que o outro pode ser um registrador ou um imediato. O shift aplicado no segundo operando (se ele for um registrador) pode ser um shift lógico ou uma rotação, e pode ser de uma quantidade definida com um imediato ou através de um quarto registrador.

Quando o código de uma instrução não necessita de todos os campos (por exemplo, MOV ignora Rn e CMP ignora Rd), os campos de registrador não utilizados precisam ser preenchidos com zeros. O assembler faz isso automaticamente.

Essas instruções permitem controle direto de se sua execução altera ou não os códigos de condição do processador através do bit S (bit 20). Se esse bit for zero, os códigos não são mudados.

Se for um (e Rd não for R15): 

1. A flag N é ativada se o resultado for negativo. Caso contrário é desativada;

2. A flag Z é ativada se o resultado for zero. Caso contrário é desativada;

3. A flag C é ativada de acordo com o carry-out da ALU quando é uma operação aritmética, ou de acordo com o carry-out do shifter, caso contrário. Se não for solicitado um shift, C é mantido inalterado;

4. A flag V é preservada em operações não aritméticas. É ativada numa operação aritmética se houver um overflow. Formato assembler: A representação em assembler é um das duas a seguir, omitindo Rn para MOV e MVN, ou Rd para CMP, CMN, TST e TEQ:

<op>{<condição>}{S} Rd, Rn, #<imediato de 32 bits>

<op>{<condição>}{S} Rd, Rn, Rm, {<shift>}

 

A arquitetura Thumb

O conjunto de instruções Thumb existe para atender à questão da densidade do código. Ele pode ser visto como uma forma comprimida se um subconjunto do conjunto de instruções do ARM. Instruções Thumb são mapeadas em instruções ARM, e o modelo (para o programador) Thumb é mapeado para o modelo (para o programador) ARM. Implementações do Thumb usam decompressão dinâmica em um pipeline de instruções ARM, e então as instruções são executadas como instruções ARM dentro do processador.

A arquitetura Thumb não é uma arquitetura completa, de forma que um processador possa executar instruções Thumb sem também ser capaz de executar instruções ARM. Dessa forma, o conjunto de instruções Thumb serve apenas para funções comuns da aplicação, permitindo utilizar o conjunto de instruções ARM quando necessário.

Processadores ARM que suportam o conjunto de instruções Thumb executam no modo Thumb (instruções de 16 bits) ou no modo ARM (instruções de 32 bits) conforme o bit T do CPSR. Se T for estiver ativo, o processador interpreta as instruções como sendo de 16 bits, caso contrário, como sendo de 32 bits.

Uma forma explícita de se voltar a executar no modo ARM é através da instrução Thumb BX. Uma retorno impl´ıcito ao modo ARM acontece sempre ue houver uma exceção, uma vez que exceções são tratadas no modo ARM.

Todas as instruções Thumb são de 16 bits. Elas são mapeadas em intruções ARM, de forma que elas herdam várias propriedades do conjunto de instruções ARM:

• A arquitetura load-store com instruções para processamento de dados, transferência de dados e controle de fluxo;

• Suporte a dados em formato byte, halfword e palavra;

• Uma memória não segmentada endereçável por 32 bits.

Entretanto, para alcançar um tamanho de 16 bits, algumas características das instruções ARM são abandonadas:

• A maioria das instruções Thumb são executadas incondicionalmente;

• Muitas das instruções de processamento de dados usam um formato de 2 endereços;

• As instruções Thumb possuem formatos menos regulares do que as instruções AR

¡@

Comparação de código com MIPS

Como um exemplo para ilustrar o uso do ARM, vamos comparar a codificação do pequeno código C abaixo em instruções do MIPS e do ARM:

if (a == 0 || b == 1)

c = d + e;

MIPS:

beq $s0, $zero, SOMA # compara ¡¦a¡¦ com 0

addi $t0, $zero, 1

bne $s1, $t0, FIM

SOMA:

add $s2, $s3, $s4

FIM:

ARM:

CMP R0, #0

CMPNE R1, #1

ADDEQ R2, R3, R4

# t0 = 1

# se a != 0, compara b com 1

 

# se a == 0 ou b == 1, c = d + e

 

; compara ¡¦a¡¦ com 0

; se a != 0, compara b com 1

; se a == 0 ou b == 1, c = d + e

 

Esse exemplo ilustra bem a utilização da execução condicional das instruções ARM: a segunda instrução só é executada se a6= 0, e a soma só é executada se alguma das duas comparaçõ der verdadeiro.

¡@

Voltar