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:5 used i 'int' |-BinaryOperator 0x2c52a88 'int' '=' | |-DeclRefExpr 0x2c52a40 'int' lvalue Var 0x2c529d0 'i' 'int' | `-IntegerLiteral 0x2c52a68 'int' 0 |-ForStmt 0x2c53d70 | |-BinaryOperator 0x2c52af8 'int' '=' | | |-DeclRefExpr 0x2c52ab0 'int' lvalue Var 0x2c529d0 'i' 'int' | | `-IntegerLiteral 0x2c52ad8 '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/2 (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 1 (4 octets) 1 (4 octets) eip (4 octets) ebp (4 octets) -- (4 octets) -- (4 octets) eax/2 (4 octets) -- (4 octets) -- (4 octets) -- (4 octets) -- (4 octets) -- (4 octets) edx/2 (4 octets) eax/LCO (4 octets)