首页
社区
课程
招聘
汇编角度理解指针(指针作为函数的参数)
2022-1-11 11:35 4811

汇编角度理解指针(指针作为函数的参数)

2022-1-11 11:35
4811

一、C++源码部分

1
2
3
4
5
6
7
8
9
10
11
12
13
void func(int a, int b, int* result)
{
  *result = a + b;
}
 
int main()
{
  int result = 0;
  func(2,3,&result);
 
  system("pause");
  return 0;
}

二、函数调用部分,取变量地址作为指针变量传参

1
2
3
4
5
6
7
8
9
  int result = 0;
00B01885  mov         dword ptr [ebp-8],0 
  func(2,3,&result);
00B0188C  lea         eax,[ebp-8
00B0188F  push        eax 
00B01890  push        3 
00B01892  push        2 
00B01894  call        00B01343 
00B01899  add         esp,0Ch
  1. dword ptr [ebp-8] 表示 result
  2. lea eax,[ebp-8] 等同于 eax = (ebp-8), 也可以理解成: eax = &result;

三、 函数实现部分

1
2
3
4
5
  *result = a + b;
00B01821  mov         eax,dword ptr [ebp+8
00B01824  add         eax,dword ptr [ebp+0Ch
00B01827  mov         ecx,dword ptr [ebp+10h
00B0182A  mov         dword ptr [ecx],eax
  1. mov ecx,dword ptr [ebp+10h] 相当于: ecx = result (result是指针类型)
  2. mov dword ptr [ecx],eax 相当于: *result = eax

四、总结:

  1. 任何变量在汇编中都是以地址形式存在的
  2. 普通变量只需要直接取地址中的数据就可以了。需要以指针类型,因为指针=地址+大小,这样才能获取正确的数据。
  3. 一级指针需要取地址中的数据作为地址,再次取地址中的数据就可以了
  4. N级指针需要取取地址中的数据作为地址*N次,再次取地址中的数据就可以了

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回