文档章节

【汇编】C++ 函数调用之——有参有返回调用

Micooz
 Micooz
发布于 2013/07/27 12:07
字数 527
阅读 174
收藏 2

大多数函数都通过return语句返回一个值,那么被调函数是如何返回的,主调函数又是如何接受的呢?下面让我们来一探究竟。

有测试代码:

int func(int a){
	return a+1;
}

int main(int argc,char *argv[])
{
	//call func
	int x;
	x=func(10);
	return 0;
}
这段代码很简单,调用函数func向其传递参数10,然后函数返回10+1=11,并保存到变量x中。

对应有汇编代码:

//call func
	int x;
	x=func(10);
001A142E  push        0Ah  
001A1430  call        001A11F4  
001A1435  add         esp,4  
001A1438  mov         dword ptr [ebp-8],eax

正如前几篇所讲的函数调用,这里的汇编流程几乎和前面一样,只是这里要接受一个返回值。

重点在最后一个mov指令,他将寄存器eax的内容传送进内存单元[ebp-8],这个内存单元在main的栈内,其实就是变量x,这个mov显然是为x赋值,赋的是eax。

可以猜测,函数func的返回值是放在了寄存器eax中。

下面为了验证上面的猜想,我们看看func的汇编实现:

return a+1;
001A13EE  mov         eax,dword ptr [ebp+8]  
001A13F1  add         eax,1
内存单元[ebp+8]在函数func参数表中,即是参数a,mov指令将参数a传送到eax中

add指令将eax的内容加1,似乎并没有所谓的return返回,其实真正意义上的返回是通过ret指令实现的,ret指令将进行一个pop ip;执行之后就返回到了调用func的下一条指令的地方。

现在应该容易理解了,自定义函数的返回值一般是放在eax中的,其实早在main函数分析的时候就提到过:

    return 0;
//将返回值eax清空
00B413BE  xor         eax,eax 

函数通过return语句只能返回一个值,这个值大多数情况下放在eax中。所以在调用别的函数时,只要调用完成之后及时把eax的内容取出来就行了。

© 著作权归作者所有

共有 人打赏支持
Micooz
粉丝 41
博文 34
码字总数 51094
作品 1
其它
其他
私信 提问
引用传递的一个问题,想不通,先留在BLOG里,以后消灭

执行下面一段代码 #include "stdafx.h" void swap(int a ,int b){int *tmp;tmp=a;a=b;b=tmp;} int& swap2(int& a ,int& b){int tmp;tmp=a;a=b;b=tmp;return a;} void main(){int a,b;a=100;b......

yeyelei
2012/04/16
0
0
C++复制构造函数以及赋值操作符

当定义一个新类型的时候,需要显式或隐式地指定复制、赋值和撤销该类型的对象时会发生什么——这是通过定义特殊成员:复制构造函数、赋值操作符和析构函数来达到的。如果没有显式定义复制构造...

风筝Fergus
2013/04/21
0
0
深入分析golang多值返回以及闭包的实现

一、前言 golang有很多新颖的特性,不知道大家的使用的时候,有没想过,这些特性是如何实现的?当然你可能会说,不了解这些特性好像也不影响自己使用golang,你说的也有道理,但是,多了解底...

万建宁
07/17
0
0
探讨“临时对象”(temporary object)

MSDN中对VS2012版本的临时对象的说明如下: 在某些情况下,编译器有必要产生临时对象。 当初始化一个常量引用(const reference)时,如果给定的初始化对象类型与目标引用类型不同(但是两者...

zssure_thu
2012/07/01
0
0
C语言/C++编程学习,轻松解决C++函数重载

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mariadb二进制包安装,Apache安装

安装mariadb 下载二进制包并解压 [root@test-a src]# wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.t......

野雪球
7分钟前
0
0
ConcurrentHashMap 高并发性的实现机制

ConcurrentHashMap 的结构分析 为了更好的理解 ConcurrentHashMap 高并发的具体实现,让我们先探索它的结构模型。 ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEnt...

TonyStarkSir
今天
3
0
大数据教程(7.4)HDFS的java客户端API(流处理方式)

博主上一篇博客分享了namenode和datanode的工作原理,本章节将继前面的HDFS的java客户端简单API后深度讲述HDFS流处理API。 场景:博主前面的文章介绍过HDFS上存的大文件会成不同的块存储在不...

em_aaron
昨天
2
0
聊聊storm的window trigger

序 本文主要研究一下storm的window trigger WindowTridentProcessor.prepare storm-core-1.2.2-sources.jar!/org/apache/storm/trident/windowing/WindowTridentProcessor.java public v......

go4it
昨天
6
0
CentOS 生产环境配置

初始配置 对于一般配置来说,不需要安装 epel-release 仓库,本文主要在于希望跟随 RHEL 的配置流程,紧跟红帽公司对于服务器的配置说明。 # yum update 安装 centos-release-scl # yum ins...

clin003
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部