【发布时间】:2016-03-05 20:39:00
【问题描述】:
在许多函数中,函数序言以sub $0x1c,%esp 开头,后来被add $0x1c,%esp 删除。该功能可以简单到几乎什么都不做。然而,这个空间从未被使用过,并且已经成为一种烦恼,因为我需要完全控制我的函数堆栈。知道是什么原因造成的,我该如何删除它?我正在使用-O2 -Wall -c -m32 -fno-stack-protector -fno-defer-pop -fno-builtin -march=i386 进行编译。
【问题讨论】:
-
“我需要完全控制我的函数堆栈” - 好奇:为什么?这正是编译器的用途。
-
一些 ABI 要求调用堆栈上有一些红色区域。您的 ABI 和操作系统是什么?
-
还有对齐的问题。
-
@OliverCharlesworth 我正在编写一个系统调用机制,并在调度之前控制哪些返回地址保留在堆栈中。然后当我尝试返回一个地址时它会变得很麻烦,但是堆栈已被 GCC 修改,我需要在到达“add $0x1c,%esp”之前返回。
-
@Seralize:您不能假设编译器不会更改堆栈指针或修改任何寄存器。如果你需要这样做,你必须在 asm 中编写整个函数,而不是像 inline asm 那样。