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

{:301_971:}用完放回去就行了,一开始谁放哪儿的不用管。

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 esppush 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
栈本质上也是一块内存,普通的内存操作指令该遵守的规则也要遵守。专用的栈操作指令是有内存对齐规则的, ...

谢谢大哥,以后有问题发悬赏请教你
页: [1] 2
查看完整版本: 关于平栈的问题