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. Universidade de São Paulo Sistemas Embarcados Jorge Luiz e Silva Versões ARM Linguagem Assembly ARM Várias arquiteturas do ARM Modelo de comandos Apresentação do ARM7. label Modelo de Programação r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 (PC) LDR r0,[r8] ; a comment ADD r4,r0,r1 Modo de representação Endian 0 31 CPSR Relação entre bit/bytes/palavra define endianness: bit 31 bit 0 byte 3 byte 2 byte 1 byte 0 bit 0 bit 31 byte 0 byte 1 byte 2 byte 3 NZCV little-endian big-endian 1 Tipos de Dados ARM Bit Status ARM Palavras de 32 bits. Cada operação aritimética, logica, ou de deslocamento gera um flag CPSR: 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. N (negativo), Z (zero), C (carry), V (overflow). Exemplos: -1 + 1 = 0: NZCV = 0110. 232-1+1 = -231: NZCV = 1001. No power-up pode-se configurar o modo little- ou bit-endian. 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 Instruções MOV no ARM CMP : compara CMN : compara negado TST : bit-wise AND TEQ : bit-wise XOR Alteram apenas os bits NZCV do CPSR. MOV, MVN : move (negado) MOV r0, r1 ; sets r0 to r1 2 Instruções load/store ARM ARM ADR pseudo-op LDR, LDRH, LDRB : load (half-word, byte) STR, STRH, STRB : store (half-word, byte) Não se pode referenciar um endereço direto em uma instrução Modos de endereçamento: Valor gerados a partir de uma análise no PC register indirect : LDR r0,[r1] com segundo registrador : LDR r0,[r1,-r2] com constante: LDR r0,[r1,#4] ADR é pseudo-op que calcula endereço ADR r1,FOO Example: Atribuições em C Example: Comandos 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 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 ADR r4,z ; get address for z STR r1,[r4] ; store value for z 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: LDR r0,[r1],#16 3 Comandos de fluxo ARM Exemplo: comando if Baseados em CPSR: C: EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE Operação de Desvio: B #100 Pode ser executado condicionalmente Comando If….. if (a > b) { x = 5; y = c + d; } else x = c - d; 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 ….. ; 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 ; 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 Exemplo: Implementação de Condições….. if (a > b) { x = 5; y = c + d; } else x = c - d; ; bloco true ; bloco true MOVLT r0,#5 ; valor de x MOV r0,#5 ; gera valor de x ADR r4,x ; endereço de x ADRLT r4,x ; endereço de x STR r0,[r4] ; store x STRLT r0,[r4] ; store x ADR r4,c ; endereço de c ADRLT r4,c ; endereço de c LDR r0,[r4] ; valor de c LDRLT r0,[r4] ; valor de c ADR r4,d ; endereço de d ADRLT r4,d ; endereço de d LDR r1,[r4] ; valor de d LDRLT r1,[r4] ; valor de d ADD r0,r0,r1 ; gera y ADDLT r0,r0,r1 ; gera y ADR r4,y ; endereço de y ADRLT r4,y ; endereço de y STR r0,[r4] ; store y STRLT r0,[r4] ; store y B after ; desvia final if (a > b) { x = 5; y = c + d; } else x = c - d; ; 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 x 4 Exemplo: Filtro FIR Filtro FIR ….. for (i=0, f=0; i<N; i++) f = f + c[i]*x[i]; 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 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 Subrotinas no ARM Chamadas aninhadas de subrotinas Desvio e link: Requer conversão de código BL foo Copia PC atual em r14. Para retornar : MOV r15,r14 f1 LDR r0,[r13] ; load arg into r0 from stack ; call f2() STR r14,[r13]! ; store f1’s return adrs STR r0,[r13]! ; store arg to f2 on stack BL f2 ; branch and link to f2 ; return from f1() SUB r13,#4 ; pop f2’s arg off stack LDR r13!,r15 ; restore register and return Resumo Arquitetura Load/store Maioria das instruções são RISC, operam em um único ciclo. Algumas operações multi-registradores são longas Todas as instruções podem ser executadas condicionalmente 5