Comportamiento del epílogo de funciones desde GCC 4.9.0

2

Usaré el siguiente código C para explicar mi pregunta:

#include <stdio.h>

int main(void) {
  printf("foo\n");
  return 0;
}

Antes de GCC 4.9.0, desmontarlo produce:

.LC0:
        .string "foo"
main:
        push    ebp
        mov     ebp, esp
        and     esp, -16
        sub     esp, 16
        mov     DWORD PTR [esp], OFFSET FLAT:.LC0
        call    puts
        mov     eax, 0
        leave
        ret

Sin embargo, desde GHC 4.9.0, el resultado es como:

.LC0:
        .string "foo"
main:
        lea     ecx, [esp+4]
        and     esp, -16
        push    DWORD PTR [ecx-4]
        push    ebp
        mov     ebp, esp
        push    ecx
        sub     esp, 4
        sub     esp, 12
        push    OFFSET FLAT:.LC0
        call    puts
        add     esp, 16
        mov     eax, 0
        mov     ecx, DWORD PTR [ebp-4]
        leave
        lea     esp, [ecx-4]
        ret

¿Alguien sabe por qué se toma esta modificación?

    
pregunta Marronnier 10.03.2018 - 06:43
fuente

0 respuestas

Lea otras preguntas en las etiquetas