Frédéric Boulanger
frederic.boulanger@centralesupelec.fr
cmpb, beq, blt<=, <, ==, >, >=for et whilea < b : cmp a, b; blt vraia <= b : idem que not b < a, d'où : cmp b, a; blt fauxa == b : cmp a, b; beq vraia != b : cmp a, b; beq fauxa > b : cmp b, a; beq vraia >= 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 r2mult 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
rxadressebl = 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 :