反汇编——结构体作为局部变量的传参和返回值的本质测试
来源:互联网 发布:2016淘宝开店营业执照 编辑:程序博客网 时间:2024/06/05 16:21
不同编译器生成的结果不同,但本质都是通过寄存器或内存复制,本测试只是为了了解结构体在作为局部变量时的参数传递与返回的本质,实际使用中,最好定义为全局变量
结构体传参:
# include<stdio.h>struct st{char a;short b;int c;int d;int e;};void Function(st s){}int main(int argc, char* argv[]){st s;s.a = 1;s.b = 2;s.c = 3;s.d = 4;s.e = 5;Function(s);return 0;}反汇编:1.vs2017测试结果,使用寄存器传递地址Function(s);008A1740 sub esp,10h 008A1743 mov eax,esp 008A1745 mov ecx,dword ptr [s] 008A1748 mov dword ptr [eax],ecx 008A174A mov edx,dword ptr [ebp-10h] 008A174D mov dword ptr [eax+4],edx 008A1750 mov ecx,dword ptr [ebp-0Ch] 008A1753 mov dword ptr [eax+8],ecx 008A1756 mov edx,dword ptr [ebp-8] 008A1759 mov dword ptr [eax+0Ch],edx 008A175C call Function (08A10A5h) 008A1761 add esp,10h 2.vc++6.0测试结果,直接使用rep stos指令,在内存内复制12: void Function(st s)00401020 push ebp00401021 mov ebp,esp00401023 sub esp,40h00401026 push ebx00401027 push esi00401028 push edi00401029 lea edi,[ebp-40h]0040102C mov ecx,10h00401031 mov eax,0CCCCCCCCh00401036 rep stos dword ptr [edi]00401038 pop edi00401039 pop esi0040103A pop ebx0040103B mov esp,ebp0040103D pop ebp0040103E ret
结构体返回值:
# include<stdio.h>struct st{char a;short b;int c;int d;int e;};st Function(){st s;s.a = 1;s.b = 2;s.c = 3;s.d = 4;s.e = 5;return s;}int main(int argc, char* argv[]){st a = Function();return 0;}反汇编:vs2017测试结果,把Function函数的返回值的地址放在eaxst a = Function();0106171E lea eax,[ebp-104h] //外层函数用来接收返回值的地址01061724 push eax 01061725 call Function (01061366h) 0106172A add esp,4 0106172D mov ecx,dword ptr [eax] 0106172F mov dword ptr [ebp-0ECh],ecx 01061735 mov edx,dword ptr [eax+4] 01061738 mov dword ptr [ebp-0E8h],edx 0106173E mov ecx,dword ptr [eax+8] 01061741 mov dword ptr [ebp-0E4h],ecx 01061747 mov edx,dword ptr [eax+0Ch] 0106174A mov dword ptr [ebp-0E0h],edx 01061750 mov eax,dword ptr [ebp-0ECh] 01061756 mov dword ptr [a],eax 01061759 mov ecx,dword ptr [ebp-0E8h] 0106175F mov dword ptr [ebp-10h],ecx 01061762 mov edx,dword ptr [ebp-0E4h] 01061768 mov dword ptr [ebp-0Ch],edx 0106176B mov eax,dword ptr [ebp-0E0h] 01061771 mov dword ptr [ebp-8],eax
vc++6.0测试结果,把Function函数的返回值的地址放在eax st a = Function();0040D4D8 lea eax,[ebp-30h] //外层函数用来接收返回值的地址0040D4DB push eax0040D4DC call @ILT+20(Function) (00401019)0040D4E1 add esp,40040D4E4 mov ecx,dword ptr [eax]0040D4E6 mov dword ptr [ebp-20h],ecx0040D4E9 mov edx,dword ptr [eax+4]0040D4EC mov dword ptr [ebp-1Ch],edx0040D4EF mov ecx,dword ptr [eax+8]0040D4F2 mov dword ptr [ebp-18h],ecx0040D4F5 mov edx,dword ptr [eax+0Ch]0040D4F8 mov dword ptr [ebp-14h],edx0040D4FB mov eax,dword ptr [ebp-20h]0040D4FE mov dword ptr [ebp-10h],eax0040D501 mov ecx,dword ptr [ebp-1Ch]0040D504 mov dword ptr [ebp-0Ch],ecx0040D507 mov edx,dword ptr [ebp-18h]0040D50A mov dword ptr [ebp-8],edx0040D50D mov eax,dword ptr [ebp-14h]0040D510 mov dword ptr [ebp-4],eax
阅读全文
0 0
- 反汇编——结构体作为局部变量的传参和返回值的本质测试
- 结构体变量作为函数的参数和返回值
- 结构体变量作为函数的参数和返回值 .
- 平台调用P-INVOKE完全掌握, 反汇编细解结构体作为返回值
- 局部变量作为返回值
- 逆向反汇编代码推算C++的局部变量
- 逆向反汇编代码推算C++的局部变量
- 汇编的局部变量
- 汇编的局部变量
- 局部变量的返回
- 基于arm的C++反汇编 结构体和类
- 局部变量作为返回值问题
- 反汇编分析C++的返回值
- 函数返回值—返回局部变量
- 函数返回值—返回局部变量
- 函数返回值—返回局部变量
- 函数返回值—返回局部变量
- 函数返回值—返回局部变量
- UVA 10618
- javase
- 重建二叉树
- Loadrunner的简介
- ccf201312-2
- 反汇编——结构体作为局部变量的传参和返回值的本质测试
- 诗意的栖居于地球之上
- springmvc订阅redis键过期消息通知
- 10创建元素
- 对于色彩编码的简单了解
- 97.5%准确率的深度学习中文分词(字嵌入+Bi-LSTM+CRF)
- C语言 六数码 队列,广搜,map函数
- 用div的contenteditable = true做文本编辑器 光标的设置方法
- DDR内存家族演进史