|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这是测试代码
这是测试代码,对应的反汇编程序如下图所示:这是main函数的反汇编
这是main函数的反汇编
。
其中:
.text:00401048 lea eax, [ebp+var_30]
.text:0040104B push eax
.text:0040104C call sub_401005
是把main函数栈帧中,地址为ebp-0x30(其中var_30为-30)传递给eax,把eax压栈后调用函数sub_401005.也就是test函数,反汇编如下所示:
其中:
mov eax, [ebp+arg_0] //获取参数,也就是main函数ebp-0x30处的地址
mov ecx, [ebp+var_10]
mov [eax], ecx //以下是往地址ebp-0x30处的地址复制数据
mov edx, [ebp+var_C]
mov [eax+4], edx
mov ecx, [ebp+var_8]
mov [eax+8], ecx
mov edx, [ebp+var_4]
mov [eax+0Ch], edx
mov eax, [ebp+arg_0] //eax保存着缓冲区地址,即ebp-0x30处
再回到main函数:
.text:00401054 mov ecx, [eax] //以下是将eax指向的内容复制到main函数地址为ebp-0x20处的临时缓冲区
.text:00401056 mov [ebp+var_20], ecx
.text:00401059 mov edx, [eax+4]
.text:0040105C mov [ebp+var_1C], edx
.text:0040105F mov ecx, [eax+8]
.text:00401062 mov [ebp+var_18], ecx
.text:00401065 mov edx, [eax+0Ch]
.text:00401068 mov [ebp+var_14], edx
.text:0040106B mov eax, [ebp+var_20] //这边是将临时缓冲区的数据拷贝到main函数地址为ebp-0x04处,也就是真正的变量
.text:0040106E mov [ebp+var_10], eax
.text:00401071 mov ecx, [ebp+var_1C]
.text:00401074 mov [ebp+var_C], ecx
.text:00401077 mov edx, [ebp+var_18]
.text:0040107A mov [ebp+var_8], edx
.text:0040107D mov eax, [ebp+var_14]
.text:00401080 mov [ebp+var_4], eax
在main函数中的来回拷贝是因为Debug版本的原因。可见在main函数中条用test()函数有隐性的传进一个参数:即用来接收返回值的临时缓冲区的地址。更进一步说,会发生两次拷贝,并且分配了多余的临时缓冲区空间。既耗时又耗空间!!
以上是个人的分析,第一次发稿多多指教!!!! |
|