Vous êtes sur la page 1sur 6

TD 2 COMPILATION

Int x ; Int a = 100 ; Int b = 170

Main(){

X = a*2+ (b-5)/3 ;

Variable local dans la pile

write(x)

Include beta uasm

Include intio uasm

Aphons

CMOVE(pile, SP)

BR(début)

(Date)

Début(Code)

CALL(main) HALT()

Main : PUSH (LP) PUSH (BP) MOVE(SP,BP)

Instruction :

Ret_Main POP(BP) POP(LP) RTN()

Pile(pile) on range les variables les expressions dans la pile

I1(Parcours en largeur d’abord par la droite puis gauche)

LD(a,RO) met en sommet de pile la valeur de a dans RO puis PUSH(RO) a dans la Stack

CMOVE(2,RO) PUSH(R0) 2

POP(R2) POP(R1) MULL(R1,R2,R3) PUSH(R3) *

LD(b,R0) PUSH(R0) b

CMOVE(5,R0) PUSH(R0) 5

POP(R2) POP(R1) SUB(R1,R2,R3) PUSH(R3) -

CMOVE(3,R0) PUSH(R0) POP(R3) POP(R1) 3

DIV(R1,R2,R3) PUSH(R3) -

POP(R2) POP(R1) ADD(R1,R2,R3) PUS(R3) +

POP(R0) ST(RO,x) = *

LD(x, R0) PUSH(R0) *


POP(R0) WRITE() fonction write

If (a>b){

X= 1000 ;

{else }

x=2000 ;

J’evalue a et b LD(a,R0) PUSH(R0) LD(b,R0) PUSH(R0) POP(R2) POP(R1) CMPLT(R2,R1,R3) compare on


a inverser PUSH(R3)

IF POP(R0) BF(RO, else) THEN (fsi)

Construire l’arbre X = a*2+ (b-5)/3 ;

Input arbre

Output code assembleur résultat un texte String

Ecire un algo : Genere expression

compare:

LD(a,R0)

PUSH(R0)

LD(b,R0)

PUSH(R0)

POP(R2)

POP(R1)

CMPLT(R2,R1,R3)

PUSH(R3)

else:

LD(2000,x)

LD(x,r0)

PUSH(R0)

POP(r0)

fsi:

LD(1000,x)
LD(x,r0)

POP(r0)

int x;

void f(){

x = 15;

void main(){

f();

x=x+1

debut: |Exercice 5

x : LONG(15)

function:

LD(x,R0)

ADD(x,15,R0)

PUSH(R0)

POP(R0)

void_main:

CALL(function)

LD(x,1,x)

debut: |Exercice 6 Somme des n premeirs entiers

max = 0;

p = first;
start: ADDC(r31,0,max) | Exercice 7 Maximum dans un tableau

ADDC(r31,first,p)

ADDC(r31,n,i)

loop: BEQ(i,done,r31)

LD(p,0,value)

CMPLT(max,value,r0)

BEQ(r0,endif,r31)

ADDC(value,0,max)

endif: ADDC(p, 4, p)

SUBC(i,1,i)

BEQ(r31,loop,r31)

Done:

int x;

void f(){

x = 15;

void main(){

f();

x=x+1

debut: |Exercice 5

x : LONG(15)

function:

LD(x,R0)

ADD(x,15,R0)

PUSH(R0)

POP(R0)

void_main:

CALL(function)
LD(x,1,x)

debut: |Exercice 6 Somme des n premeirs entiers

max = 0;

p = first;

start: ADDC(r31,0,max) | Exercice 7 Maximum dans un tableau

ADDC(r31,first,p)

ADDC(r31,n,i)

loop: BEQ(i,done,r31)

LD(p,0,value)

CMPLT(max,value,r0)

BEQ(r0,endif,r31)

ADDC(value,0,max)

endif: ADDC(p, 4, p)

SUBC(i,1,i)

BEQ(r31,loop,r31)

Done

Algo : générer-prog Intput= arbre tds= table des symboles → output=code Assembleur

Début : res←include beta uasm, include intio.uasm, options Hg (CMOVE(pilo,sp) BR(début)….)date6

res +←generate-date(tds) → a : LONG(0)

res +←debut CALL(main) HALT()

pour chaque fils(a) for res +←generat-fonction(f) finPour res +←PILE Fin

generate-affectation input arbre tds= table des symboles → output=code Assembleur

Algo : genereate-data prog Intput tds= table des symboles → output res =code Assembleur

Début pour each item de tds faire si item cat = global alors res +←item : LONG(item.val) fin
res +← Generate-expression (FilsDroit(a))

res +← POP (R0) ST(R0) FilsGauche(a).val.idf avec idf qui se trouve dans data variable globale

res +← Generate-expression input arbre → output res =code Assembleur

début cas1…….cas 7 Appel RDINT(lit un entier) stocker dans R0 et le lire dans la pile PUSH(R0)

Step1 Ecrire l’arbre en c : 0 a n instructions dans une fonction

void main{

a=f(1,2) ;

Int a; varaiable globe

Int fonction(int i , int j){

Int x;

x= i+j ;

return (x+10),

Vous aimerez peut-être aussi