Exercice 1 (Basic--). On consid`ere le langage Basic-- dont les

TD3
Exercice 1 (Basic--).On consid`ere le langage Basic-- dont les programmes sont des suites d’ins-
tructions “basiques” inst1,...,instl(chaque instruction a donc un num´ero). On ne dispose que de deux
variables enti`eres xet y. Une instruction basique inst est au choix :
une affectation de la forme xe, ou ye, o`u eest une expression arithm´etique,
un test ?x= 0, ou ?y= 0, qui a pour effet d’ignorer l’instruction suivante si la variable ne contient
pas 0
l’instruction push vqui met le contenu de la variable v(x,y, ou pc) sur la pile. Si vest pc, la
valeur mise sur la pile est le num´ero de l’instruction.
l’instruction pop v(xou y) qui enl`eve de la pile l’entier net le range dans v(si la pile est vide, v
re¸coit une valeur al´eatoire)
l’instruction goto equi passe `a l’instruction instksi l’expression arithm´etique es’´evalue en k.
Un programme qui comporte linstructions termine lorsque l’on cherche `a ex´ecuter l’instruction l+ 1.
On note A(m, n) la fonction d’Ackermann, d´efinie comme :
A(m, n) =
n+ 1 si m= 0
A(m1,1) si m > 0 et n= 0
A(m1, A(m, n 1))) si m > 0 et n > 0.
´
Ecrire un programme en Basic-- qui se termine avec la variable xqui contient A(m, n) lorsque
initialement la variable xcontenait met la variable ycontenait n.
Exercice 2 (Instructions Pentium).On rappelle que l’instruction “movl e1,e2” a pour effet d’´ecrire la
valeur d´enot´ee par e1dans le conteneur (registre ou emplacement m´emoire) d´enot´e par e2. Les expressions
e1,e2ont diff´erent format, notamment :
le format “imm´ediat” : $0x12,$0xcafe,. . .
le format “registre” : %eax,%ebx,. . .
le format “absolu” : 0x12,0xcafe,. . .
le format “indirect” : (%eax),%ebx,. . .
le format “indirect avec d´ecalage” : 0xcafe(%eax),(%eax,%ebx, 4), . . .
le format “adresse d’un indirect avec d´ecalage” : %0xcafe(%eax),. . .
1. L’instruction “leal e1,e2” a pour effet d’´ecrire l’adresse du conteneur e1dans le conteneur e2.
Quels sont les formats autoris´es pour e1et e2?
2. Lorsque e1et e2le permettent, r´e´ecrivez l’instruction “leal e1,e2” `a l’aide de movl
Exercice 3 (Switch C).On consid`ere la fonction C et sa traduction assembleur donn´ees `a la page
suivante.
1. On rappelle que le drapeau ZF (zero flag) est modifi´e par les instructions arithm´etiques et lu par
les instructions de branchement. Suivez dans le code assembleur le d´eroulement pas `a pas de la
fonction lorsque i=3 (Indication : on saute en LBB0 2).
2. Comment est renvoy´e le r´esultat de la fonction ? Comment est pass´ee la valeur initiale de la
variable i? O`u la variable iest-elle stock´ee par la suite ?
3. Pour i= 0, quels sont les labels visit´es, et quelle est la valeur renvoy´ee ?
4. Mˆeme question pour i= 2.
5. Mˆeme question pour i= 1.
1
int f ( int i ){
switch ( i ) {
case 1 : i ++;
case 3 : return 3 ;
default :{i−−;break ;}
case 2 : return 2 ;
}
return 0 ;
}
1f :
2pushq %rbp
3movq %rsp , %rbp
4movl %edi ,8(%rbp )
5movl %edi , %eax
6subl $3 , %edi
7movl %eax ,12(%rbp )
8movl %edi ,16(%rbp )
9j e LBB0 2
10 jmp LBB0 7
11 LBB0 7 :
12 movl 12(%rbp ) , %eax
13 subl $2 , %eax
14 movl %eax ,20(%rbp )
15 j e LBB0 4
16 jmp LBB0 8
17 LBB0 8 :
18 movl 12(%rbp ) , %eax
19 subl $1 , %eax
20 movl %eax ,24(%rbp )
21 jne LBB0 3
22 jmp LBB0 1
23 LBB0 1 :
24 movl 8(%rbp ) , %eax
25 addl $1 , %eax
26 movl %eax ,8(%rbp )
27 LBB0 2 :
28 movl $3 , 4(%rbp )
29 jmp LBB0 6
30 LBB0 3 :
31 movl 8(%rbp ) , %eax
32 addl $0xFFFFFFFF , %eax
33 movl %eax ,8(%rbp )
34 jmp LBB0 5
35 LBB0 4 :
36 movl $2 , 4(%rbp )
37 jmp LBB0 6
38 LBB0 5 :
39 movl $0 , 4(%rbp )
40 LBB0 6 :
41 movl 4(%rbp ) , %eax
42 popq %rbp
43 retq
Exercice 4 (Fonctions).On consid`ere la fonction C et sa traduction assembleur ci-dessous.
int f ( int i , int j ) {return ( i ==0)? j : f ( i 1 , i j ) ; }
1f :
2pushq %rbp
3movq %rsp , %rbp
4subq $16 , %rsp
5movl %edi ,4(%rbp )
6movl %e s i ,8(%rbp )
7cmpl $0 , 4(%rbp )
8jne LBB0 2
9movl 8(%rbp ) , %eax
10 movl %eax ,12(%rbp )
11 jmp LBB0 3
12 LBB0 2 :
13 movl 4(%rbp ) , %eax
14 subl $1 , %eax
15 movl 4(%rbp ) , %ecx
16 imull 8(%rbp ) , %ecx
17 movl %eax , %edi
18 movl %ecx , %esi
19 callq f
20 movl %eax ,12(%rbp )
21 LBB0 3 :
22 movl 12(%rbp ) , %eax
23 addq $16 , %rsp
24 popq %rbp
25 retq
1. Expliquez la diff´erence entre cette fonction et la pr´ec´edente quant au registre %rsp.
2. En vous inspirant des codes assembleurs ci-dessus, ´ecrivez le code assembleur d’une fonction `a un
seul argument calculant la factorielle.
2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !