Capítulo 2

Propaganda
Sistemas Embebidos I
Licenciatura em Eng. de Electrónica e Telecomunicações e de Computadores
Licenciatura em Engenharia Informática e de Computadores
Mestrado em Engenharia Informática e de Computadores
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
II. Arquitectura ARM
1. Perspectiva histórica
 Arquitectura RISC desenvolvida na ACORN Computers Limited em Cambridge entre
1983 e 1985. A arquitectura foi usada no desenvolvimento do primeiro processador
RISC para fins comerciais.
 Em 1990 foi fundada a ARM Limited com o intuito de melhorar e explorar a
comercialização da arquitectura ARM, tendo sido adoptado como modelo de negócio o
licenciamento da propriedade intelectual (IP cores).
 Actualmente a arquitectura ARM é líder de mercado, detendo 25% do mercado de
vendas de IP cores de microprocessadores e sendo responsável por 32% do volume de
vendas de microprocessadores (dados de 2005 da ARM).
 A arquitectura ARM é usada em áreas tão diversas como redes de computadores,
indústria automóvel, sistemas de segurança ou consumo doméstico.
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
2
II. Arquitectura ARM
2. Caracterização da arquitectura
 Arquitectura RISC com organização Load-Store e 3(5) andares de pipeline.
 Conjunto de instruções reduzido e de dimensão fixa (32-bit):
 Instruções aritméticas e lógicas com 3 endereços (2 operandos e destino);
 Utilização do segundo operando com deslocamento/rotação;
 Transferências de dados múltiplas entre registos e a memória;
 Organização de memória nos formatos big-endian e little-endian (por definição);
 Execução condicional de todas as instruções;
 Execução de instruções em 1(2) ciclos de relógio;
 Possibilidade de expansão do conjunto de instruções através do uso de um coprocessador.
 Espaço de endereçamento de 4GB que inclui o mapeamento de periféricos para E/S.
 16 registos de 32-bit para uso geral.
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
3
II. Arquitectura ARM
2. Caracterização da arquitectura
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
4
II. Arquitectura ARM
3. Modelo de programação
 Banco de registos de 32-bit com 16 registos:
 13 registos de 32-bit de uso geral (R0-R12).
 Stack Pointer (SP) situa-se no registo R13.
 Link Register (LR) situa-se no registo R14.
 Program Counter (PC) situa-se no registo R15.
 Current Program Status Register (CPSR)
Registo de 32-bit onde é guardado o estado interno do processador, composto pelo
modo de execução, estado das flags e bits de controlo das interrupções.
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
N Z C V -
-
-
-
oVerflow
Carry
Zero
Negative
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
I F T
Modo
Interrupção
Interrupção Prioritária
Conjunto de instruções Thumb
Modo de funcionamento do processador
 O estado do processador é definido pelos 15 registos de uso geral em modo user, pelo
PC e pelo CPSR.
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
5
II. Arquitectura ARM
4. Conjunto de instruções
 Na arquitectura ARM as instruções são agrupadas em três classes:
 Instruções de processamento de dados
Modificam o valor dos registos por aplicação de um operador lógico/aritmético a
um ou dois operandos contidos em registos e guardam o resultado da operação num
outro registo.
Exemplos: ADD, SUB, MUL, AND, OR e MOV.
 Instruções de transferência de dados
Permitem a transferência de informação de um registo/posição de memória/porto
de E/S para um outro destino sem procederem a qualquer alteração dos dados.
Exemplos: LDR, LDMIA e STR.
 Instruções de controlo
Afectam o valor do PC possibilitando a alteração da sequência normal de instruções,
de uma forma condicional ou incondicional, para além de permitirem definir a
próxima instrução a ser executada.
Exemplos: B, BEQ, BNE e BL.
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
6
II. Arquitectura ARM
4. Conjunto de instruções
 Cada instrução é codificada com um conjunto de 32-bit especificando




código de operação;
o(s) operando(s) a usar;
a localização onde deverá ser guardado o resultado da operação;
a condição que deve ser verificada para a sua execução.
 Quase todas as instruções permitem actualizar o estado das flags do processador (N,
Z, C e V), bastando para tal acrescentar o sufixo S ao opcode da instrução. Esta
abordagem torna possível a preservação do estado das flags do processador em blocos
de código extensos.
 Todas as instruções podem ser executadas de uma forma condicional através da
especificação de um sufixo. Esta opção de projecto possibilita:
 o desenvolvimento de um conjunto de instruções mais reduzido para a mesma
funcionalidade pretendida;
 o aumento do desempenho do processador;
 redução do número de saltos em programas.
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
7
II. Arquitectura ARM
4. Conjunto de instruções
 Lista de condições disponíveis:
Opcode
Mnemónica
Interpretação
Flag(s) actualizadas
0000
EQ
Igual / Igual a zero
Z=1
0001
NE
Diferente
Z=0
0010
CS/HS
Carry a ‘1’ / Superior ou igual (números s/ sinal)
C=1
0011
CC/LO
Carry a ‘0’ / Inferior (números s/ sinal)
C=0
0100
MI
Menor / Negativo
N=1
0101
PL
Maior / Positivo ou zero
N=0
0110
VS
Overflow
V=1
0111
VC
Sem overflow
V=0
1000
HI
Superior (números s/ sinal)
C = 1 and Z = 0
1001
LS
Inferior ou igual (números s/ sinal)
C = 0 or Z = 1
1010
GE
Superior ou igual (números c/ sinal)
N=V
1011
LT
Inferior (números c/ sinal)
N≠V
1100
GT
Superior (números c/ sinal)
Z = 0 and N = V
1101
LE
Inferior ou igual (números c/ sinal)
Z = 1 or N ≠ V
1110
AL
Sempre
Qualquer
1111
NV
Nunca
Nenhuma
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
8
II. Arquitectura ARM
4. Conjunto de instruções: processamento de dados
 As instruções de processamento de dados dividem-se em quatro subclasses:
 Operações aritméticas
Realizam operações aritméticas (soma e subtracção), com ou sem carry, sobre dois
operandos inteiros representados a 32-bit, com ou sem sinal.
Exemplos:
ADD r0, r1, r2
SUB r0, r1, #1
RSB r0, r1, r2
ADC r0, r1, r2
SBC r1, r1, r2
RSC r0, r1, r2
 Operações lógicas
Realizam operações lógicas (and, or, xor) bit a bit sobre dois operandos de 32-bit.
Exemplos:
AND r0, r1, r2
ORR r0, r1, #0xF EOR r0, r1, r2
 Transferência de dados entre registos
Copiam o conteúdo do registo fonte, 32-bit, para o registo destino.
Exemplos:
MOV r0, r1
MVN r0, r1, LSL r2
 Comparações
Actualizam o valor das flags do processador com o resultado da comparação do
conteúdo de dois registos.
Exemplos:
CMP r1, r2
TST r1, r2
CMN r1, r2
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
TEQ r1, r2
9
II. Arquitectura ARM
4. Conjunto de instruções: processamento de dados
 As instruções de manipulação de dados têm tipicamente 3 endereços que são
independentes e podem ser repetidos na mesma instrução:
<opcode>{<cond>}{S} <Rd>, <Rn>, <oper2>
<oper2> := <Rm> |
<Rm>, {<shift_type> <Rs>} |
<Rm>, {<shift_type> #<shift_imm>} |
#<imm32>
 O primeiro endereço (Rd) identifica o registo de destino;
 O segundo endereço (Rn) identifica o registo que contém o primeiro operando;
 O terceiro endereço (oper2) identifica a origem do segundo operando, que pode ser
um registo, o valor guardado num registo após deslocamento ou uma constante.
 O valor da constante é especificado na forma m ROR 2n, em que 0≤m≤255 e 0≤n≤15.
 O deslocamento pode ser lógico ou aritmético, incluindo ou não a flag de carry
(rotação). O número de bits a deslocar especificado pelo conteúdo de um registo,
8-bit MSB, ou por uma constante de 5-bit.
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
10
II. Arquitectura ARM
4. Conjunto de instruções: processamento de dados
 Formas de deslocamento/rotação:
31
0
31
0
31
0
0
0
0 0
LSL, #1
31
ASR, #1
0
0 0
LSR, #2
0
31
RO R, #1
0
31
1
C
1 1
C
ASR, #1
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
0
0
RRX, #1
11
II. Arquitectura ARM
4. Conjunto de instruções: processamento de dados
 Casos particulares:
 Algumas instruções de processamento de dados têm apenas 2 endereços,
suprimindo o endereço do registo de destino (comparações) ou do primeiro
operando (transferência de dados entre registos);
 O registo r15 ou program counter (PC)
● Só pode ser usado como endereço de operando se o segundo operando não for
deslocado com base num valor guardado num dos registos de uso geral;
● Quando usado como endereço de operando fornece o valor da instrução actual
adicionado de 8, dada a arquitectura com 3 andares de pipeline do processador;
● Quando usado como endereço de destino permite alterar a sequência de
instruções do programa (semelhante a uma instrução de controlo);
● Quando é acrescentado o sufixo S ao opcode de uma instrução que tenha r15
como endereço destino, é executada uma instrução atómica que não só altera o
valor de r15 como ainda copia o valor de SPSR para CPSR.
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
12
II. Arquitectura ARM
4. Conjunto de instruções: processamento de dados
 Forma de codificação das instruções:
31
28 27 26 25 24
cond
00
#
21 20 19
opcode
S
16 15
Rn
12 11
0
Rd
2º operando
Registo destino
Registo 1º operando
Definir como instrução condicional
Função aritmética/lógica
11
1
8
7
0
#rot
constante 8-bit
Rotação por valor imediato
11
7
#shift
6
5
Sh
4
3
0
0
Rm
Rotação por valor imediato
0
Rotação por valor imediato
Rotação por valor imediato
11
8
Rs
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
7
0
6
5
Sh
4
1
3
0
Rm
13
II. Arquitectura ARM
4. Conjunto de instruções: processamento de dados
 Resumo das instruções de processamento de dados:
Opcode
Mnemónica
Significado
0000
AND
E lógico bit-a-bit
Rd := Rn AND Op2
0001
EOR
OU-EXCLUSIVO lógico bit-a-bit
Rd := Rn EOR Op2
0010
SUB
Subtracção
Rd := Rn - Op2
0011
RSB
Subtracção com comutação de operandos
Rd := Op2 – Rn
0100
ADD
Adição
Rd := Rn + Op2
0101
ADC
Adição com Carry
0110
SBC
Subtracção com Carry
Rd := Rn - Op2 + C – 1
0111
RSC
Subtracção com Carry e comutação de operandos
Rd := Op2 - Rn + C – 1
1000
TST
Teste
Scc entre Rn AND Op2
1001
TEQ
Teste de equivalência
Scc entre Rn EOR Op2
1010
CMP
Comparação
Scc entre Rn - Op2
1011
CMN
Comparação com negação do segundo operando
Scc entre Rn + Op2
1100
ORR
OU lógico bit-a-bit
1101
MOV
Cópia
1110
BIC
1111
MVN
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
Efeito
Rd := Rn + Op2 + C
Rd := Rn OR Op2
Rd := Op2
Rd := Rn AND NOT Op2
Cópia com negação
Rd := NOT Op2
14
II. Arquitectura ARM
4. Conjunto de instruções: controlo de execução
 O processador executa tipicamente as instruções de um programa de forma sequencial.
Para trocar a ordem de execução do programa para um outro ponto é necessário
alterar o valor de PC através de instruções de:
 Salto indirecto
Permite carregar o PC com o conteúdo de um registo de uso geral.
Exemplos:
SUB r15, r1, #1
MOV r15, r1
ADD r15, r1, r2
 Salto incondicional/condicional
Permite carregar o PC com o valor de uma constante positiva/negativa de 24-bit, em
que o valor da constante é relativo à instrução que está a ser executada. A execução
da instrução pode ou não ser condicional mediante a inclusão do sufixo da condição.
Exemplos:
B xpto1
BEQ xpto2
BGT xpto3
 Salto com ligação
São usadas nas chamadas a rotinas/funções, pelo que para além de terem um
funcionamento semelhante às instruções de salto incondicional/condicional fazem
ainda a cópia do valor de PC para o LR.
Exemplos:
BL xpto4
BLNE xpto5
BLLT xpto6
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
15
II. Arquitectura ARM
4. Conjunto de instruções: controlo de execução
 As instruções de controlo de execução têm assim apenas um endereço que identifica o
endereço da próxima instrução a executar, que pode ser o valor guardado num registo
ou uma constante (24-bit):
<opcode>{<cond>} <oper>
<opcode> := <B> | <BX> | <BL> | <BLX>
<oper>
:= <Rm> | #<imm24>
 Forma de codificação das instruções:
31
28 27
cond
25 24 23
101
L
0
valor imediato
Guardar PC em LR
constante 24-bit com sinal
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
16
II. Arquitectura ARM
4. Conjunto de instruções: controlo de execução
 Resumo das instruções de controlo de execução:
Tipo Salto
Interpretação
Utilização Típica
B
Incondicional
Executar salto sempre
BAL
Sempre
Executar salto sempre
BEQ
Igual
BNE
Diferente
BPL
Maior
Resultado positivo ou nulo
BMI
Menor
Resultado negativo
BCC
Flag de Carry a ‘0’
BLO
Inferior
BCS
Flag de Carry a ‘1’
Operação aritmética gerou carry-out
BHS
Superior ou igual
Resultado da comparação sem sinal é valor superior ou igual
BVC
Flag de overflow a ‘0’
Resultado da operação com sinal não gerou overflow
BVS
Flag de overflow a ‘1’
Resultado da operação com sinal gerou overflow
BGT
Superior
BGE
Superior ou igual
BLT
Menor
BLE
Menor ou igual
BHI
Superior
BLS
Igual ou inferior
Comparação de igualdade ou teste de resultado a 0
Comparação de desigualdade ou teste de resultado não 0
Operação aritmética não gerou carry-out
Resultado da comparação sem sinal é valor inferior
Resultado da comparação com sinal é valor superior
Resultado da comparação com sinal é valor superior ou igual
Resultado da comparação com sinal é valor inferior
Resultado da comparação com sinal é valor inferior ou igual
Resultado da comparação sem sinal é valor superior
Resultado da comparação sem sinal é valor inferior ou igual
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
17
II. Arquitectura ARM
4. Conjunto de instruções: transferência de dados
 A arquitectura ARM permite a transferência de dados entre a memória e os registos de
três formas distintas:
 Transferência de dados de/para um registo
Permitem copiar o conteúdo de um registo para uma posição de memória, no caso
da instrução store, ou de uma posição de memória para um registo de uso geral, no
caso da operação load.
Exemplos:
LDR r0, [r1]
LDRB r0, [r1]
LDRH r0, [r1]
STR r0, [r1]
STRB r0, [r1]
STRH r0, [r1]
 Transferência de dados de/para múltiplos registos
Permitem executar as instruções store e load para mais do que uma posição de
memória/registo, até ao máximo de 16, com uma única instrução.
Exemplos:
LDMIA r0, {r1,r2,r5}
LDMDB r0, {r13,r14}
STMDB r0, {sp,pc}
STMIA r0, {r2,ip}
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
18
II. Arquitectura ARM
4. Conjunto de instruções: transferência de dados
 A arquitectura ARM suporta 3 modos de endereçamento distintos para leitura/escrita
de dados em memória:
 Endereçamento indirecto por registo
É especificado um registo cujo conteúdo indica o endereço efectivo de memória
onde os dados se encontram, no caso de uma leitura, ou onde devem ser guardados,
no caso de uma escrita.
Exemplos:
LDR r0, [r1]
STRB r0, [r1]
 Endereçamento indexado
A instrução especifica um valor que deve ser adicionado ao registo base para se
obter o endereço efectivo de memória onde os dados se encontram, no caso de uma
leitura, ou onde devem ser guardados, no caso de uma escrita. A arquitectura ARM
permite que o valor a adicionar seja um valor imediato, portanto codificado na
própria instrução, ou o conteúdo de um registo.
Exemplos:
LDRH r0, [r1],#4
STR r0, [r1,r2]
STRB r0, [r1,r2, LSL #1]
 Endereçamento relativo
É um caso particular do endereçamento indexado que utiliza um valor imediato e o
PC como registo base para gerar o endereço efectivo.
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
19
II. Arquitectura ARM
4. Conjunto de instruções: transferência de dados
 As instruções de transferência de dados têm 2 endereços que indicam o registo
fonte/destino e o registo que contém o endereço de memória destino/fonte (registo
base) para as instruções store e load, respectivamente :
<opcode>{<cond>}{<data>} <Rd>, <address>
<opcode> := LDR | STR
<data>
:= H | B | SH | SB
<address> := [<Rn>{, <offset>}]{!} |
[<Rn>], <offset>
<offset> := {+ | -} <Rm> {, <shift_type> #<shift_imm>} |
#<imm12>
 O primeiro endereço (Rd) identifica o registo de destino/fonte;
 O segundo endereço (address) identifica a origem do segundo operando, que pode ser
um registo, o valor guardado num registo com pré ou pós-indexação ou uma
constante.
 Quando se usa pós-indexação, o valor do registo base é actualizado com o
deslocamento. Quando se usa pré-indexação, é necessário acrescentar ! para actualizar
o valor do registo base com o deslocamento.
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
20
II. Arquitectura ARM
4. Conjunto de instruções: transferência de dados
 Forma de codificação das instruções de transferências de dados:
31
28 27 26 25 24 23 22 21 20 19
cond
01
# P U B W L
16 15
Rn
12 11
0
Rd
offset
Registo fonte/destino
Registo base
Load / Store
Actualização do registo base
Unsigned byte / word
Crescente / decrescente
Pré / pós-actualização
11
0
1
constante 12-bit
11
0
7
#shift
6
5
Sh
4
0
3
0
Rm
Constante para deslocamento
Tipo de deslocamento
Registo para deslocamento
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
21
II. Arquitectura ARM
4. Conjunto de instruções: transferência de dados
 Utilização de variáveis
 Na arquitectura ARM, o carregamento do valor de variáveis em registos de uso geral é
conseguido mediante a combinação dos modos de endereçamento indirectos e relativo,
visto não ser possível incluir o endereço em memória das variáveis (32-bit) nos 32-bit
que codificam as instruções.
 O modo de endereçamento indirecto é utilizado para obter o conteúdo da posição de
memória referente à variável, no caso de uma leitura, ou para guardar o valor da
variável na sua posição de memória correspondente, no caso de uma escrita.
Exemplos:
LDR r0, [r1]
STRB r0, [r1]
 O modo de endereçamento relativo é utilizado para carregar o endereço de memória
referente à variável num registo de uso geral. Dada a existência de apenas 12-bit para a
codificação do valor imediato no código das instruções, deve declarar-se numa
vizinhança de ±4kB da instrução que acede à memória uma constante com o endereço
em memória da variável a aceder.
Exemplos:
LDR r1, var_address
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
22
II. Arquitectura ARM
4. Conjunto de instruções: transferência de dados
 As instruções de transferência de dados múltiplos têm 1 endereço que indica o registo
que contém o endereço de memória destino/fonte (registo base) para copiar/actualizar
os conteúdos dos registos especificados na instrução:
<opcode>{<cond>}{<mode>} <Rd>{!}, <reglist + pc>
<opcode> := LDM | STM
<mode>
:= IA | IB | DA | DB | FD | EA | FA | ED
 O primeiro endereço (Rd) identifica o registo de destino/fonte;
 O campo reglist identifica o conjunto de registos cujo conteúdo deve ser copiado
para memória, no caso da instrução store, ou actualizado a partir da memória, no caso
da instrução load. Este campo indica apenas os registos a usar pela instrução, e nunca a
ordem pela qual são escritos/lidos.
 O campo mode indica o modo como o registo base deve ser actualizado em cada acesso
à memória: antes (B) ou após (A) do acesso e incrementado (I) ou decrementado (D).
 Para actualizar o valor do registo base com o último endereço de memória
preenchido/lido é necessário acrescentar !.
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
23
II. Arquitectura ARM
4. Conjunto de instruções: transferência de dados
 Modos de actualização do registo base
Antes
Depois
Antes
Depois
r9
r9
r5
r1
r0
r5
r1
r0
r9
r9
STMIA r9!, {r0, r1, r5}
STMIB r9!, {r0, r1, r5}
Antes
r9
Depois
r9
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
Depois
r9
r5
r1
r0
STMDA r9!, {r0, r1, r5}
Antes
r5
r1
r0
r9
STMDB r9!, {r0, r1, r5}
24
II. Arquitectura ARM
4. Conjunto de instruções: transferência de dados
 Forma de codificação das instruções de transferências de dados múltiplas:
31
28 27
cond
25 24 23 22 21 20 19
100
P U S W L
16 15
Rn
0
lista de registos
Registo base
Load / Store
Actualização do registo base
Repôr PSR
Crescente / decrescente
Pré / pós-actualização
15 14 13 12 11 10 9
8
7
6
5
4
3
2
1
0
pc lr sp ip fp r10 r9 r8 r7 r6 r5 r4 r3 r2 r1 r0
© 2008- 2013, Tiago Miguel Dias
ADEETC - Secção de Arquitecturas e Sistemas Operativos
25
Download