user8862019
user8862019

Reputation:

stackframe dosen't get eliminated from the stack?

I wrote a single c program that prints input to std output. Then I converted it to assembly language. By the way I am using AT&T Syntax.

This is the simple C code.

#include <stdio.h>

int main()
{

int c; 


  while ((c = getchar ()) != EOF) 
    {

    putchar(c);

}

    return 0;
}

int c is a local variable.

Then I converted it to assembly language.

.file   "question_1.c"
    .text
    .globl  main
    .type   main, @function 

//prolog

main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    subl    $20, %esp    // we add 20 bytes to the stack
    jmp .L2
.L3:
    subl    $12, %esp
    pushl   -12(%ebp)
    call    putchar
    addl    $16, %esp
.L2:
    call    getchar
    movl    %eax, -12(%ebp)
    cmpl    $-1, -12(%ebp)
    jne .L3

//assumption this is the epilog
    movl    $0, %eax
    movl    -4(%ebp), %ecx
    leave
    leal    -4(%ecx), %esp
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.9.4-2ubuntu1) 4.9.4"
    .section    .note.GNU-stack,"",@progbits

normally in the epilog we are supposed to addl 20 because in the prolog we subl 20. So the is the stack frame still there? Or am I missing out a crucial point?

I also have a question regarding the main function. Normally functions are normally "called" but where does it happen in the assembly code?

Thank you in advance.

Upvotes: 0

Views: 84

Answers (1)

Eric Postpischil
Eric Postpischil

Reputation: 223329

Just after the main label, leal 4(%esp), %ecx saves four plus the stack pointer in %ecx. At the end of the routine, leal -4(%ecx), %esp writes four less than the saved value to the stack pointer. This directly restores the original value, instead of doing it by adding the amount that was subtracted.

Upvotes: 2

Related Questions