View
212
Download
0
Category
Preview:
Citation preview
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 1
Conjunto de instruções do
processador ARM
Processador ARM:
Versões do processador ARM.
Linguagem assembly.
Modelo de programação.
Organização da memória.
Operações de dados.
Fluxo de controle.
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
Características RISC
Muitos registradores de uso geral
Arquitetura do tipo load-store
Modos de endereçamento simples
Endereços de load/store determinados pelo conteúdo de registradores e da própria instrução
Instruções com campos fixos para simplificar a decodificação
© 2000 Morgan
Kaufman Overheads for Computers as
Components 2
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
Características adicionais
do conjunto de instruções
Controle combinado da ALU e unidade de deslocamento
Modos de endereçamento auto-incremento e auto-decremento para execução de loops
Load e store múltiplos para maximizar fluxo de dados (throughput) entre processador e memória
Execução condicional de quase todas as instruções
© 2000 Morgan
Kaufman Overheads for Computers as
Components 3
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 4
Versões do Processador ARM
A arquitetura ARM é utilizada em diversas versões do processador.
Iremos nos concentrar na versão ARM7.
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 5
Linguagem assembly do
processador ARM
Linguagem assembly “padrão”:
LDR r0,[r8] ; comentário
rótulo ADD r4,r0,r1
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 6
Modelo de programação do processador
ARM (16 registradores visíveis)
r0
r1
r2
r3
r4
r5
r6
r7
r8
r9
r10
r11
r12
R13 (SP)
R14(link)
r15 (PC)
CPSR
31 0
N Z C V
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 7
Terminação (Endianness)
Relacionamento entre ordem de bits e de bytes/palavras:
byte 3 byte 2 byte 1 byte 0 byte 0 byte 1 byte 2 byte 3
bit 31 bit 0 bit 31 bit 0
little-endian big-endian
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 8
Tipos de dados do
processador ARM
Tamanho da palavra de 32 bits.
Palavra pode ser dividida em quatro bytes.
Endereços de 32 bits.
Endereço corresponde a byte. Endereço 4 corresponde ao byte 4.
Configurável no modo little-endian ou no modo big-endian.
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 9
Bits de estado do
processador ARM
A cada operação aritmética, lógica ou de deslocamento, os bits de estado podem ser habilitados ou não: N (negativo), Z (zero), C (carry), V (overflow).
Exemplos:
-1 + 1 = 0: NZCV = 0110
(231-1)+1 = -231: NZCV = 1001
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
Instruções
31-28: Cond; 27-26: 00; 25: X
24-21: opcode; 20: S
19-16: Rn; 15-12: Rd
11-0: Depende de X
X=1 • 11-8: #rotações; 7-0: valor imediato (complemento de 2’s)
X=0 • 11-7: #deslocamentos; 6-5: SH; 4: 0; 0-3: Rm
• 11-8: Rs; 7: 0; 6-5: SH; 4: 1; 3-0: Rm
© 2000 Morgan
Kaufman Overheads for Computers as
Components 10
Cond 00 X Opcode S Rn Rd Format determined by X
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 11
Instruções de dados do
processador ARM
Formato básico: ADD r0,r1,r2
Calcula r1+r2, armazena o resultado em r0.
Operando imediato: ADD r0,r1,#2
Calcula r1+2, armazena o resultado em r0.
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 12
Instruções de dados do
processador ARM (cont.)
ADD, ADC : soma (com carry)
SUB, SBC : subtração (com carry)
RSB, RSC : subtração em ordem reversa (com carry)
MUL, MLA : multiplicação (e acumulação)
AND, ORR, EOR
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 13
Instruções de dados do
processador ARM (cont.)
BIC : bit clear
LSL, LSR : deslocamento lógico para a esquerda/direita
ASL, ASR : deslocamento aritmético para a esquerda/direita
ROR : rotação para a direita
RRX : rotação para a direita, estendida pelo carry
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 14
Operações de dados variadas
Deslocamento Lógico: Insere zeros.
Deslocamento Aritmético: Insere um, para sinal negativo e
deslocamento para direita.
RRX realiza uma rotação de 33-bits, incluindo o bit de estado carry na posição à esquerda do bit de sinal.
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 16
Instruções de comparação
do processador ARM
CMP : comparação - subtração
CMN : comparação - soma
TST : AND bit a bit (bit-wise)
TEQ : XOR bit a bit (bit-wise)
Esta instruções mudam apenas os bits NZCV do registrador CPSR.
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 17
Instruções move do
processador ARM
MOV, MVN : move (negativo)
MOV r0, r1 ; leva r1 para r0
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 18
Instruções load/store do
processador ARM
LDR, LDRH, LDRB : leitura da memória
(meia-palavra, byte)
STR, STRH, STRB : escrita em memória
(meia-palavra, byte)
Modos de endereçamento: Registrador Indireto : LDR r0,[r1]
Com um segundo registrador : LDR r0,[r1,-r2]
Com uma constante : LDR r0,[r1,#4]
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
Exemplos do manual
© 2000 Morgan
Kaufman Overheads for Computers as
Components 19
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 20
Modos de endereçamento
Endereçamento base-mais-offset: LDR r0,[r1,#16]
Carrega, em r0, uma palavra a partir da posição de memória r1+16
Auto-incremento modifica o registrador base : LDR r0,[r1,#16]!
Pós-incremento modifica a base após o acesso: LDR r0,[r1],#16
Coloca em r0 o conteúdo da posição de memóri [r1] e, em seguida, soma 16 a r1.
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
Load/store Multiple
21
Obs.: o uso da pilha é
feito usando o
registrador R13 como
endereço
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
Instruções Load/Store Múltiplo
Modos de Endereçamento (Manual)
22
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 23
Pseudo-Operações de Endereçamento
do Processador ARM
Não há referência direta para um endereço em uma instrução.
O endereço é obtido como resultado de uma operação aritmética sobre o PC.
Pseudo-operações de endereçamento são traduzidas nas instruções necessárias para o cálculo do endereço: ADR r1,FOO
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 24
Exemplo: rotina em C
C: x = (a + b) - c;
Linguagem Assembly: ADR r4,a ; busca o endereço de a
LDR r0,[r4] ; carrega o valor de a
ADR r4,b ; busca o valor de b
LDR r1,[r4] ; carrega o valor de b
ADD r3,r0,r1 ; calcula a+b
ADR r4,c ; busca o endereço de c
LDR r2,[r4] ; carrega o valor de c
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 25
Exemplo: rotina em C (cont.)
SUB r3,r3,r2 ; cálculo completo de x
ADR r4,x ; busca o endereço para x
STR r3,[r4] ; armazena o valor de x
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 26
Exemplo: outra rotina em C
C: y = a*(b+c);
Linguagem Assembly: ADR r4,b ; busca o endereço para b
LDR r0,[r4] ; carrega o valor de b
ADR r4,c ; busca o endereço para c
LDR r1,[r4] ; carrega o valor de c
ADD r2,r0,r1 ; calcula o resultado parcial
ADR r4,a ; busca o endereço para a
LDR r0,[r4] ; carrega o valor de a
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 27
Exemplo: outra rotina em C
(cont.)
MUL r2,r2,r0 ; calcula o valor final de y
ADR r4,y ; busca o endereço para y
STR r2,[r4] ; armazena y
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 28
Exemplo: nova rotina em C
C: z = (a << 2) | (b & 15);
Linguagem Assembly: ADR r4,a ; busca o endereço para a
LDR r0,[r4] ; carrega o valor de a
MOV r0,r0,LSL 2 ; realiza deslocamento
ADR r4,b ; busca o endereço para b
LDR r1,[r4] ; carrega o valor de b
AND r1,r1,#15 ; realiza operação lógica AND
ORR r1,r0,r1 ; realiza operação lógica OR
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 29
Exemplo: nova rotina em C
(cont.)
ADR r4,z ; busca o endereço z
STR r1,[r4] ; armazena o valor de z
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 30
Fluxo de controle do
processador ARM
Todas as operações podem ser realizadas condicionalmente, testando-se CPSR: EQ, NE, CS, CC, MI, PL, VS, VC,
HI, LS, GE, LT, GT, LE
Operação Branch: B #100 ;modifica r15 para r15+400
Pode ser realizada condicionalmente.
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
Comparações
EQ/NE: zero(Z=1)/ non zero
CS/CC: carry set (C=1) /carry clear
MI/PL: minus (N=1)/plus
VS/VC: overflow (V=1)/nonoverflow
HI/LS: unsigned high (C=1 and Z=0)/ lower or same
GE/LT: signed greater or equal (N=V)/less than
GT/LE: signed greater than (Z=0 and N=V)/less than or equal
© 2000 Morgan
Kaufman Overheads for Computers as
Components 31
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 32
Sentença Condicional
C: if (a > b) { x = 5; y = c + d; } else x = c - d;
Linguagem Assembly: ; calcula e testa a condição
ADR r4,a ; busca o endereço para a
LDR r0,[r4] ; carrega o valor de a
ADR r4,b ; busca o endereço para b
LDR r1,[r4] ; carrega o valor de b
CMP r0,r1 ; compara a < b
BLE fblock ; if a > b (ou a <= b), salta para ; o “false block“
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 33
Sentença Condicional (cont.)
; true block
MOV r0,#5 ; gera um valor para x
ADR r4,x ; busca o endereço para x
STR r0,[r4] ; armazena x
ADR r4,c ; busca o endereço para c
LDR r0,[r4] ; carrega o valor de c
ADR r4,d ; busca o endereço para d
LDR r1,[r4] ; carrega o valor de d
ADD r0,r0,r1 ; calcula y
ADR r4,y ; busca endereço para y
STR r0,[r4] ; armazena y
B after ; pula (ignora) o “false block”
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 34
Sentença Condicional (cont.)
; false block
fblock ADR r4,c ; busca o endereço para c
LDR r0,[r4] ; carrega o valor de c
ADR r4,d ; busca o endereço para d
LDR r1,[r4] ; carrega o valor de d
SUB r0,r0,r1; calcula a-b
ADR r4,x ; busca o endereço para x
STR r0,[r4] ; armazena o valor de x
after ...
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 35
Exemplo: Código Com
Instruções Condicionais
; true block
MOVGT r0,#5 ; gera um valor para x
ADRGT r4,x ; busca o endereço para x
STRGT r0,[r4] ; armazena x
ADRGT r4,c ; busca o endereço para c
LDRGT r0,[r4] ; carrega o valor de c
ADRGT r4,d ; busca o endereço para d
LDRGT r1,[r4] ; carrega o valor de d
ADDGT r0,r0,r1 ; calcula y
ADRGT r4,y ; busca o endereço para y
STRGT r0,[r4] ; armazena y
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 36
Exemplo: Código Com
Instruções Condicionais(cont.)
; false block
ADRLE r4,c ; busca o endereço de c
LDRLE r0,[r4] ; carrega o valor para c
ADRLE r4,d ; busca o endereço de d
LDRLE r1,[r4] ; carrega o valor para d
SUBLE r0,r0,r1 ; calcula a-b
ADRLE r4,x ; busca o endereço de x
STRLE r0,[r4] ; armazena o valor de x
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 37
Exemplo: sentença switch
C: switch (test) { case 0: … break; case 1: … }
Linguagem Assembly : ADR r2,test ; busca o endereço para test
LDR r0,[r2] ; carrega o valor de test
ADR r1,switchtab ; busca o endereço ; para switch table
LDR r15,[r1,r0,LSL #2] ; índice switch table
switchtab DCD case0
DCD case1
...
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 38
Exemplo: filtro FIR
C: for (i=0, f=0; i<N; i++)
f = f + c[i]*x[i];
Linguagem Assembly: ; inicialização do loop
MOV r0,#0 ; utiliza r0 para índice I
MOV r8,#0 ; utiliza índice distintos para os ; vetores
ADR r2,N ; busca o endereço de N
LDR r1,[r2] ; carrega o valor de N
MOV r2,#0 ; utiliza r2 for f
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 39
Exemplo: filtro FIR (cont.)
ADR r3,c ; carrega r3 com a base de c
ADR r5,x ; carrega r5 com a base de x
; loop
loop LDR r4,[r3,r8] ; carrega c[i]
LDR r6,[r5,r8] ; carrega x[i]
MUL r4,r4,r6 ; calcula c[i]*x[i]
ADD r2,r2,r4 ; f <- f + c[i]*x[i]
ADD r8,r8,#4 ; soma uma palavra de ; offset ao índice do vetor
ADD r0,r0,#1 ; incrementa o índice I
CMP r0,r1 ; termina o loop ?
BLT loop ; if i < N, continua
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 40
Sub-rotina de ligação do
processador ARM
Instrução Branch and link: BL foo
Copia o valor corrente do PC em r14.
Para retornar de uma sub-rotina: MOV r15,r14
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 41
Chamadas de sub-rotinas
dentro de sub-rotinas
Recursão e chamadas de sub-rotinas dentro de sub-rotinas necessitam de convenção no procedimento de chamada:
f1 LDR r0,[r13] ; carrega arg para o regis- ; trador r0 a partir da pilha.
; chama f2()
STR r14,[r13, #4]! ; armazena o endereço de retorno ; de f1, que também foi chamada.
STR r0,[r13, #4]! ; armazena arg para f2 na pilha.
BL f2 ; branch and link para f2.
; retorno para f1()
SUB r13,#4 ; retira arg de f2 da pilha.
LDR r15,[r13],#-4; restaura o registrador e ; retorna para f1.
Tradução: Alice M. Tokarnia
Edição: Filipe I. Fazanaro
© 2000 Morgan
Kaufman Overheads for Computers as
Components 42
Alguns ponto importantes
O processador ARM apresenta arquitetura Load/Store.
Na maioria das implementações escalares,as instruções sequenciais RISC podem ser terminadas com intervalos de apenas um ciclo de relógio.
Algumas operações multi-registradores necessitam de mais tempo.
Todas as instruções podem ser executadas condicionalmente.
Recommended