Вы находитесь на странице: 1из 23

UNIVERSIDADE FEDERAL DE UBERLNDIA

Faculdade de computao FACOM

Trabalho de concluso de disciplina Tutorial de programao em ARM

Augusto Csar Rivera Colho 11021EMT002


Elizer Samuel Santos da Silva 11021EMT015
Ivan Bergantini Burjaili - 11121EMT005

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.

1.2 Introduo ao ARM


1.2.1 Historia do ARM

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.

1.2.2 Arquitetura RISC


Para que se entenda bem o processamento do ARM, necessrio uma compreenso grande
de uma arquitetura RISC, e suas diferenas em relao a arquitetura CISC. O termo RISC significa
Reduced Instruction Set Computer, ou seja, um computador com um conjunto reduzido de
instrues. Isso significa que, diferentemente de um computador pessoal utilizado comumente, um
computador RISC executa um conjunto menor de instrues bsicas. Isso faz com que o
processador perca em versatilidade, porm ganhando em desempenho e economia, tanto de espao
quanto de energia gasta para a execuo de tarefas.
Um processador RISC possui normalmente uma quantidade muito grande de registradores,
se comparado a um computador CISC. Isso ocorre para que o processador consiga trazer mais
informaes da memria, o que faz com que as instrues sejam executadas de forma mais rpida,
e tambm pelo fato que o processamento de dados no opera diretamente com o contedo da
memria, apenas com os registradores. Isso conhecido como arquitetura load/store.
O processador RISC tambm possui um conjunto de instrues de tamanho fixo, para
facilitar a decodificao, alm de instrues prprias para a execuo de load e store mltiplos,
para maximizar a performance.

2 Conceitos de Programao em ARM


2.1 Modos de operao
A arquitetura ARM suporta 7 modos de operao:
User: execuo normal de programas. Possui restries de acesso a registradores;
FIQ (Fast Interrupt): suporta a transferncia rpida de dados e prioritria;
IRQ (Interrupt): usado para manipulao de interrupes de propsito geral;
Supervisor: um modo protegido para o sistema operacional, usado para ter acesso a informaes
e reas restritas do sistema, prioritrio ao IRQ;
Abort: implementa memria virtual e/ou proteo de memria, acontece ao se tentar acessar um
endereo invalido ou protegido, prioritrio ao IRQ;
Undefined: suporta emulao em software de coprocessadores, ocorre quando o processador
ARM no comporta a instruo, passando a tarefa para um emulador;
System: executa tarefas privilegiadas do sistema operacional, existente a partir da verso 4 do
ARM.
Os modos de operao podem mudar atravs de controle de software ou atravs de interrupes
externas. Durante a execuo normal de um programa o processo encontra-se no modo User.

2.2 Registradores ARM


A arquitetura possui 31 registradores de propsito geral, todos de 32 bits. Em qualquer momento
apenas 16, dos 31, registradores so visveis. Os registradores restantes so usados em operaes de
exceo, quando o processador entra em um de seus modos especiais de operao e substitui alguns
dos 16 registradores comuns por registradores especficos do modo. Alm dos registradores de
propsito geral, h tambm 6 registradores de estado (CPSR e SPSR).
Dos 16 registradores, 2 tem papel especial:
Program Counter (R15) - possui o endereo da prxima instruo a ser executada pelo
processador. Sempre possui o valor do endereo da instruo atual mais 8 bytes.
Link Register (R14) - possui o endereo da prxima instruo a ser executada aps um Branch
and Link (BL), que uma instruo usada na chamada de sub-rotinas. Excluindo essa situao, o
R14 pode ser utilizado normalmente pelo programador.
Stack Pointer (R13) - Possui o ponteiro para pilha onde so armazenados os dados dos
registradores durante uma excesso, salvo esta situao, ele pode ser usado normalmente pelo
programador.

Figura 1 Registradores Arquitetura ARM

2.3 Program Status Register


Estrutura de um CPSR ou SPSR (Current/Saved Program Status Register) ARM:

Figura 2 PSR_ARM

2.3.1 Flags de Condio


Os bits N, Z, C e V so flags de condio, e possvel alter-los atravs do resultado de operaes
lgicas ou aritmticas (ARM LIMITED, 2005).
Os flags de condio so normalmente modificados por:
-- Uma instruo de comparao (CMN, CMP, TEQ, TST).
-- Alguma outra instruo aritmtica, lgica ou move, onde o registrador de destino no o R15
(PC).
Nesses dois casos, as novas flags de condio (depois de a instruo ter sido executada)
normalmente significam:
N: Indica se o resultado da instruo um nmero positivo (N=0) ou negativo (N=1).
Z: Contem 1 se o resultado da instruo for zero (isso normalmente indica um resultado de
igualdade para uma comparao), e 0 se o contrrio.
C: Pode possuir significados diferentes:
-- Para uma adio, C contm 1 se a adio produz "vai-um" (carry) e 0 caso contrrio.
-- Para uma subtrao, C contm 0 se a subtrao produz "vem-um" (borrow) e 1 caso contrrio.-Para as instrues que incorporam deslocamento, C contm o ultimo bit deslocado para fora pelo
deslocador.
-- Para outras instrues, C normalmente no usado.
V: Possui dois significados:
-- Para adio ou subtrao, V contm 1 caso tenha ocorrido um overflow considerando os
operandos e o resultado em complemento de dois.
--Para outras instrues, V normalmente no usado.

2.3.2 Bits de Controle


Os oito primeiros bits de um PSR (Program Status Register ) so conhecidos como bits de
controle (ARM LIMITED, 2005). Eles so:
--Bits de desativao de interrupo
--Bit T
--Bits de modo
Os bits de controle mudam quando uma interrupo acontece. Quando o processador est
operando em um modo privilegiado, programas podem manipular esses bits.

2.3.3 Bits de desativao de interrupo


Os bits I e F so bits de desativao de interrupo:
-- Quando o bit I ativado, as interrupes IRQ so desativadas.
-- Quando o bit F ativado, as interrupes FIQ so desativadas.

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.

2.3.5 Bits de modo


Os bits M[4:0] determinam o modo de operao. Nem todas as combinaes dos bits de
modo definem um modo vlido, portando deve-se tomar cuidado para usar somente as combinaes
mostradas.
Bits ------------ Mode
10000 Usurio (usr)
10001 FIQ (fiq)
10010 IRQ (irq)
10011 Supervisor (svc)
10111 Abort (abt)
11011 Indefinido (und)
11111 Sistema (sys)

3 Programao assembly para ARM


Todas as instrues do ARM ocupam exatamente 32 bits, como mostrado na figura abaixo:

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:

As instrues Assembly para microprocessadores ARM, podem ser divididas entre:


Instrues de Load/Store;
Instrues de Branch (Jump);
Instrues de operaes com dados;
Instrues de co-processador;
Instrues de gerao de exees;
Instrues de transferncia de registradores de estado;

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

Existem duas opes para a codificao do campo Operando 2.


1. Se I for 0, o segundo operando um registrador, cujo contedo pode ser deslocado:
Este deslocamento pode de quatro formas:

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

-> Instrues de co-processador


So instrues para fazer a comunicao com co-processadores. Existem trs tipos de instrues de
co-processador:
1 - Instrues de processamento de dados - iniciam uma operao interna especfica do coprocessador.
2 - Instrues de transferncia de dados transferem dados de co-processador para/da memria. O
endereo da transferncia calculado pelo processador ARM.
3 - Instrues de transferncia de registradores - estes permitem um valor do co-processador ser
transferido para ou a partir de um registrador ARM.
Sintaxe:
CDP{<cond>} cp, opcode1, Cd, Cn {, opcode2}
<MRC|MCR>{<cond>} cp, opcode1, Rd, Cn, Cm {, opcode2}
<LDC|STC>{<cond>} cp, Cd, addressing

CDP
MRC, MCR
LDC, STC

Realiza uma operao no co-processador


Move dados de/para registradores do coprocessador
Load/Store blocos da memria de/para
um co-processador

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*/

4 Peculiaridades da programao C para ARM


4.1 Diferenas bsicas na linguagem C para ARM
Para trabalhar com as peculiaridades da programao C para ARM, temos que ir a fundo em
alguns conceitos da linguagem C. Primeiramente, a linguagem C uma linguagem de mdio nvel.
Isso significa que a linguagem C combina elementos de linguagens de alto nvel com a
funcionalidade da linguagem assembly. Assim, como a linguagem C utiliza-se de manipulao de
bits, bytes e endereos, isso resulta em uma linguagem extremamente portvel, ou seja, facilmente
convertida de um computador a outro. Isso pode deixar uma dvida: quais seriam as diferenas
entre programar em linguagem C para sistemas diferentes. A resposta pode ser tratada em dois
nveis, o nvel de compilao e o da prpria programao.
Em nvel de compilao, importante relembrar que C uma linguagem de mdio nvel.
Ou seja, a linguagem utiliza-se, no caso de C, de funes utilizadas de diversas formas. As funes
da linguagem C, quando compiladas, chamam instrues em assembly, que por sua vez,
convertido para cdigo binrio, que assim ser executado pela CPU. nessa converso que ocorre
nosso problema: O cdigo C pode ser o mesmo para qualquer computador, mas o cdigo assembly
varia de acordo com a arquitetura do processador. Esse um problema simples, porm importante
ressaltar que necessrio um compilador especfico para cada sistema que ser usado.
O nosso segundo problema envolve tanto o nvel de programao do usurio, quanto a
programao das chamadas bibliotecas ou cdigos de cabealho, e envolve a chamada de system
calls. Quando a system call chamada, o processo chama o kernel do sistema operacional para que
a instruo seja executada. Porem, as system calls so especficas para cada sistema operacional.
Como a linguagem C permite a chamada de system calls tanto pelas bibliotecas quanto pelo prprio
cdigo do usurio, importante que o programador se atente ao sistema operacional usado, para
que escreva seu cdigo de maneira compatvel com o sistema operacional utilizado.

4.2 System Calls especificas


Para tratar de system calls especficas, necessrio tratar tambm de um sistema especfico.
O sistema operacional NKE, que ser programado durante o projeto, ainda um sistema em
desenvolvimento, portanto nesta sesso trataremos do conceito de system call para o ARM. Uma
system call normalmente uma operao em que o usurio no tem controle diretamente, portanto,
ele chama o sistema operacional para que este execute a operao. Alguns exemplos de uso de
system calls so a criao de semforos, threads, processos e operaes de I/O. A execuo de uma
system call efetua a chamada de uma interrupo no sistema. Assim, para o ARM, o tratamento de
interrupes implica no uso de um dos modos citados anteriormente (FIQ, IRQ, supervisor, abort,
system e indefinido), portanto, na criao de uma system call, importante analisar principalmente
o modo de operao em que o ARM executar a instruo, visando maximizar o desempenho.

4.3 Ponteiros de funes


Quando programando um sistema operacional, importante saber bem a definio de
ponteiro, j que o ponteiro referencia uma posio de memria. Como a placa ARM utilizada no
projeto do NKE no possui MMU e portanto, no implementa memria virtual, importante que
ponteiros sejam amplamente utilizados.
Um ponteiro de funo utilizado quando se quer passar uma funo como argumento para
outra funo. Ponteiros para funes podem ser passados como argumentos para outras funes, e a
funo apontada pode ser invocada a partir de seu ponteiro.

4.4 Integrao do cdigo assembly em C


Para estudar a integrao C-assembly, precisamos primeiramente de um estudo aprofundado
no compilador. Virtualmente, todo compilador C tem uma opo de tempo de compilao que faz
com que o compilador gere uma listagem do cdigo em linguagem assembly. Estudando esse
arquivo, podemos aprender bastante a respeito do seu funcionamento.
No entanto, embora no seja implementado por todo compilador, alguns compiladores
implementam a possibilidade de programao assembly in-line, ou seja, utilizar em meio a linhas de
cdigo C, instrues em assembly. Isso pode se fazer til quando se tem a necessidade de usar uma
linguagem de baixo nvel em um programa grande, tornando invivel que o programa inteiro seja
escrito em linguagem de baixo nvel.
Para utilizar a linguagem assembly em C, necessrio colocar a extenso asm antes da
instruo, como exemplificado no programa abaixo:
void_initport(void)
{
printf(inicializando a porta \n);
asm mov AX, 88
asm out 20, AX
asm out 21, AX
}
Esse cdigo exemplifica bem uma integrao de assembly em C, utilizada para ter o controle do
sinal enviado.
A programao em assembly extremamente complicada. No geral, no aconselhado o
uso da linguagem assembly integrada em C. Porm, h duas situaes em que se faz necessrio esse
uso. A primeira quando no h outra maneira de alcanar o resultado desejado, como, por
exemplo, no cdigo citado, quando necessrio interagir diretamente com um dispositivo de
hardware que no pode ser operado utilizando C. A segunda quando se faz necessrio reduzir o
tempo de execuo de um programa em C. Deve-se escolher muito bem as funes a serem
codificadas em assembly, para que o aumento na velocidade seja significativo, e para isso,
importante conhecer muito bem o cdigo gerado pelo compilador usado.

5.2 Modo Thumb


O modo Thumb consiste em usar instrues de 16 bits ao invs de 32. Muitos dos mais
populares micro controladores de 32 bits atuais usam a tecnologia RISC. Ao contrrio de
processadores CISC, os RISC geralmente executam cada instruo em um nico ciclo de clock, o
que normalmente resulta em uma execuo mais rpida do que em um processador CISC com a
mesma velocidade de clock.
O aumento da performance, no entanto, tem um preo: um processador RISC normalmente
precisa de mais memria do que um CISC para armazenar o mesmo programa. Muitas das funes
complexas realizadas em uma instruo nica, ainda que lenta, em um processador CISC podem
exigir dois, trs, ou mais simples instrues em um RISC.
Para reduzir os requisitos de memria e, assim, o custo, Advanced RISC Machines (ARM)
criou a instruo Thumb definida como uma opo para seus ncleos de processador RISC

7 Apndices
Tabela ASCII

Cdigo Assembly ARM Lista Suporte


Operaes Bsicas:
- Operaes aritmticas:
ADD r0, r1, r2 (r0 = r1 + r2)
ADC r0, r1, r2 (r0 = r1 + r2 + C)
SUB r0, r1, r2 (r0 = r1 - r2)
SBC r0, r1, r2 (r0 = r1 - r2 + C 1)
RSB r0, r1, r2 (r0 = r2 r1)
RSC r0, r1, r2 (r0 = r2 r1 + C 1)
- Movimentao de Registradores:
MOV r0, r2 (r0 = r2)
MVN r0, r2 (r0 = not r2)
- Operaes Lgicas com Bits:
AND r0, r1, r2 (r0 = r1 and r2)
ORR r0, r1, r2 (r0 = r1 or r2)
EOR r0, r1, r2 (r0 = r1 xor r2)
BIC r0, r1, r2 (r0 = r1 and (not) r2)
- Operaes de Comparao (afetam os flags de condio):

CMP r1, r2 (set cc on r1 - r2) comparao


CMN r1, r2 (set cc on r1 + r2) comparao com o negativo (r1-(-r2))
TST r1, r2 (set cc on r1 and r2)
TEQ r1, r2 (set cc on r1 xor r2)

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.

GE Greater than or equal


This is true if N is cleared and V is cleared, or N is set and V is set.

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.

LE Less than or equal


This is the same as LT, and is also true whenever the Z flag is set.

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

Вам также может понравиться