Conjunto de instruções do processador ARMlboccato/Cap.3.1-ARM7.pdf · 2014-09-29 · Instruções...

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

Transcript of Conjunto de instruções do processador ARMlboccato/Cap.3.1-ARM7.pdf · 2014-09-29 · Instruções...

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

Exemplos: alguns formatos

(Manual)

15

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.