Professional Documents
Culture Documents
Se as ac,$es condicionais se traduzirem por poucas instru,$es *at& >+ de)e usar:
se instru,$es condicionais.
%%%
<inst><cond>
<inst><not cond>
(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 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&
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".
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.
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.
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