-
-
汇编角度理解指针(指针作为函数的参数)
-
发表于: 2022-1-11 11:35 5421
-
一、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 |
- dword ptr [ebp-8] 表示 result
- 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 |
- mov ecx,dword ptr [ebp+10h] 相当于: ecx = result (result是指针类型)
- mov dword ptr [ecx],eax 相当于: *result = eax
四、总结:
- 任何变量在汇编中都是以地址形式存在的
- 普通变量只需要直接取地址中的数据就可以了。需要以指针类型,因为指针=地址+大小,这样才能获取正确的数据。
- 一级指针需要取地址中的数据作为地址,再次取地址中的数据就可以了
- N级指针需要取取地址中的数据作为地址*N次,再次取地址中的数据就可以了
赞赏
他的文章
- 重新认识线程sleep 998
- [原创]CPU爆高,程序卡顿分析 1733
- [原创]再战堆栈损坏:Critical error detected c0000374 1286
- [原创]在无用的堆栈中分析DLL版本错误 1335
- [原创]小白也能通过特征码定位源码 2801
看原图
赞赏
雪币:
留言: