|
发表于 2016-4-25 09:13:14
|
显示全部楼层
- void fun(char param[])
- {
- printf("%s\n", param); // 这里取得是传入的参数 的存储地址
- printf("%s\n", ¶m); // 这里取得是传入的参数 的堆栈地址
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- char arr[100] = "Hello";
- printf("%s\n", arr);
- printf("%s\n", &arr); // arr是局部变量 地址固定
- fun(arr);
- return 0;
- }
复制代码
main函数中反汇编:
- printf("%s\n", arr);
- 0030141B mov esi,esp
- 0030141D lea eax,[arr]
- 00301420 push eax
- 00301421 push 305860h
- 00301426 call dword ptr ds:[3092C8h]
- 0030142C add esp,8
- 0030142F cmp esi,esp
- 00301431 call __RTC_CheckEsp (0301145h)
- printf("%s\n", &arr);
- 00301436 mov esi,esp
- 00301438 lea eax,[arr]
- 0030143B push eax
- 0030143C push 305860h
- 00301441 call dword ptr ds:[3092C8h]
- 00301447 add esp,8
- 0030144A cmp esi,esp
- 0030144C call __RTC_CheckEsp (0301145h)
复制代码
fun函数中反汇编结果:
- printf("%s\n", param);
- 00E413FE mov esi,esp
- 00E41400 mov eax,dword ptr [param]
- 00E41403 push eax
- 00E41404 push 0E45858h
- 00E41409 call dword ptr ds:[0E492C8h]
- 00E4140F add esp,8
- 00E41412 cmp esi,esp
- 00E41414 call __RTC_CheckEsp (0E4114Ah)
- printf("%s\n", ¶m);
- 00E41419 mov esi,esp
- 00E4141B lea eax,[param]
- 00E4141E push eax
- 00E4141F push 0E45858h
- 00E41424 call dword ptr ds:[0E492C8h]
- 00E4142A add esp,8
- 00E4142D cmp esi,esp
- 00E4142F call __RTC_CheckEsp (0E4114Ah)
复制代码
如果懂汇编,就不用看下边了,如果没学过,那就稍微理解一下下边这张图:
有什么问题,再讨论。
|
|