stackframe不会从堆栈中消除?

时间:2018-05-23 16:33:34

标签: c assembly stackframe

我写了一个单独的c程序,它将输入打印到std输出。然后我将它转换为汇编语言。顺便说一句,我正在使用AT& T语法。

这是简单的C代码。

#include <stdio.h>

int main()
{

int c; 


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

    putchar(c);

}

    return 0;
}

int c是一个局部变量。

然后我将它转换为汇编语言。

.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

通常在epilog中我们应该添加20,因为在prolog中我们subl 20。 那堆栈框架还在吗? 或者我错过了一个关键点?

我对主要功能也有疑问。通常,函数通常被“调用”,但它在汇编代码中会发生什么?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

main标签之后,leal 4(%esp), %ecx%ecx中保存了四个加上堆栈指针。在例程结束时,leal -4(%ecx), %esp将比保存的值少四个写入堆栈指针。这会直接恢复原始值,而不是通过添加减去的数量来实现。