Академический Документы
Профессиональный Документы
Культура Документы
Agosto - 2014
Sumario
1 Introduo
1.1 Conceito de processador
1.2 Introduo ao ARM
1.2.1 Historia do ARM
1.2.2 Arquitetura RISC
2 Conceitos da programao em ARM
2.1 Modos de operao
2.2 Registradores ARM
2.3 Program status register
2.3.1 Flags de condio
2.3.2 Bits de controle
2.3.3 Bits de desativao de interrupes
2.3.4 Bit T
2.3.5 Bits de modulo
3 Programao assembly pra ARM
4 Peculiaridades da programao C para ARM
4.1 diferenas bsicas na linguagem C para ARM
4.2 System Calls especficas
4.3 Ponteiros de funes
4.4 Integrao do cdigo assembly em C
5 Modo Thumb
6 Apndices
7 - Bibliografia
1 Introduo
1.1 Conceito de Processador
Para iniciar nossos estudos a respeito do processador ARM, primeiramente precisamos ter
bem claro o que um processador. Na computao atual, muitas vezes alguns conceitos a respeito
do hardware do computador so confundidos, e um deles a prpria definio de processador, que
vamos abordar nesse tpico.
A CPU (Central Processing Unit, ou Unidade de Processamento Central) composta por
tres partes, a unidade lgica e aritmtica (ULA), a unidade de controle e os registradores. A unidade
lgica e aritmtica consiste na rea do processador utilizada para efetuar, geralmente, operaes
aritmticas, lgicas e de deslocamento de bits, seguindo o ciclo de clock do processador. A unidade
de controle a responsvel por controlar sinais internos e externos do computador, e os
registradores so locais dentro da CPU para o armazenamento de informaes. Tendo essas
definies bsicas de um processador genrico bem definidas, podemos tratar do processador ARM
diretamente.
O processador ARM foi o primeiro processador com arquitetura RISC desenvolvido para
uso comercial. Foi inicialmente desenvolvido pela Acorn Computers Limited. Seu
desenvolvimento se iniciou visando um processador com o melhor desempenho possvel e ocupar
um pequeno espao, porm com a limitao de ser simples. Um detalhe interessante que o ncleo
ARM se manteve praticamente com o mesmo tamanho com a sua evoluo, sendo esse tamanho
bem reduzido. A arquitetura ARM tem algumas caractersticas em comum entre os vrios modelos
j lanados, so algumas delas:
Processador de 32 bits;
16 Registradores de uso geral;
Conjunto de instrues extensvel com o uso de co-processadores
Instrues de 3 endereos
Capacidade de uso do modo thumb, com instrues de apenas 16 bits
Baixo consumo de energia em relao a processadores CISC
At 16 co-processadores lgicos
Tais detalhes so importantes, pois permite-se que a programao seja praticamente a
mesma para qualquer modelo de processador ARM. Assim, percebe-se as vantagens do processador
ARM principalmente para sistemas embarcados, por sua simplicidade e eficincia para um uso
especfico.
Figura 2 PSR_ARM
2.3.4 Bit T
O bit T reflete o modo de operao:
-- Quando o bit T ativado, o processador executado em estado Thumb.
-- Quando o bit T desativado, o processador executado em estado ARM.
Um segundo ponto interessante o campo Cond que aparece em todas as instrues. Este campo
determina como devem estar os flags para a instruo ser executada. A tabela abaixo mostra as
condies disponveis:
O sufixo na tabela acima deve ser acrescentado ao mnemnico da instruo a ser afetada; o sufixo
AL normalmente omitido. Por exemplo LDREQ uma instruo de Load Register que s
executado quando o flag Z estiver ligado.
O bit S indica se a instruo vai ou no afetar os flags. Por exemplo, uma instruo AND no afeta
os flags, mas ANDS afeta.
A figura abaixo tem a lista completa das instrues disponveis:
->Instrues de Load/Store
As instrues de Load/Store podem ser de 3 tipos:
Load/Store de apenas um registrador;
Load/Store de mltiplos registradores;
Swap do contedo de um registrador com um endereo na memria;
Load/Store em um registrador
Instrues de Load/Store de um registrador pode trabalhar com 32-bit word, 16-bit halfword ou 8bit byte da memria para o registrador (Load) ou registrador para a memria (Store).
Esse conjunto de instrues podem trabalhar com endereamento indireto, com o deslocamento
(offset) do endereo, com o endereo pre-indexado e pos-indexado.
Exemplos:
STR r0, [r1] /*aqui armazenado em r0 o valor correspondente ao endereo r1*/
LDR r0, [r1, #4] /* no caso r0 vai carregar o endereo de r1 com um offset de 4 posies na
memria;*/
LDR r0, [r1, #4]! /* neste caso r1 primeiro faz um deslocamento de 4 posies e depois r0 carrega
r1, importante ressaltar que aqui o endereo do registrador r1 alterado antes mesmo do
registrador r0 carregar algum endereo;*/
LDR r0, [r1], #4 /*nesse exemplo o registrador r0 carrega somente o endereo de r1 e somente
depois da operao de Load que o registrador r1 deslocado em 4 posies;*/
Load/Store de mltiplos registradores
As instrues de Load Mltiplo (LDM) e Store Mltiplo (STM) fazem uma transferncia em bloco
registrador-memria ou memria-registrador. A arquitetura ARM usa operaes de Load/Store de
mltiplos registradores para operaes com a pilha. A operao pop (remover dados da pilha) usa a
operao de Load e a operao de push (colocar dados na pilha) implementado pela operao de
Store.
Mtodos de endereamento para operaes de Pilha:
Modo de
Descrio
Endereo
Endereo final Rn!
endereamento
inicial
IA
Incrementa
Rn
Rn+4*N-4
Rn+4*N
antes
IB
Incrementa
Rn+4
Rn+4*N
Rn+4*n
depois
DA
Decrementa
Rn-4*N+4
Rn
Rn-4*N
antes
DB
Decrementa
Rn-4*N
Rn-4
Rn-4*N
depois
Addressing
mode
FA
FD
EA
ED
Description
Pop
=LDM
Push
=STM
Full
ascending
Full
descending
Empty
ascending
Empty
ascending
LDMFA
LDMA
STMFA
STMIB
LDMFD
LDMIA
STMFD
STMDB
LDMEA
LDMDB
STMEA
STMIA
LDMED
LDMIB
STMED
STMDA
Exemplo:
STMIB r9!, {r0, r1, r5} /* vai gravar dados em r9 comeando em r0, depois r1, e por fim em r5 */
Swap contedo de um registrador com um endereo na memria
A instruo swap (SWP) atua na seguintes sequncias de operaes:
1. Carrega um valor a partir de um local de memria especificado pelo registrador.
2. Armazena o contedo de um registrador para a mesma posio de memria.
3. Grava o valor carregado no passo 1 para um registrador.
Sintaxe:
SWP{B}{<cond>} Rd, Rm, [Rn]
Exemplo:
Antes:
[0x9000] = 0x12345678, r0 = 0x00000000, r1 = 0x11112222, r2 = 0x00009000
SWP r0, r1, [r2]
Depois:
[0x9000] =0x11112222, r0 = 0x12345678, r1 = 0x11112222, r2 = 0x00009000
->Instrues de Branch (Jump)
Instrues de Branch so usadas para realizar um desvio no cdigo ou para chamar uma subrotina.
Todos os processadores ARM suportam instrues de branch com saltos condicionais para frente ou
para trs de at 32 Mb. Saltos mais longos podem ser feitos atravs de chamadas de subrotinas
como por exemplo o Branch whith Link (BL) que mantem o endereo de retorno no LR (R14).
*Branch :
B{<cond>} label
* Branch with Link :
BL{<cond>} subrotina
Exemplo:
B forward
ADD r1, r2, #4
ADD r0, r6, #2
ADD r3, r7, #4
forward
SUB r1, r2, #4
/*nesse exemplo como o branch incondicional a parte destacada do cdigo no executada, sendo
que ele vai direto para a label forward */
->Instrues de operaes com dados
Estas instrues realizam uma operao sobre um ou dois operandos (Op1 e Op2) e colocam o
resultado em um registrador (Rd) ou nas flags.
Mnemnico
AND
EOR
SUB
RSB
ADD
ADC
SBC
RSC
TST
TEQ
CMP
CMN
ORR
MOV
BIC
MVN
ao
Rd = Op1 AND Op2
Rd = Op1 XOR Op2
Rd = Op1 - Op2
Rd = Op2 - Op1
Rd = Op1 + Op2
Rd = Op1 + Op2 + C
Rd = Op1 - Op2 + C - 1
Rd = Op2 - Op1 + C - 1
posiciona flags conforme Op1 AND Op2
posiciona flags conforme Op1 XOR Op2
posiciona flags conforme Op1 - Op2
posiciona flags conforme Op1 + Op2
Rd = Op1 OR Op2
Rd = Op2
Rd = Op1 AND NOT Op2
Rd = NOT Op2
Lgico para a esquerda (LSL): desloca para a esquerda introduzindo zeros direita
Lgico para a direita (LSR): desloca para a direita introduzindo zeros esquerda
Aritmtico para a direita (ASR): desloca para a direita repetindo o bit mais significativo
na esquerda
Rotao para a direita (ROR): desloca para a direita, introduzindo na esquerda os bits que
'saem' direita
Alm disso, o nmero de bits a deslocar pode ser especificado diretamente no opcode (0 a 15) ou
ser obtido de um outro registrador (neste caso considerado o byte menos significativo do
registrador, permitindo deslocamentos de 0 a 255 bits).
2. Se I for 1, o segundo operando um valor imediato (codificado na prpria instruo):
MOV e MVN
{cond}{S} Rd,
CMP,CMN,TEQ,TST
{cond} Rn,
AND,EOR,SUB,RSB,ADD,ADC,SBC,RSC,ORR,BIC
{cond}{S} Rd,Rn,
onde
em negrito o mnemnico da instruo
{cond} a condio (opcional)
{S} indica que pode ser acrescentado S para a instruo afetar os flags
pode ser Rm{,} ou <#expresso>
pode ser Rs ou #expresso
ASL, LSL, LSR, ASR ou ROR
Rd, Rn, Rm e Rs so os registradores R0 a R15
Quando Op2 for especificado com #expresso, o compilador tentar codific-lo em um valor
imediato. Se no conseguir, acusar erro.
Exemplos:
MOV R1,#100 ; coloca 100 em R1
MOVS R1,R0 ; coloca o contedo de R0 em R1, atualiza os flags
MOV R1,R0 ASL 5 ; coloca R0 * 32 em R1 (ou seja faz um
deslocamento aritmtico para esquerda em R0 de 5 posies e depois
armazena o valor em R1)
ADD R2,R1,R0 ; soma R1 a R0 e coloca o resultado em R2
ADD R1,R1,#1 ; incrementa R1
TST R1,#0x80000000 ; testa o bit mais significativo de R1
BIC R1,R1,#1 ; zera o bit menos significativo de R1
CDP
MRC, MCR
LDC, STC
Exemplo:
Este exemplo mostra o contedo do registrador c0 de um CP15 sendo copiado para outro
registrador r10.
MRC p15, 0, r10, c0, c0, 0
->Instrues de gerao de excees
Existem dois tipos de instrues que causam excees especficas:
Instrues de interrupo de software - instrues SWI causam uma exceo de interrupo de
software. So normalmente utilizados para fazer chamadas para um sistema operacional, para
solicitar um servio definido pelo OS. A exceo causada por uma instruo SWI tambm muda
para um modo processador privilegiado. Isso permite que uma tarefa sem privilgios possa obter
acesso funes privilegiadas, mas apenas em vias permitidas pelo sistema operacional.
Sintaxe: SWI{<cond>} SWI_number
Quando o processador executa uma instruo SWI, ele define o contador do programa para o offset
0x8 da tabela de vetores. A instruo tambm fora o processador para o modo SVC, o qual permite
que uma rotina do OS seja chamada em um modo privilegiado.
Cada instruo SWI tem um nmero SWI associado, o qual usado para representar uma funo de
chamada especial ou recurso.
Instrues de ponto de interrupo de software - instrues BKPT faz com que o processador
entre no modo de Debug. Se a rotina de tratamento est instalada no vetor de interrupo, uma
exceo de interrupo gerada dessa forma tratado como breakpoint. Se h um hardware de debug
presente no sistema, em vez disso, pode tratar uma instruo BKPT diretamente como um
breakpoint, impedindo que a exceo de aborto ocorra.
Sintaxe: BKPT #imm
onde
imm uma expresso de um inteiro.
OBS.: Essa instruo no altera as flags.
Exemplo:
BKPT #0x3 /*breakpoint com valor imediato definido para 0x3 (depurador pode extrair o valor
imediato, localizando-o usando o PC) */
->Instrues de transferncia de registradores de estado
O conjunto de instrues do ARM prov duas instrues para diretamente controlar os registradores
de estado. A instruo MRS transfere o contedo de um registrador de estado para um registrador
geral. A instruo MSR transfere de um registrador geral para um registrador de estado.
Sintaxe:
MRS{<cond>} Rd,<cpsr|spsr>
MSR{<cond>} <cpsr|spsr>_<fields>,Rm
MSR{<cond>} <cpsr|spsr>_<fields>,#immediate
Exemplo:
MRS r1, cpsr
//copia o cpsr para o registrador r1
BIC r1, r1, #0x80 ; 0b01000000
//apaga o bit 7 de r1
MSR cpsr_c, r1
/*copia de r1 de volta para o registrador de estado cpsr,
o que habilita interrupes de IRQ*/
7 Apndices
Tabela ASCII
Lista de Sufixos:
There are four bits of condition encoded into an instruction word. This allows sixteen possible
conditions:
AL Always
An instruction with this suffix is always executed. To save having to type AL after the majority of
instructions which are unconditional, the suffix may be omitted in this case. Thus ADDAL and
ADD mean the same thing: add unconditionally.
NV Never
All ARM conditions also have their inverse, so this is the inverse of always. Any instruction with this
condition will be ignored. Such instructions might be used for 'padding' or perhaps to use up a
(very) small amount of time in a program.
EQ Equal
This condition is true if the result flag Z (zero) is set. This might arise after a compare instruction
where the operands were equal, or in any data instruction which received a zero result into the
destination.
NE Not equal
This is clearly the opposite of EQ, and is true if the Z flag is cleared. If Z is set, and instruction with
the NE condition will not be executed.
VS Overflow set
This condition is true if the result flag V (overflow) is set. Add, subtract and compare instructions
affect the V flag.
VC Overflow clear
The opposite to VS.
MI Minus
Instructions with this condition only execute if the N (negative) flag is set. Such a condition would
occur when the last data operation gave a result which was negative. That is, the N flag reflects the
state of bit 31 of the result. (All data operations work on 32-bit numbers).
PL Plus
This is the opposite to the MI condition and instructions with the PL condition will only execute if
the N flag is cleared.
The next four conditions are often used after comparisons of two unsigned numbers. If the
numbers being compared are n1 and n2, the conditions are n1>=n2, n1<n2, n1>n2 and n1<=n2, in
the order presented.
CS Carry set
This condition is true if the result flag C (carry) is set. The carry flag is affected by arithmetic
instructions such as ADD, SUB and CMP. It is also altered by operations involving the shifting or
rotation of operands (data manipulation instructions).
When used after a compare instruction, CS may be interpreted as 'higher or same', where the
operands are treated as unsigned 32-bit numbers. For example, if the left hand operand
of CMP was 5 and the right hand operand was 2, the carry would be set. You can use HS instead
of CS for this condition.
CC Carry clear
This is the inverse condition to CS. After a compare, the CC condition may be interpreted as
meaning 'lower than', where the operands are again treated as unsigned numbers. An synonym
for CC is LO.
HI Higher
This condition is true if the C flag is set and the Z flag is false. After a compare or subtract, this
combination may be interpreted as the left hand operand being greater than the right hand one,
where the operands are treated as unsigned.
LS Lower or same
This condition is true if the C flag is cleared or the Z flag is set. After a compare or subtract, this
combination may be interpreted as the left hand operand being less than or equal to the right
hand one, where the operands are treated as unsigned.
The next four conditions have similar interpretations to the previous four, but are used when
signed numbers have been compared. The difference is that they take into account the state of the
V (overflow) flag, whereas the unsigned ones don't.
Again, the relationships between the two numbers which would cause the condition to be true are
n1>=n2, n1<n2, n1>n2, n1<=n2.
LT Less than
This is the opposite to GE and instructions with this condition are executed if N is set and V is
cleared, or N is cleared and V is set.
GT Greater than
This is the same as GE, with the addition that the Z flag must be cleared too.
8 Bibliografia
http://www.embedded.com/electronics-blogs/beginner-s-corner/4024632/Introduction-to-ARMthumb
http://www.arm.com/index.php
http://www.ic.unicamp.br/~rodolfo/Cursos/mc722/2s2005/Trabalho/g20-arm.pdf
http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node144.html
ARM system developer's guide: Designing and Optimizing System Software. SLOSS, Andrew N.,
SYMES, Dominic, WRIGHT Chris, 2004 ARM7TDMI: Technical Reference Manual, 2004
SCHILDT, Hebert, C completo e total, 3 Edio, Revisada e Atualizada