吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 624|回复: 11
收起左侧

[讨论] 关于平栈的问题

[复制链接]
Yifan2007 发表于 2024-5-10 06:19
平栈指的是还原栈帧吗?

那初始的栈是谁给的呢?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

dizzy0001 发表于 2024-5-10 10:33
我也不知道,所以去搜了一下,这是网上说的:

平栈通常指的不是还原栈帧,而是调整栈指针(ESP)的过程,以确保栈空间被正确管理。初始的栈空间是由操作系统在进程创建时分配的。

平栈操作通常发生在函数调用和返回的过程中,它涉及到栈指针的调整,以保证栈的平衡。在函数调用过程中,会将返回地址、函数参数等信息保存到栈上,这时栈指针会向下增长(向低地址方向)。函数执行完毕后,通过retn指令或其他等效的操作来“平栈”,即恢复栈指针到调用函数前的状态。

至于栈空间的初始化,当一个程序启动时,操作系统会为该进程分配一块内存区域用作栈。这块栈空间用来存储临时变量、函数调用的信息等。每个线程都有自己的栈空间,而这个初始的栈空间大小是可以设置的,并且在某些情况下可以在运行时动态扩展或缩减。
cndml 发表于 2024-5-15 08:48
Yifan2007 发表于 2024-5-14 22:30
好的谢谢大佬,问个弱智的问题,栈堆里面每行应该是+4吧

栈本质上也是一块内存,普通的内存操作指令该遵守的规则也要遵守。专用的栈操作指令是有内存对齐规则的,个别汇编指令也有内存对齐要求。你说的每行几个字节,这应该是指32位程序栈地址操作要4字节对齐,64位要8字节对齐,这主要是内存读取效率的问题。这是操作系统制定的程序编译规则,你也可以不遵守,但是你自己的程序任性完以后交给系统时,记得遵守规则。
404错误 发表于 2024-5-10 09:27
用完放回去就行了,一开始谁放哪儿的不用管。
 楼主| Yifan2007 发表于 2024-5-10 22:12
404错误 发表于 2024-5-10 09:27
用完放回去就行了,一开始谁放哪儿的不用管。

感谢大佬解惑,那栈堆里面的地址都是一行一行+4吧
cndml 发表于 2024-5-13 14:03
计算机执行call 指令的时候,系统会把返回地址压入栈地址,而ret指令会从栈顶取出返回地址,并把地址赋值给指令指针寄存器。平栈就是指的call调用的子程序在返回前要恢复栈指针,否则,程序会异常终止。
 楼主| Yifan2007 发表于 2024-5-13 23:03
cndml 发表于 2024-5-13 14:03
计算机执行call 指令的时候,系统会把返回地址压入栈地址,而ret指令会从栈顶取出返回地址,并把地址赋值给 ...

不止是call和ret mov,add,push,pop都可以吧
cndml 发表于 2024-5-14 08:55
Yifan2007 发表于 2024-5-13 23:03
不止是call和ret mov,add,push,pop都可以吧

平栈说的是一种编程调用规则,比如stdcall  必须由被调用者返回前平栈,而fastcall由调用者返回后平栈。至于add esp  push pop 指令只是栈操作指令,正是由于这些栈操作指令的执行,调用返回前才需要平栈。
 楼主| Yifan2007 发表于 2024-5-14 22:30
cndml 发表于 2024-5-14 08:55
平栈说的是一种编程调用规则,比如stdcall  必须由被调用者返回前平栈,而fastcall由调用者返回后平栈。 ...

好的谢谢大佬,问个弱智的问题,栈堆里面每行应该是+4吧
 楼主| Yifan2007 发表于 2024-5-15 22:03
cndml 发表于 2024-5-15 08:48
栈本质上也是一块内存,普通的内存操作指令该遵守的规则也要遵守。专用的栈操作指令是有内存对齐规则的, ...

谢谢大哥,以后有问题发悬赏请教你
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 18:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表