通过创建局部变量减少堆栈指针
Decreasing of the stack pointer by creating local variables
为了更好地理解二进制文件,我准备了一个小的c++示例,并使用gdb来反汇编和查找机器码。
main()
函数调用函数func()
:
int func(void)
{
int a;
int b;
int c;
int d;
d = 4;
c = 3;
b = 2;
a = 1;
return 0;
}
项目用g++编译保存调试信息。接下来使用gdb来反汇编源代码。我得到的func()
是这样的:
0x00000000004004cc <+0>: push %rbp
0x00000000004004cd <+1>: mov %rsp,%rbp
0x00000000004004d0 <+4>: movl $0x4,-0x10(%rbp)
0x00000000004004d7 <+11>: movl $0x3,-0xc(%rbp)
0x00000000004004de <+18>: movl $0x2,-0x8(%rbp)
0x00000000004004e5 <+25>: movl $0x1,-0x4(%rbp)
0x00000000004004ec <+32>: mov $0x0,%eax
0x00000000004004f1 <+37>: pop %rbp
0x00000000004004f2 <+38>: retq
现在我的问题是,我希望堆栈指针相对于基指针移动16个字节到较低的地址,因为每个整数值需要4个字节。但是看起来这些值是在没有移动堆栈指针的情况下被放到堆栈上的。
我理解错了什么?这是编译器的问题还是汇编器省略了一些行?
最诚挚的问候,零
你的编译器绝对没有问题。编译器可以自由选择如何编译代码,它选择不修改堆栈指针。它不需要这样做,因为您的函数不调用任何其他函数。如果它确实调用了另一个函数,那么它将需要创建另一个堆栈帧,以便被调用方不会踩到调用方的堆栈帧。
作为一般规则,您应该避免尝试对编译器将如何编译您的代码做出任何假设。例如,编译器可以完全自由地优化掉函数体。
相关文章:
- 从堆栈分配的原始指针构造智能指针
- 使用指针计算堆栈问题的大 O 表示法
- 作为指针注入类后重新创建堆栈对象不好吗?
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 如何按指针查看堆栈跟踪
- 堆栈/帧指针作为外部变量
- 未分配被释放的指针(将堆栈实现为链表时)
- 唯一指针是否在堆或堆栈上分配内存?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 复制堆栈上的成员值或使用指针访问它?
- 堆栈对象的强制转换指针
- 如果堆栈在数字较低的地址增长,为什么指针比较会逆转这种情况?
- C++对自动(堆栈)指针使用运算符删除
- 如果没有指针,如何识别堆栈上的内存?
- 我如何转换一个基于动态的,基于指针的int堆栈,以便将其打印成字符串
- 存储在对象向量上的基于堆栈的指针具有很长的使用寿命
- C++ 堆栈程序 指针问题的 Wsing 数组 新字符[len],其中 len 为 2 创建 16 个字符
- 指向地址和内存堆栈的指针
- c++堆栈被指针损坏