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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/8545160

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

看一下例子:

int funcA()
{   
     return 1;
}   
 
int funcB()
{   
     return 2;
}   
 
int main()
{   
     return funcA() + funcB();
}   

看一下funcA和funcB的汇编:

(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.
(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函数除去函数开头特征指令和结尾指令之外,只有一条指令

   0x08048473 <+3>:     mov    $0x1,%eax

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

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

   0x0804847d <+3>:     mov    $0x2,%eax

是由代码生成的。

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS122-移动混合开发研究院

【自问自答】关于 Swift 的几个疑问

感觉自己给自己释疑,也是一个极为有趣的过程。这次,我还新增了“猜想”一栏,来尝试回答一些暂时没有足够资料支撑的问题。 Swift 版本是:4.0.3。不同版本的...

32960
来自专栏张善友的专栏

ASP.NET SignalR HubPipelineModule

ASP.NET SignalR 1.0 实现的一个特性HubPipeline -实现任何消息incoming和outgoing的拦截。SignalR HubPi...

23170
来自专栏DOTNET

.Net多线程编程—Parallel LINQ、线程池

Parallel LINQ 1 System.Linq.ParallelEnumerable 重要方法概览: 1)public static ParallelQ...

31370
来自专栏FreeBuf

浅析ReDoS的原理与实践

*本文原创作者:MyKings,本文属FreeBuf原创奖励计划,未经许可禁止转载 ReDoS(Regular expression Denial of Ser...

96950
来自专栏服务端技术杂谈

dubbo源码学习笔记----monitor

核心类 public abstract class AbstractMonitorFactory implements MonitorFactory { ...

35080
来自专栏程序员宝库

移除注释的完善思路:真的可以用正则实现?

网上有很多自称能实现移除JS注释的正则表达式,实际上存在种种缺陷。这使人多少有些愕然,也不禁疑惑到:真的可以用正则实现吗?而本篇文章以使用正则移除JS注释为目标...

14430
来自专栏数据小魔方

Julia语言初体验

最近MIT发布的julia 1.0.0版,据传整合了C、Python、R等诸多语言特色,是数据科学领域又一把顶级利器。

2.9K20
来自专栏木木玲

ConcurrentHashMap (JDK7) 详解

47090
来自专栏Spark生态圈

[spark] Shuffle Write解析 (Sort Based Shuffle)

从 Spark 2.0 开始移除了Hash Based Shuffle,想要了解可参考Shuffle 过程,本文将讲解 Sort Based Shuffle。

16120
来自专栏码匠的流水账

聊聊sentinel的DegradeSlot

com/alibaba/csp/sentinel/slots/block/degrade/DegradeSlot.java

16310

扫码关注云+社区

领取腾讯云代金券