Universidade de
São Paulo
Sistemas Embarcados
Jorge Luiz e Silva
Conjunto Instruções ARM
ARM versões.
ARM Linguagem Assembly.
ARM modelo de programação.
ARM organização de memória.
ARM operação com dados.
ARM fluxo de controle.
Versões ARM
Várias arquiteturas do ARM
Apresentação do ARM7.
Linguagem Assembly ARM
Modelo de comandos
LDR r0,[r8] ; a comment
label
ADD r4,r0,r1
Modelo de Programação
r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 (PC) CPSR 31 0 N Z C VModo de representação Endian
Relação entre bit/bytes/palavra define
endianness:
byte 3 byte 2 byte 1 byte 0 byte 0 byte 1 byte 2 byte 3 bit 31 bit 0 bit 0 bit 31
Tipos de Dados ARM
Palavras de 32 bits.
Palavra pode ser dividida em 4 bytes
Endereço do ARM pode ter 32 bits.
Endereço referenciado por bytes
Endereço 4 se inicia no byte 4.
No power-up pode-se configurar o modo
little- ou bit-endian.
Bit Status ARM
Cada operação aritimética, logica, ou de
deslocamento gera um flag CPSR:
N (negativo), Z (zero), C (carry), V (overflow).
Exemplos:
-1 + 1 = 0: NZCV = 0110.
2
32-1+1 = -2
31: NZCV = 1001.
Instruções de Dados ARM
Formato Básico:
ADD r0,r1,r2
Operando Imediato:
ADD r0,r1,#2
Instruções p/ dados no ARM
ADD, ADC : soma (w. carry)
SUB, SBC : subtrai (w. carry)
MUL, MLA : multiplica (and accumulate)
AND, ORR, EOR
BIC : clear bit
LSL, LSR : Deslocamento left/right
ASL, ASR : Deslocamento arithmetico left/right
ROR : rotate right
RRX : rotate right com C
Instruções de Comparação ARM
CMP : compara
CMN : compara negado
TST : bit-wise AND
TEQ : bit-wise XOR
Alteram apenas os bits NZCV do CPSR.
Instruções MOV no ARM
MOV, MVN : move (negado)
Instruções load/store ARM
LDR, LDRH, LDRB : load (half-word, byte)
STR, STRH, STRB : store (half-word, byte)
Modos de endereçamento:
register indirect : LDR r0,[r1]
com segundo registrador : LDR r0,[r1,-r2]
com constante: LDR r0,[r1,#4]
ARM ADR pseudo-op
Não se pode referenciar um endereço direto
em uma instrução
Valor gerados a partir de uma análise no
PC
ADR é pseudo-op que calcula endereço
ADR r1,FOO
Example: Atribuições em C
C: x = (a + b) - c; Assembler:
ADR r4,a ; endereço de a LDR r0,[r4] ; valor de a
ADR r4,b ; endereço de b, reusando r4 LDR r1,[r4] ; valor de b
ADD r3,r0,r1 ; computa a+b ADR r4,c ; endereço de c LDR r2,[r4] ; valor de c
SUB r3,r3,r2 ; completa calculo de x ADR r4,x ; endereço de x STR r3,[r4] ; valor de x
Example: Comandos C
C: y = a*(b+c); Assembler:
ADR r4,b ; get address for b LDR r0,[r4] ; get value of b ADR r4,c ; get address for c LDR r1,[r4] ; get value of c ADD r2,r0,r1 ; compute partial result ADR r4,a ; get address for a LDR r0,[r4] ; get value of a
MUL r2,r2,r0 ; compute final value for y ADR r4,y ; get address for y
STR r2,[r4] ; store y
Example: Comandos C
C: z = (a << 2) | (b & 15); Assembler:
ADR r4,a ; get address for a
LDR r0,[r4] ; get value of a
MOV r0,r0,LSL 2 ; perform shift
ADR r4,b ; get address for b
LDR r1,[r4] ; get value of b
AND r1,r1,#15 ; perform AND
ORR r1,r0,r1 ; perform OR
Modos de Endereçamento
Adicionais
Base + deslocamento:
LDR r0,[r1,#16]
Base + auto indexado com incremento
LDR r0,[r1,#16]!
Pós-indexado seguido de offset:
Comandos de fluxo ARM
Baseados em CPSR:
EQ, NE, CS, CC, MI, PL, VS, VC, HI,
LS, GE, LT, GT, LE
Operação de Desvio:
B #100
Pode ser executado condicionalmente
Exemplo: comando if
C:
if (a > b) { x = 5; y = c + d; } else x = c - d; Assembler:
; testar condição ADR r4,a ; endereço a LDR r0,[r4] ; valor de a ADR r4,b ; endereço b LDR r1,[r4] ; valor de b CMP r0,r1 ; compare a < b
BLE fblock ; if a ><= b, desvia para falso
Comando If…..
if (a > b) { x = 5; y = c + d; } else x = c - d;
; bloco true
MOV r0,#5 ; gera valor de x ADR r4,x ; endereço de x STR r0,[r4] ; store x ADR r4,c ; endereço de c LDR r0,[r4] ; valor de c ADR r4,d ; endereço de d LDR r1,[r4] ; valor de d ADD r0,r0,r1 ; gera y ADR r4,y ; endereço de y STR r0,[r4] ; store y B after ; desvia final
Comando If …..
if (a > b) { x = 5; y = c + d; } else x = c - d;
; bloco false
fblock ADR r4,c ; endereço de c LDR r0,[r4] ; valor de c ADR r4,d ; endereço de d LDR r1,[r4] ; valor de d SUB r0,r0,r1 ; gera a-b ADR r4,x ; endereço de x STR r0,[r4] ; store valor de x after ...
Exemplo: Implementação de
Condições
if (a > b) { x = 5; y = c + d; } else x = c - d; ; bloco true MOVLT r0,#5 ; valor de x ADRLT r4,x ; endereço de x STRLT r0,[r4] ; store x ADRLT r4,c ; endereço de c LDRLT r0,[r4] ; valor de c ADRLT r4,d ; endereço de d LDRLT r1,[r4] ; valor de d ADDLT r0,r0,r1 ; gera y ADRLT r4,y ; endereço de y STRLT r0,[r4] ; store y; bloco true
MOV r0,#5 ; gera valor de x ADR r4,x ; endereço de x STR r0,[r4] ; store x ADR r4,c ; endereço de c LDR r0,[r4] ; valor de c ADR r4,d ; endereço de d LDR r1,[r4] ; valor de d ADD r0,r0,r1 ; gera y ADR r4,y ; endereço de y STR r0,[r4] ; store y B after ; desvia final
Exemplo: Implementação de
Condições…..
; bloco false ADRGE r4,c ; endereço de c LDRGE r0,[r4] ; valor de c ADRGE r4,d ; endereço de d LDRGE r1,[r4] ; valor de d SUBGE r0,r0,r1 ; gerar a-b ADRGE r4,x ; endereço de x STRGE r0,[r4] ; store valor de xExemplo: Filtro FIR
C:
for (i=0, f=0; i<N; i++) f = f + c[i]*x[i];
Assembler ; Inicio do loop
MOV r0,#0 ; use r0 para I
MOV r8,#0 ; usar índices separados para arrays ADR r2,N ; endereço de N
LDR r1,[r2] ; valor de N MOV r2,#0 ; use r2 para f
Filtro FIR …..
for (i=0, f=0; i<N; i++) f = f + c[i]*x[i]; ADR r3,c ; endereço de c ADR r5,x ; endereço de x ; corpo do loop
loop LDR r4,[r3,r8] ; valor de c[i] LDR r6,[r5,r8] ; valor de x[i] MUL r4,r4,r6 ; gerar c[i]*x[i] ADD r2,r2,r4 ; acumular
ADD r8,r8,#4 ; incrementa uma palavra offset ao índice ADD r0,r0,#1 ; soma 1 em i CMP r0,r1 ; final? BLT loop ; if i < N, continue