好不容易筹了20分,问个函数调用的细节问题,有汇编的。

Kshape 2006-05-10 11:22:51
源代码如下:
//:test.cpp
#include <iostream>
using namespace std;

struct Big{
char buf[100];
long d;
int i;
int a;
float c;
}B,B2;

Big f(Big b)
{
b.i = 100;
return b;
}

int main()
{
B2 = f(B);
system("pause");
}
///:~
--------------------------------------------
如下为B2 = f(B)这句代码的汇编表示:
23: B2 = f(B);
0041B2B4 sub esp,74h
0041B2B7 mov ecx,1Dh
0041B2BC mov esi,offset B (458600h)
0041B2C1 mov edi,esp
0041B2C3 rep movs dword ptr [edi],dword ptr [esi]
0041B2C5 lea eax,[ebp-138h]
0041B2CB push eax
0041B2CC call f (419F19h)
0041B2D1 add esp,78h
0041B2D4 mov ecx,1Dh
0041B2D9 mov esi,eax
0041B2DB lea edi,[ebp-1B4h]
0041B2E1 rep movs dword ptr [edi],dword ptr [esi]
0041B2E3 mov ecx,1Dh
0041B2E8 lea esi,[ebp-1B4h]
0041B2EE mov edi,offset B2 (458678h)
0041B2F3 rep movs dword ptr [edi],dword ptr [esi]

哪位大虾帮忙说明一下上面的汇编的作用好么??注释一下。

等啊!
...全文
118 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenmea00000 2006-05-11
  • 打赏
  • 举报
回复
学习来了~~
Kshape 2006-05-11
  • 打赏
  • 举报
回复
再顶顶,回来看

gernal_dn 2006-05-11
  • 打赏
  • 举报
回复
;为调用f()做准备
0041B2B4 sub esp,74h ; 传递参数(B)的大小是116bytes=100+4+4+4+4
0041B2B7 mov ecx,1Dh ; 116bytes=29×4,在32位系统中,拷贝内存尽量4byte一次传输
0041B2BC mov esi,offset B (458600h) ; 参数B的起点地址
0041B2C1 mov edi,esp ; 设定目标地址,实际上就是stack frame中函数f()内部变量b(是小写字幕的)
0041B2C3 rep movs dword ptr [edi],dword ptr [esi] ; 将调用参数传递过去
0041B2C5 lea eax,[ebp-138h] ; 返回值临时空间的地址
0041B2CB push eax
0041B2CC call f (419F19h) ; 调用函数f()
0041B2D1 add esp,78h ; 调用结束,回复栈结构
0041B2D4 mov ecx,1Dh
0041B2D9 mov esi,eax
0041B2DB lea edi,[ebp-1B4h] ; 将返回值保存在另一个临时空间
0041B2E1 rep movs dword ptr [edi],dword ptr [esi]
0041B2E3 mov ecx,1Dh
0041B2E8 lea esi,[ebp-1B4h]
0041B2EE mov edi,offset B2 (458678h) ; 结果保存在变量B2中(实际上是operator = 这个函数)
0041B2F3 rep movs dword ptr [edi],dword ptr [esi]
; 领教到了罢,拷贝构造函数无所不在,这就是为什么对象在函数调用中喜欢以Big& 形式出现的原因,可以大大提高效率的。顺便提一句,struct也是class。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧