• # À cause des accès aligné par les instructions en asm

    Posté par . En réponse au message probleme de compréhension sur l'alignement.. Évalué à 4. Dernière modification le 12 septembre 2019 à 16:54.

    En demandant à gcc de générer l'assembleur d'un truc qui itère sur des tableaux de A ou B, tu verras pourquoi :

    struct A {
     int m_value;
     char c;
    };
    struct B{
     int m_value;
     char c;
    } __attribute__((packed));
    void foo(struct A *a, int size)
    {
     int i;
     for (i = 0 ; i < size ; i++) {
     a[i].c = 66;
     a[i].m_value = 5555;
     }
    }
    void bar(struct B *b, int size)
    {
     int i;
     for (i = 0 ; i < size ; i++) {
     b[i].c = 66;
     b[i].m_value = 5555;
     }
    }
    gcc -O0 -S prout.c -o prout.s
    foo:
    .LFB0:
     .cfi_startproc
     pushq %rbp
     .cfi_def_cfa_offset 16
     .cfi_offset 6, -16
     movq %rsp, %rbp
     .cfi_def_cfa_register 6
     movq %rdi, -24(%rbp)
     movl %esi, -28(%rbp)
     movl $0, -4(%rbp)
     jmp .L2
    .L3:
     movl -4(%rbp), %eax
     cltq
     leaq 0(,%rax,8), %rdx
     movq -24(%rbp), %rax
     addq %rdx, %rax
     movb $66, 4(%rax)
     movl -4(%rbp), %eax
     cltq
     leaq 0(,%rax,8), %rdx
     movq -24(%rbp), %rax
     addq %rdx, %rax
     movl $5555, (%rax)
     addl $1, -4(%rbp)
    .L2:
     movl -4(%rbp), %eax
     cmpl -28(%rbp), %eax
     jl .L3
     nop
     popq %rbp
     .cfi_def_cfa 7, 8
     ret
     .cfi_endproc
    .LFE0:
     .size foo, .-foo
     .globl bar
     .type bar, @function
    bar:
    .LFB1:
     .cfi_startproc
     pushq %rbp
     .cfi_def_cfa_offset 16
     .cfi_offset 6, -16
     movq %rsp, %rbp
     .cfi_def_cfa_register 6
     movq %rdi, -24(%rbp)
     movl %esi, -28(%rbp)
     movl $0, -4(%rbp)
     jmp .L5
    .L6:
     movl -4(%rbp), %eax
     movslq %eax, %rdx
     movq %rdx, %rax
     salq $2, %rax
     addq %rax, %rdx
     movq -24(%rbp), %rax
     addq %rdx, %rax
     movb $66, 4(%rax)
     movl -4(%rbp), %eax
     movslq %eax, %rdx
     movq %rdx, %rax
     salq $2, %rax
     addq %rax, %rdx
     movq -24(%rbp), %rax
     addq %rdx, %rax
     movl $5555, (%rax)
     addl $1, -4(%rbp)
    .L5:
     movl -4(%rbp), %eax
     cmpl -28(%rbp), %eax
     jl .L6
     nop
     popq %rbp
     .cfi_def_cfa 7, 8
     ret

    C'est pourquoi il faut aligner correctement les champs des structures ou de n'utiliser les attributs d'alignement que si on n'a pas le choix ...

    De mon temps, c'était plus facile de lire l'assembleur produit par gcc, (c'était du 32 bits) !