C++函数调用栈细节(gdb调试)

本文通过gcc5.4和GDB调试,详细展示了C++函数调用的汇编指令执行过程及寄存器变化。在函数调用时,参数从右到左入栈,但实际入栈顺序在某些情况下并不明显。文章讨论了函数调用细节和GDB调试技巧,并提出参数入栈顺序的疑问。
摘要由CSDN通过智能技术生成


本文目的

 
  之前从其他地方看到过,调用函数时,会把下一条指令地址入栈,再把函数入栈,形参从右到左入栈,出栈顺序相反。但是自己一直也没有观察过。所以本文在gcc5.4下,通过GDB调试,把函数调用时的汇编指令的执行,以及相应寄存器的变换展示出来。这样不光对函数调用的细节更清楚,也能熟悉GDB调试的一些功能。ps:本文调试图片较多。


测试代码

1 #include<stdio.h>
  2 
  3 class A {
   
  4     public:
  5         int f;
  6         int s;
  7 };
  8 
  9 int sum(int l,int r)
 10 {
   
 11     int res =0;
 12     res = l+r;
 13     return res;
 14 }
 15 int main ()
 16 {
   
 17     A a;
 18     a.f = 0x55;
 19     a.s = 0x66;
 20     int res = sum(a.f,a.s);
 21     printf("sum: %d",res);
 22     return 0;
 23 }

汇编代码

NOTICE:
编译环境: gcc 5.4.0 x86_64

在这里插入图片描述
编译加上-g 选项,不加优化。
先使用objdump查看汇编代码,一会gdb调试时还会看到,但只能看到要执行的几行,所以这里先把整体需要的贴出来。

0000000000400526 <sum(int, int)>:
        int f;
        int s;
};

int sum(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值