我写了一个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

通常在结束语中,我们应该加上20,因为在开始语中,我们是20。
那么堆栈帧还在吗?
还是我错过了一个关键点?
我还有一个关于主要功能的问题。正常情况下,函数通常是“调用”的,但它在程序集代码中发生在哪里?
提前谢谢你。

最佳答案

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

关于c - stackframe不会被淘汰吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50493372/

10-11 19:00