answerstoquestions 7.07 KB
2.1) Chaine de compilation 1/5

1) les exe ont été créés et envoyés sur le depot lab

2) il n'est pas très propre car on initialise i à 0 et ensuite à 1

3) pensez-vous qu'il nécessaire d'optimiser le code ?  Du moins, enlever l'initialisation de i à 0

après optimisation la taille est diminuée

-rw-r--r-- 1 pcwik apima3  572 Mar 18 15:27 compil1.c.011t.cfg
-rw-r--r-- 1 pcwik apima3 2051 Mar 18 15:27 compil1.c.011t.cfg.dot
-rw-r--r-- 1 pcwik apima3  309 Mar 18 15:42 compil1.c.169t.optimized
-rw-r--r-- 1 pcwik apima3 1605 Mar 18 15:42 compil1.c.169t.optimized.dot



////////////////////////////////////////////////////////////////////////////////////////// Chaine de compilation 2/5 //////////////////////////////////////////////////////////////////////////////////////////

gcc :

@3      var_decl         name: @6       type: @7       scpe: @8

@6      identifier_node  strg: i        lngt: 1

@11     modify_expr      type: @7       op 0: @3       op 1: @28
@12     modify_expr      type: @7       op 0: @3       op 1: @29

ci-dessus les deux lignes où i est mis à 0 puis à 1

et avec clang :

VarDecl 0x2c529d0 <col:1, col:5> col:5 used i 'int'
    |-BinaryOperator 0x2c52a88 <line:7:1, col:3> 'int' '='
    | |-DeclRefExpr 0x2c52a40 <col:1> 'int' lvalue Var 0x2c529d0 'i' 'int'
    | `-IntegerLiteral 0x2c52a68 <col:3> 'int' 0
    |-ForStmt 0x2c53d70 <line:8:1, line:4:41>
    | |-BinaryOperator 0x2c52af8 <line:8:5, col:7> 'int' '='
    | | |-DeclRefExpr 0x2c52ab0 <col:5> 'int' lvalue Var 0x2c529d0 'i' 'int'
    | | `-IntegerLiteral 0x2c52ad8 <col:7> 'int' 1
    
    
    
    
//////////////////////////////////////////////////////////////////////////////////////////// Chaine de compilation 3/5 ) ////////////////////////////////////////////////////////////////////////////////////////////////////

 
dans quel segment mémoire se trouve la variable i ? Elle se trouve dans la pile (virtual-stack-vars)

à quelle adresse se trouve la variable i ? La variable i se trouve à l'adresse contenue dans le registre 54 moins 4 octets.

(insn 5 4 6 3 (set (mem/c/i:SI (plus:SI (reg/f:SI 54 virtual-stack-vars)
                (const_int -4 [0xfffffffffffffffc])) [0 i+0 S4 A32])
                

listez les instructions implantant l'instruction for : 


mise à 1 de i : instruction 6

(insn 6 5 7 3 (set (mem/c/i:SI (plus:SI (reg/f:SI 54 virtual-stack-vars)
                (const_int -4 [0xfffffffffffffffc])) [0 i+0 S4 A32])
        (const_int 1 [0x1])) prog-cpp.c:5 -1
     (nil))
     
     
l'incrementation de 1 : instruction 15

(insn 15 14 16 4 (parallel [
            (set (mem/c/i:SI (plus:SI (reg/f:SI 54 virtual-stack-vars)
                        (const_int -4 [0xfffffffffffffffc])) [0 i+0 S4 A32])
                (plus:SI (mem/c/i:SI (plus:SI (reg/f:SI 54 virtual-stack-vars)
                            (const_int -4 [0xfffffffffffffffc])) [0 i+0 S4 A32])
                    (const_int 1 [0x1])))
            (clobber (reg:CC 17 flags))
        ]) prog-cpp.c:5 -1
     (nil))

la comparaison avec 10 : instruction 19

(insn 19 17 20 5 (set (reg:CCGC 17 flags)
        (compare:CCGC (mem/c/i:SI (plus:SI (reg/f:SI 54 virtual-stack-vars)
                    (const_int -4 [0xfffffffffffffffc])) [0 i+0 S4 A32])
            (const_int 10 [0xa]))) prog-cpp.c:5 -1
     (nil))

le jump : instruction 20

(jump_insn 20 19 21 5 (set (pc)
        (if_then_else (le (reg:CCGC 17 flags)
                (const_int 0 [0]))
            (label_ref 18)
            (pc))) prog-cpp.c:5 -1
     (nil)
     
     
il jump à 18 que l'on retrouve au dessus

(code_label 18 8 9 4 3 "" [1 uses])


quels sont les registres utilisés pour le for ? les registres 54 (i) et 17 

(insn 19 17 20 5 (set (reg:CCGC 17 flags)
        (compare:CCGC (mem/c/i:SI (plus:SI (reg/f:SI 54 virtual-stack-vars)


Comment est stocké le format du printf ? ?pas bien compris la question?

le printf est stocké dans une fonction à l'adresse 0xb7242f00 ?



/////////////////////////////////////////////////////////////////////////////////////// 4/5 ///////////////////////////////////////////////////////////////////////////

Le code du petit programme en assembleur (64 bits) :

.file   "tramedepile.c"
        .section        .rodata
.LC0:
        .string "a+b=%d\n"
        .text
        .globl  addition
        .type   addition, @function
addition:
.LFB0:                                                                                                                                        
        .cfi_startproc                                                                                                                        
        pushq   %rbp                                                                                                                          
        .cfi_def_cfa_offset 16                                                                                                                
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        subq    $32, %rsp
        movl    %edi, -20(%rbp)
        movl    %esi, -24(%rbp)
        movl    -20(%rbp), %edx
        movl    -24(%rbp), %eax
        addl    %edx, %eax
        movl    %eax, -4(%rbp)
        movl    -4(%rbp), %eax
        movl    %eax, %esi
        movl    $.LC0, %edi
        movl    $0, %eax
        call    printf
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   addition, .-addition
        .globl  main
        .type   main, @function
main:
.LFB1:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $1, %esi
        movl    $1, %edi
        call    addition
        movl    $0, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE1:
        .size   main, .-main
        .ident  "GCC: (Debian 4.9.2-10) 4.9.2"
        .section        .note.GNU-stack,"",@progbits
        
        
rip (8 octets)
rpb (8 octets)
eax/1 (4 octets)
.. (4 octets)
.. (4 octets)
.. (4 octets)
edi/1 (4 octets)
esi/1 (4 octets)
.. (4 octets)
        
        
        
        
        
        
en (normalement) 32 bits :

.file   "tramedepile32.c"
        .section        .rodata
.LC0:
        .string "a+b=%d\n"
        .text
.globl addition
        .type   addition, @function
addition:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $40, %esp
        movl    12(%ebp), %eax
        movl    8(%ebp), %edx
        leal    (%edx,%eax), %eax
        movl    %eax, -12(%ebp)
        movl    $.LC0, %eax
        movl    -12(%ebp), %edx
        movl    %edx, 4(%esp)
        movl    %eax, (%esp)
        call    printf
        leave
        ret
        .size   addition, .-addition
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        andl    $-16, %esp
        subl    $16, %esp
        movl    $1, 4(%esp)
        movl    $1, (%esp)
        call    addition
        movl    $0, %eax
        leave
        ret
        .size   main, .-main
        .ident  "GCC: (Debian 4.4.5-8) 4.4.5"
        .section        .note.GNU-stack,"",@progbits