Você está na página 1de 32

27-10-06 C/++ na arquitectura ARM 1

Ezequiel Conde, ezeq@cc.isel.ipl.pt


A linguagem C na arquitectura ARM
27-10-06 C/++ na arquitectura ARM 2
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Tipos
A norma ANSI C deine os seguintes tipos !"sicos#
char short int long float double long double
As dimens$es impostas para cada tipo s%o as seguintes#
sizeof(char) >= 8 bit sizeof(short) >= 16 bit
sizeof(int) >= 16 bit sizeof(long) <= 32 bit
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
sizeof(float) <= sizeof(double) <= sizeof(long double)
sizeof(int) & igual ' dimens%o natural da m"quina.
(s tipos deri)ados *struct, union, array, class+ s%o agregados de tipos
!"sicos.
(s apontadores s%o endere,os da mem-ria.
( compilador .N/ suporta o tipo long long que tem uma capacidade de codiica,%o
que & o do!ro de long.
(s qualiicadores signed e unsigned s%o suportados por instru,$es adequadas.
27-10-06 C/++ na arquitectura ARM 3
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Tipos 0 dimens$es e alin1amento
2 2 pointer
2 3 dou!le
2 2 loat
2 3 long long
2 2 long
2 2 int
4 4 s1ort
5 5 c1ar
Alin1amento
*!6tes+
7imens%o
*!6tes+
Tipo
( alin1amento de um tipo composto
& igual ao maior alin1amento interno.
A dimens%o de um tipo composto &
m8ltipla do seu alin1amento.
char c = a;
int i = !123"#6$8;
%data
c& %b'te (a
i& %)ord !123"#6$8
...
12
c:
34
56
78
a
...
i:
xxxxxx0f
xxxxxx10
xxxxxx11
xxxxxx12
xxxxxx13
xxxxxx14
xxxxxx15
%data
c& %b'te (a
%align
i& %)ord !123"#6$8
A )ari")el i do
tipo 9ord est"
desalin1ada
...
12
c:
34
56
78
a
...
i:
xxxxxx0f
xxxxxx10
xxxxxx11
xxxxxx12
xxxxxx13
xxxxxx14
xxxxxx15
xxxxxx16
xxxxxx17
xxxxxx18
27-10-06 C/++ na arquitectura ARM 4
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Tipos : porta!ilidade
t'*edef unsigned char +8;
t'*edef unsigned short +16;
t'*edef unsigned long +32;
t'*edef unsigned long long +6";
t'*edef char ,8;
t'*edef short ,16;
t'*edef long ,32;
t'*edef long long ,6";
-define +32./01 "22"26$22#+3
-define +16./01 6##3#+
-define +8./01 2##
-define ,32./01 21"$"836"$3
-define ,16./01 32$6$
-define ,8./01 12$
-define ,32./,4 (521"$"836"83)
-define ,16./,4 (532$68)
-define ,8./,4 (5128)
Se se pretender porta!ilidade entre
di)ersas arquitecturas ter" que se
prestar aten,%o ao dom;nio de )alores
dos tipos utilizados.
/ma orma de garantir a mesma
dimens%o para os tipos !"sicos em
di)ersas arquitecturas & usar no)os
tipos */3, /5<, ...+ e assegurar a
dimens%o adequada por redeini,%o
*)er e=emplo ao lado+.
27-10-06 C/++ na arquitectura ARM 5
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Estruturas de controlo de lu=o *i ... else+
i ... else
if (e!*ression) state6ent1 else state6ent2

Se as ac,$es condicionais se traduzirem por poucas instru,$es *at& >+ de)e usar:
se instru,$es condicionais.
%%%
<inst><cond>
<inst><not cond>

Se as ac,%os condicionais se traduzirem por muitas instru,$es de)e usar:se o


seguinte padr%o#
%%%
b<cond> else
%%%
b endif
else&
%%%
endif&
e=pression
statement5
statement4
e=pression
statement5
statement4
27-10-06 C/++ na arquitectura ARM 6
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Estruturas de controlo de lu=o *s9itc1+
s9itc1
s)itch(e!*ression) 7
case constant1& state6ents1
case constant2& state6ents2
case constant3& state6ents3
default& state6ents8
9
ldr r3, :f*, -532;
ldr r3, :r3;
c6* r3, -6
ldrls *c, :*c, r3, asl -2;
b %32
%31&
%)ord %33
%)ord %3"
%)ord %3#
%)ord %36
%33&
%%%
b %32
%3"&
%%%
b %32
%3#&
%%%
b %32
%36&
%%%
b %32
%32&
%%%
27-10-06 C/++ na arquitectura ARM 7
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Estruturas de controlo de lu=o *or, 91ile, do ... 91ile+
for (e!*ression1; e!*ression2; e!*ression3)
state6ent
%%%
loo*&
%%%
be< e!it
%%%
%%%
b loo*
e!it&
)hile (e!*ression) state6ent
loo*&
%%%
be< e!it
%%%
b loo*
e=pression5
e=pression4
e=pression>
statement
e=pression
statement
do 7
statement
9 )hile (expression);
loo*&
%%%
%%%
bne loo*
statement
e=pression
!rea? 0 interromper o ciclo corrente
continue 0 saltar para a a)alia,%o da
condi,%o
goto 0 saltar para a la!el indicada.
return 0 sair da un,%o.
27-10-06 C/++ na arquitectura ARM 8
Ezequiel Conde, ezeq@cc.isel.ipl.pt
(pera,$es com !its
7eslocar um )alor para a esquerda n posi,$es#
b = a << n; 6o= r1, r, lsl r
Colocar um !it a zero#
b = a > ?(1 << n); 6o= r2, -1
6=n r2, r2, lsl r
and
r1, r1, r2
Colocar um !it a um#
b = a @ 1 << n; 6o= r2, -1
orr r1, r2, lsl r
Testar o )alor de um !it#
if (a > (1 << n)) 6o= r2, -1
tst r1, r2, lsl r
& AND bit a bit
| OR bit a bit
^ XOR bit a bit
<< deslocamento para a esquerda
>> deslocamento para a direita
~ negao bit a bit
(!ter o campo de n !its a come,ar na posi,%o p. A posi,%o @ & a mais ' direita.
unsigned getbits(unsigned !, int *, int n) 7 return ( ! >> *) > ?(? << n); 9
getbits&
6=n r3, -
6=n r3, r3, lsl - r2
and r, r, r3, lsr >> r1
6o= *c, lr
27-10-06 C/++ na arquitectura ARM 9
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Apontadores
Aritm&tica de apontadores
Considerando#
int A *, A<;
int n;
p A n aponta n elementos ' rente do apontado por p. Se n ti)er o )alor 2, p ser"
aumentado de 5< unidades.
a = A(* B n); ldr r, :r1, r2, lsl -2; ; a = r * = r1 n = r2
p 0 q representa o n8mero de elementos entre os apontados por p e q, mais um.
n = * 5 <; sub r, r, r1 ; * ? r < ? r1 n ? r2
6o= r2, r asr -2
27-10-06 C/++ na arquitectura ARM 10
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Apontadores e arrays
%data
char a, b; a& %b'te
b& %b'te
int i, C; i& %int
C& %int
char A c*; c*& %)ord
int A i*; i*& %)ord
%te!t
c* = >a; ldr r, =a
ldr r1, =c*
str r, :r1;
b = Ac*; ldr r, =c*
ldr r, :r;
ldrb r, :r;
ldr r1, =b
strb r, :r1;

(s apontadores s%o endere,os de mem-ria. Na arquitectura ARM s%o representados


a >4 !its.
Buando se declara um array *int arra':1;; + esta!elece:se um nome que & um
apontador para o primeiro elemento. A utiliza,%o do operador inde=a,%o * arra':i; + &
o equi)alente a A(arra' B i)%
i = Ai*; ldr r, =i*
ldr r, :r;
ldr r, :r;
ldr r1, =i
str r, :r1;
c*BB; ldr r, =c*
ldr r1, :r;
add r1, r1, -1
str r1, :r;
i*BB; ldr r, =i*
ldr r1, :r;
add r1, r1, -"
str r1, :r;
27-10-06 C/++ na arquitectura ARM 11
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Apontadores e arrays
i* = i* B i; ldr r, =i* r = >i*
ldr r1, :r; r1 = i*
ldr r3, =i r3 = >i
ldr r2, :r3; r2 = i
add r1, r1, r2, lsl -2 r1 = i* B i
str r1, :r; i* = i* B i
C = A(i* B i);
C = i*:i;;
ldr r, =i* r = >i*
ldr r1, :r; r1 = i*
ldr r3, =i r3 = >i
ldr r2, :r3; r2 = i
ldr r2, r1, r2, lsl -2 r2 = i*:i;
ldr r1, =C r1 = >C
str r2, :r1; C = i*:i;
27-10-06 C/++ na arquitectura ARM 12
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Modelo de mem-ria
.data
.rodata
.tet
.!""
."tac#
.$ea%
As componentes *un,$es, )ari")eis, ...+ de um
programa em CAA s%o aloCadas pela mem-ria
segundo crit&rios que permitam#
agrupar componentes com as mesmas
caracter;sticas *Dc-digo com c-digoE,
D)ari")eis com )ari")eisE, ...+.
manipular zonas de mem-ria *aloCar em RAM
ou em R(M, comprimir, iniciar+.
optimizar a dimens%o da mem-ria ocupada e
a eiciFncia dos acessos.
A especiica,%o el deine a seguinte organiza,%o
!"sica#
.stack zona de stack do programa.
.heap zona de 1eap do programa.
.bss )ari")eis iniciadas a zero.
.data )ari")eis com )alor inicial deinido.
.rodata constantes.
.text c-digo das instru,$es.
RAM
RAM G R(M
27-10-06 C/++ na arquitectura ARM 13
Ezequiel Conde, ezeq@cc.isel.ipl.pt
AloCamento
int i; DD %bss "
static int C; DD %bss "
char no6es:1;:2;; DD %bss 2
int ! = 2; DD %data "
static int ' = 2"; DD %data "
char n:; = EFoa<ui6E; DD %data 8
const char n:; = EFoa<ui6E; DD %rodata 8
char A c = EGranciscoE; DD %data " %rodata 1
char A const c = EGranciscoE; DD %rodata 16
const char A c = EallE; DD %data " %rodata "
int 6ain() 7
static int i = ##; DD %data "
int C; DD %stacH "
int H = 3"; DD %stacH "
const int = 2; DD %stacH "
static const int = 2; DD %rodata "
9
27-10-06 C/++ na arquitectura ARM 14
Ezequiel Conde, ezeq@cc.isel.ipl.pt
AHCS 0 /tiliza,%o dos registos
/tiliza,%o Registo Nome
AHCS
Retorno de )alores r@ e r5
Hrogram counter r5I pc
Endere,o de retorno r52 lr
Stac? pointer r5> sp
Jrame pointer r55 p
N%o )ol"til r2:r5@ )5:)K
Lol"til r@:r>, r54
Argumentos r@:r> a5:a2
27-10-06 C/++ na arquitectura ARM 15
Ezequiel Conde, ezeq@cc.isel.ipl.pt
AHCS 0 Stac?

( stack cresce de endere,os altos para endere,os !ai=os.

/ma un,%o ol1a pode n%o precisar de stack frame.

( stack pointer est" sempre alin1ado num endere,o m8ltiplo de 2.

( stack pointer cont&m o endere,o da pala)ra mais recente armazenada no stack.


I+JK 5 st6db s*L, 7%%%9 = st6fd s*L, 7%%%9
IMI N ld6ia s*L, 7%%%9 = ld6fd s*L, 7%%%9
OMI 5 ld6ia s* , 7%%%9 = ld6fd s* , 7%%%9
%%%
sp
ull descending
27-10-06 C/++ na arquitectura ARM 16
Ezequiel Conde, ezeq@cc.isel.ipl.pt
AHCS 0 Hassagem de parMmetros

(s tipos c1ar, s1ort, int, long e pointer ocupam uma 9ord.

Agregados ocupam sempre um n8mero m8ltiplo de 9ords.

Lalores em )irgula lutuante ocupam um n8mero m8ltiplo de 9ords.

(s argumentos ormam uma sequFncia de 9ords com a ordem com que est%o escritos.

At& 's primeiras quatro 9ords s%o passadas nos registos de a5 a a2. As restantes s%o
passadas pelo stack, empil1adas por ordem in)ersa.
=oid f(int a, int b, int c, int d, int e, int f);
a
!
c
d
e
...
r@
r5
r4
r>
sp
27-10-06 C/++ na arquitectura ARM 17
Ezequiel Conde, ezeq@cc.isel.ipl.pt
AHCS 0 Retorno de )alores de un,$es

(s tipos c1ar, s1ort, int, long, loat e pointer s%o retornados em r@.

(s agregados de dimens%o igual ou inerior a uma 9ord e com todos os campos


acess;)eis no mesmo oset s%o retornados em r@.

( tipos dou!le e long long s%o retornados em r5#r@.

(s outros )alores s%o depositados numa zona de mem-ria ornecida pelo c1amador,
para o eeito. ( endere,o desta zona de mem-ria & passado como mais um parMmetro
inserido automaticamente pelo compilador na primeira posi,%o.
struct 7 int a; int b; char c; 9 t;
int arg;
t = function(arg);
A c1amada a unction & processada como se esti)esse escrita da seguinte orma#
=oid function(>t, arg);
27-10-06 C/++ na arquitectura ARM 18
Ezequiel Conde, ezeq@cc.isel.ipl.pt
E=emplos de codiica,%o de un,$es *5+
=oid f() 7
9
f&
6o= *c, lr
int f1(int !) 7
return !;
9
f1&
6o= *c, lr ; r 6antP65se inalterado
int su6(int !, int C) 7
return ! B C;
9
su6&
add r, r, r1
6o= *c, lr
size.t strlen(char A str) 7
size.t count = ;
)hile (Astr)
BBcount;
return count;
9
strlen&
6o= r1, r
6o= r, -
1&
ldrb r2, :r1;, -1
c6* r2, -
6o=e< *c, lr
add r, r, -1
b 1b
27-10-06 C/++ na arquitectura ARM 19
Ezequiel Conde, ezeq@cc.isel.ipl.pt
AHCS 0 Stac? rame
"rea de sal)amento
dos registos
)ari")eis locais
loca,$es da un,%o
alloca
espa,o reser)ado
para a maior lista de
parMmetros
SH
JH
"rea de sal)amento
dos registos
)ari")eis locais
loca,$es da un,%o
alloca
argumentos no stac?
JH
"rea de sal)amento
dos registos
)ari")eis locais
loca,$es da un,%o
alloca
espa,o reser)ado
para a maior lista de
parMmetros
SH
stac? rame
da un,%o
c1amada
Nas un,$es com
um n8mero de
parMmetros )ari")el
& reser)ado no
stack, depois de
e)entuais
argumentos, um
espa,o para
preser)a,%o de
argumentos
an-nimos passados
em registos
27-10-06 C/++ na arquitectura ARM 20
Ezequiel Conde, ezeq@cc.isel.ipl.pt
AHCS 0 C-digo para pr-logo e ep;logo
6o= r12, s*
st6fd s*L, 7%%%, f*, r12, lr, *c9
sub f*, r12, -"
sub s*, s*, -%%%
ld6db f*, 7%%%, f*, s*, *c9
%%%
pc
lr
sp
p
%%%
sp
p
sp
p
sp
lr
pc
p
27-10-06 C/++ na arquitectura ARM 21
Ezequiel Conde, ezeq@cc.isel.ipl.pt
E=emplo de codiica,%o de un,$es *4+
int su6(int i, int C) 7
return i B C;
9
int tri*le(int !) 7
return su6(!, su6(!, !));
9
int 6ain() 7
return tri*le(2);
9
pr-logo
ep;logo
su6&
add r, r, r1
6o= *c, lr
tri*le&
6o= r12, s*
st6db s*L, 7r", f*, r12, lr, *c9
sub f*, r12, -"
6o= r", r
6o= r1, r
bl su6
6o= r1, r"
bl su6
ld6db f*, 7r", f*, s*, *c9
6ain&
6o= r12, s*
st6db s*L, 7f*, r12, lr, *c9
sub f*, r12, -"
6o= r, -2
bl tri*le
ld6db f*, 7f*, s*, *c9
27-10-06 C/++ na arquitectura ARM 22
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Jun,%o com )ari")eis locais
int su6(int i, int C) 7
return i B C;
9
int f(int a, b, c, d, e, f) 7
int al, bl, cl, dl;
%%%
return su6(al, f);
9
int 6ain() 7
return f(1, 2, 3, ", #, 6);
9
f& 6o= r12, s*
st6db s*L, 7f*, r12, lr, *c9
sub f*, r12, -"
sub s*, s*, -16
%%%
ldr r, :f*, -516; Q r = al
ldr r1, :f*, -B8; Q r1 = f
bl su6
ld6db f*, 7f*, s*, *c9
6ain&
6o= r12, s*
st6db s*L, 7f*, r12, lr, *c9
sub f*, r12, -"
6o= r, -6
str r, :s*, -5";L
6o= r, -#
str r, :s*, -5";L
6o= r, -1
6o= r1, -2
6o= r2, -3
6o= r3, -"
bl f
ld6db f*, 7f*, s*, *c9
As )ari")eis locais s%o
preerencialmente aloCadas nos
registos do processador *)5 a )3+.
Buando isso n%o & poss;)el s%o
aloCadas no stac?.
27-10-06 C/++ na arquitectura ARM 23
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Jun,%o com n8mero de parMmetros )ari")el
=oid 6's*rintf(char A str; char A f6t, %%%) 7
=a.list a*;
char A *;
=a.start(a*, f6t);
for (* = f6t; A*; BB*) 7
if (A* L= (R)
AstrBB = A*;
s)itch(ABB*) 7
case (d& 7
int i=al = =a.arg(a*, int);
itoa(str, i=al);
breaH; 9
case (s& 7
char A s;
for (s = =a.arg(a*, char A); As ; BBs)
AstrBB = As;
breaH; 9
default&
AstrBB = A*;
9 9
=a.end(a*);
Astr = (S;
9
27-10-06 C/++ na arquitectura ARM 24
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Jun,%o com n8mero de parMmetros )ari")el 0 acesso aos parMmetros
5. 7e)e ser deinido um apontador para a lista de parMmetros.
=a.list a*;
4. ( apontador para a lista de parMmetros de)e ser inicializado.
=a.start(=a.list a*, lastarg);
>. A macro )aNarg produz um )alor do tipo especiicado e aCusta o apontador
para o pr-=imo argumento da lista.
=a.arg(=a.list a*, t'*e);
2. No im do processamento e antes de sair da un,%o de)e e=ecutar:se
=a.end(=a.list a*);
27-10-06 C/++ na arquitectura ARM 25
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Jun,%o com n8mero de parMmetros )ari")el 0 acesso aos parMmetros
t'*edef char A =a.list;
-define .size(!) ((sizeof(!) B sizeof(int)51) > ?(sizeof(int)51))
DA 8i6ensao de ! arredondado *ara 6ulti*lo de sizeof(int) AD
-define =a.start(*, arg) (=oid) ((*) = (char A) > (arg) B .size(arg))
-define =a.arg(*, O) ( A (O A) ( ((*) B= .size(O)) 5 .size(O) ) )
-define =a.end(*) (=oid)
char 5 5 5
ap
ap A Nsize*c1ar+
9ord 9ord 9ord
E=ecu,%o de )aNarg*ap, c1ar+ num processador de >4 !its
stdarg%h
27-10-06 C/++ na arquitectura ARM 26
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Arranque e inaliza,%o de um programa
5. /m programa em CAA pode ser encarado como um conCunto de )ari")eis e un,$es.
4. A un,%o principal tem o!rigatoriamente o nome main.
>. A un,%o main & c1amada do m-dulo de arranque.
2. ( m-dulo de arranque, antes de c1amar main, prepara o am!iente de e=ecu,%o do
programa.
I. Esta prepara,%o depende dos recursos necess"rios e dispon;)eis para o programa.
<. E=emplo de ac,$es de prepara,%o a e=ecutar antes de c1amar main.
5. Inicia,%o das un,$es de !i!lioteca.
4. Inicia,%o da mem-ria *)ari")eis iniciadas+.
>. Hassagem de argumentos ao programa atra)&s de main.
2. E=ecu,%o dos construtores dos o!Cectos glo!ais.
K. 7epois de main retornar s%o e=ecutadas ac,$es de inaliza,%o do programa.
3. E=emplos de ac,$es a e=ecutar na inaliza,%o de um programa#
5. E=ecu,%o dos destrutores dos o!Cectos glo!ais.
4. Oi!erta,%o de recursos alocados pelo programa, como li!erta,%o de mem-ria alocada
dinamicamente, ec1o de ic1eiros a!ertos, etc.
P. Em sistemas em!e!idos a un,%o main pode n%o retornar.
27-10-06 C/++ na arquitectura ARM 27
Ezequiel Conde, ezeq@cc.isel.ipl.pt
M-dulo de arranque
%te!t
%global .start
.start&

ldr s*, =..stacH.end..


ldr r1, =..bss.start..
ldr r2, =..bss.end..
6o= r, -
c6* r1, r2
bhs 2f
1&
str r, :r1;, -"
c6* r1, r2
blo 1b
2&
6o= r, -
6o= r1, -
bl 6ain
b %
%section %stacH
%s*ace 8B12"
..stacH.end..&
Hara um programa que n%o use un,$es de
!i!lioteca, n%o rece!a parMmetros, n%o possua
o!Cectos glo!ais, esteCa carregado em mem-ria onde
)ai e=ecutar, este pode ser o seu m-dulo de
arranque.

Hor con)en,%o, a la!el Nstart indica a


primeira instru,%o do programa a e=ecutar.
As la!els ..bss.start.., ..bss.start..,
..stacH.end.. indicam, respecti)amente, o
in;cio e o im da sec,%o !ss e o im da sec,%o
stac?.

( ciclo deinido pela la!el 5 inicia a sec,%o


!ss a zero. Esta sec,%o aloCa as )ari")eis
sem inicia,%o e=plicita.

A coloca,%o de r@ e r5 a zero, signiica passar


zero como )alores actuais dos parMmetros
ormais argc e arg).
int 6ain(int argc, char A arg=:;);

Se a un,%o main retornar o processador ica


D!loqueadoE em b %
27-10-06 C/++ na arquitectura ARM 28
Ezequiel Conde, ezeq@cc.isel.ipl.pt
M-dulos : 5

A di)is%o dos programas por m8ltiplos ic1eiros & uma pr"tica necess"ria.

/ma parte de um programa num m-dulo interage com outra parte noutro m-dulo
atra)&s do acesso a )ari")eis desse m-dulo ou passando a e=ecu,%o para l".

As reerFncias, para )ari")eis ou para instru,$es *un,$es+, s%o eitas atra)&s de


s;m!olos.

( s;m!olo representa o endere,o do elemento reerenciado.

Hara que um s;m!olo deinido num m-dulo seCa )is;)el noutro & necess"rio que este
seCa glo!almente )is;)el.

Na linguagem Assem!l6, por omiss%o, um s;m!olo & )is;)el apenas no m-dulo onde &
declarado. Hara o tornar glo!almente )is;)el & necess"rio e=plicitar#
%global 6ain
6ain&

/m s;m!olo glo!almente )is;)el precisa ser con1ecido no m-dulo onde & reerenciado.

( as assume que um s;m!olo reerenciado e n%o declarado no m-dulo actual & glo!al
e & declarado noutro m-dulo.
27-10-06 C/++ na arquitectura ARM 29
Ezequiel Conde, ezeq@cc.isel.ipl.pt
M-dulos : 4

Na linguagem C, por omiss%o, um s;m!olo & glo!almente )is;)el. Hara o tornar )is;)el
apenas no m-dulo onde & deinido de)e usar:se o atri!uto static.

int =Q = & glo!almente )is;)el.

static int 6Q 6 & local 0 )is;)el apenas no m-dulo onde & deinido.

Hara se poder usar um s;m!olo deinido noutro m-dulo & necess"rio que este seCa
declarado no m-dulo onde & usado#

e=tern int zQ : declara que e=iste um s;m!olo z, do tipo int, deinido noutro m-dulo.

int strlen*c1ar Rstr+Q 0 declara que e=iste um s;m!olo strlen, que representa uma
un,%o que rece!e um apontador para c1ar e de)ol)e um int. A sua deini,%o
encontra:se algures noutro m-dulo.

7eclarar uma entidade consiste em anunciar a sua e=istFncia.

7einir uma entidade implica reser)ar espa,o e e=plicitar as instru,$es que


determinam o seu comportamento. *Hrograma,%o em CAA, p"g. ><+.
27-10-06 C/++ na arquitectura ARM 30
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Modulos, !i!liotecas
Inclus%o de ic1eiros
Em assembly#
%include Uficheiro%hV
Em C#
-include <ficheiro%h>
-include Uficheiro%hV
( compilador interpreta o conte8do do ic1eiro indicado como se este izesse parte do
ic1eiro corrente.
(s ic1eiros de inclus%o, normalmente com a e=ten,%o .1, cont&m declara,$es de )ari")eis
e un,$es e deini,$es de macros. A deini,%o das )ari")eis e un,$es encontram:se em
ic1eiros .c .cpp ou .s
27-10-06 C/++ na arquitectura ARM 31
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Hreprocessador de C

Macros
-define texto texto de substituio
-define 6in(a, b) ((a) < (b) W (a) & (b))
-define cat(a, b) a -- b
-define d*rint(e!*r) *rintf(-e!*r U = RdSnV, e!*r)
-undef texto 0 para anular a deini,%o de uma macro.
A deini,%o da macro pode ocupar mais do que uma lin1a de te=to. Nesse caso as lin1as de
te=to que a constituem, e=cepto a 8ltima, s%o terminadas por STU.

Inclus%o de ic1eiros
-include Ufilena6eV
-include <filena6e>

Compila,%o condicional
-if e!*ression
-elif e!*ression
-else
-endif
-ifdef P o 6es6o <ue -if defined(s'6bol)
-ifndef P o 6es6o <ue -if Ldefined(s'6bol)
27-10-06 C/++ na arquitectura ARM 32
Ezequiel Conde, ezeq@cc.isel.ipl.pt
Vi!lioteca normalizada
assert.1 loat.1 mat1.1 stdarg.1 stdli!.1
ct6pe.1 limits.1 setCmp.1 stdde.1 string.1
errno.1 locale.1 signal.1 stdio.1 time.1