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