前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《coredump问题原理探究》Linux x86版3.7节栈布局之返回值

《coredump问题原理探究》Linux x86版3.7节栈布局之返回值

作者头像
血狼debugeeker
发布2018-09-20 14:30:55
3640
发布2018-09-20 14:30:55
举报
文章被收录于专栏:debugeeker的专栏debugeeker的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1344454

虽然在x86里,返回值并不是通过栈来传递。但返回值也是调用约定的一个知识点。而且,对于函数来说,有入应该有出,入就是参数,出就是返回值。但返回值有什么特征呢?

看一下例子:

代码语言:javascript
复制
int funcA()
{   
     return 1;
}   
 
int funcB()
{   
     return 2;
}   
 
int main()
{   
     return funcA() + funcB();
}   

看一下funcA和funcB的汇编:

代码语言:javascript
复制
(gdb) disassemble funcA
Dump of assembler code for function _Z5funcAv:
   0x08048470 <+0>:     push   %ebp
   0x08048471 <+1>:     mov    %esp,%ebp
   0x08048473 <+3>:     mov    $0x1,%eax
   0x08048478 <+8>:     pop    %ebp
   0x08048479 <+9>:     ret    
End of assembler dump.
代码语言:javascript
复制
(gdb) disassemble funcB
Dump of assembler code for function _Z5funcBv:
   0x0804847a <+0>:     push   %ebp
   0x0804847b <+1>:     mov    %esp,%ebp
   0x0804847d <+3>:     mov    $0x2,%eax
   0x08048482 <+8>:     pop    %ebp
   0x08048483 <+9>:     ret    
End of assembler dump.

可以看到,funcA函数除去函数开头特征指令和结尾指令之外,只有一条指令

代码语言:javascript
复制
   0x08048473 <+3>:     mov    $0x1,%eax

也就是说,这条指令是由return1这句代码生成。由于返回值是1,从汇编看,是把返回值放入到eax寄存器里。

而funcB也是这样,只有一条指令:

代码语言:javascript
复制
   0x0804847d <+3>:     mov    $0x2,%eax

是由代码生成的。

从上面可以看到,在x86中,返回值是通过eax寄存器来传递的。

PS:下一节将讲述如何定位“??”栈的方法,敬请期待

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013年01月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档