gpt4 book ai didi

c - stackframe 不会从堆栈中删除?

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:22 26 4
gpt4 key购买 nike

我编写了一个将输入打印到标准输出的 c 程序。然后我把它转换成汇编语言。顺便说一句,我使用的是 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 中我们减去 20。那么堆栈框架还在那里吗?还是我错过了一个关键点?

我还有一个关于 main 函数的问题。通常函数通常被“调用”,但它发生在汇编代码中的什么地方?

提前谢谢你。

最佳答案

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

关于c - stackframe 不会从堆栈中删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50493372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com