Frédéric Boulanger
frederic.boulanger@centralesupelec.fr
cmp
b, beq, blt
<=, <, ==, >, >=
for
et while
a < b
: cmp a, b; blt vrai
a <= b
: idem que not b < a
, d'où : cmp b, a; blt faux
a == b
: cmp a, b; beq vrai
a != b
: cmp a, b; beq faux
a > b
: cmp b, a; beq vrai
a >= b
: cmp a, b; blt faux
if r0 < r1 :
r0 = r1 - r0
else :
r1 = r0 - r1
cmp r0, r1
blt vrai
sub r1, r0, r1
b fin
@vrai sub r0, r1, r0
@fin
if r0 <= r1 :
r0 = r1 - r0
else :
r1 = r0 - r1
cmp r1, r0
blt faux
@vrai sub r0, r1, r0
b fin
@faux sub r1, r0, r1
@fin
if
avec un branchement à la fin
r2 = 0
while r0 >= r1 :
r0 = r0 - r1
r2 = r2 + 1
mov r2, #0
@boucle cmp r0, r1
blt fin
sub r0, r0, r1
add r2, r2, #1
b boucle
@fin
while r0 < r1 :
r1 = r1 - 1
@boucle cmp r0, r1
blt ok
b fin
@ok sub r1, r1, #1
b boucle
@fin
b func
)r7
) b func
)r0
)r7
)
% r0 <- r0 * r1
@mult mov r2, #0
@loop cmp r0, #0
beq fin
add r2, r2, r1
sub r0, r0, #1
b loop
@fin mov r0, r2
b r7
% programme principal
@main mov r0, #3
mov r1, #4
mov r7, #next
b mult
@next mov r1, #2
mov r7, #nexxt
b mult
@nexxt mov r2, r0
…
mult
modifie r2
mult
appelle une autre fonction ?r7
?
% r0 <- r0 * r1
@mult push r2
mov r2, #0
@loop cmp r0, #0
beq fin
add r2, r2, r1
sub r0, r0, #1
b loop
@fin mov r0, r2
pop r2
b r7
% programme principal
@main mov sp, #stack
mov r0, #3
mov r1, #4
mov r7, #next
b mult
@next mov r1, #2
mov r7, #nexxt
b mult
@nexxt mov r2, r0
…
@stack rmw 1
% mult(r0, r1) =
% 0 si r0 = 0
% r1 + mult(r0-1, r1) sinon
@mult push r2
mov r2, #0
@loop cmp r0, #0
beq fin
sub r0, r0, #1
push r7
mov r7, #mlnxt
b mult
@mlnxt pop r7
add r2, r0, r1
@fin mov r0, r2
pop r2
b r7
% programme principal
@main mov sp, #stack
mov r0, #3
mov r1, #4
mov r7, #next
b mult
@next mov r1, #2
mov r7, #nexxt
b mult
@nexxt mov r2, r0
...
@stack rmw 1
bl rx, adresse
rx
adresse
bl
= Branch and Link
mov r7, #next
b func
@next …
On écrit simplement : bl r7, func
La pile contient :
Le tas contient les données allouées dynamiquement :